getResourceAsStream()

Pessoal, estou tentando pegar o caminho de um .xml que está dentro de um .jar, no entanto nao consigo. Tive dando uma olhada aqui no forum e provavelmente precisarei dessa linha de codigo abaixo :

InputStream is = getClass().getClassLoader().getResourceAsStream("/relatorios/relatorio.xml");

Minha duvida eh : Como vou pegar, a partir desse código acima, o caminho desse relatorio.xml ?

valeu !!!

Você quer o caminho?
getResource() então.

[quote=danieldestro]Você quer o caminho?
getResource() então.[/quote]

Eu já tentei …

String Diretorio = getClass().getResource("/relatorios//relatorio.xml").getPath();

Mas dá um erro de io, dizendo que não existe o arquivo /relatorios/relatorio.xml

Acho q esse metodo, getResource(), pega o caminho absoluto e no meu caso acho que deveria ser o caminho relativo, pois o relatorio.xml encontra-se num .jar.

valeu !!

Tenta tirar a barra inicial do caminho, ou colocar ponto e barra. Eu sempre apanho com isso.

Já tentei tirar a barra inicial, mas deu erro !! Como seria essa sua sugestao de ponto e barra ???

valeu !!

String Diretorio = getClass().getResource("./relatorios/relatorio.xml").getPath();

Tentei tb, mas não deu certo !!! Cara tu tem certeza que está certo da forma que eu estou fazendo ??

valeu !!

Olha o que eu fiz:

Teste.java

[code]import java.io.*;

public class Teste {
public Teste() {
try {
System.out.println(this.getClass().getResource(“teste.xml”).getPath());
InputStream is = this.getClass().getResourceAsStream(“teste.xml”);
byte b[] = new byte[128];
while( is.read(b) > 0 ) {
System.out.println(new String(b));
}
is.close();
} catch( Exception e ) {
e.printStackTrace();
}
}

public static void main( String[] args ) {
new Teste();
}
}[/code]

MANIFEST.MF

[code]Main-Class: Teste
Classpath:

[/code]

Compilando…

javac Teste.java

Criando JAR…

jar cvfm t.jar MANIFEST.MF Teste.* teste.xml

Rodando…

java -jar t.jar

Funcionou!

Essa tua linha

System.out.println(this.getClass().getResource("teste.xml").getPath());

ta imprimindo o q ?? Seria algo desse tipo :

file:/home/paulo/workspace/Almoxarifado/lib/Relatorio.jar!/relatorios/relatorio.xml

Onde Almoxarifado eh a pasta onde meu projeto foi criado e Relatorio.jar o meu jar que eu quero acessar !
Na minha aplicação eu executo um comando igual ao q está dentro do seu System.out.println(), mas quando eu pego a saida desse comando e passo para uma classe tentar acessar o relatorio.xml retorna um erro dizendo que nao consegue acessar o relatorio.xml.

PS : O q eh aquele Teste. * que vc coloca na hora de criar o jar ??

valeu pela ajuada cara !!!

A única maneira de você pegar o conteúdo do seu XML dentro do JAR é usando o getResourceAsStream(), diretamente NÃO DÁ.

E o Teste.* inclui o Teste.class e o Teste.java.

[quote=danieldestro]A única maneira de você pegar o conteúdo do seu XML dentro do JAR é usando o getResourceAsStream(), diretamente NÃO DÁ.
E o Teste.* inclui o Teste.class e o Teste.java.[/quote]

Daniel, vou dá uma explicada na minha estrutura para vê se o q eu estou tentando fazer é possível. Coloquei Relatorio.class e relatorio.xml dento de Relatorio.jar, a estrutura do Relatorio.jar está assim :

/relatorios/almoxarifado/Relatorio.class
/relatorios/almoxarifado/relatorio.xml

Coloquei Relatorio.jar no classpath e até aqui tudo blz. Agora, para o Relatorio.class executar eu preciso passar como parametro o caminho do relatorio.xml. Estou tentando pegar esse caminho atraves do seguinte comando :

String Diretorio = getClass().getResource("/relatorios/almoxarifado/relatorio.xml").getPath();

Ai, ao passar esse caminho como parametro, ele dá um erro dizendo q nao consegue encontrar o relatorio.xml.
Isso q eu estou tentando fazer eh possivel nao eh ??

valeu !

Já que está no mesmo nível (diretório) do seu xml:
String Diretorio = getClass().getResource(“relatorio.xml”).getPath();

[quote=danieldestro]Já que está no mesmo nível (diretório) do seu xml:
String Diretorio = getClass().getResource(“relatorio.xml”).getPath();
[/quote]
Tentei tb , mas nao deu certo ! Deu esse erro : java.lang.NullPointerException

valeu !

Cara, se antes não dava null pointer é pq achava o arquivo no seu JAR.
E como eu disse, não é possível acessar (ler) o arquivo do modo que estava pensando. Para pegar o conteúdo TEM QUE SER com getResourceAsStream(), ou então deixa o arquivo fora do jar.

Eu não quero pegar o conteudo, mas sim o caminho !! Depois que eu pegar o caminho eu vou passar para o Relatorio.class que de posse do caminho poderar compilar e executar o relatorio.xml.

eh isso mesmo ??

Para finalizar. ISSO NÃO É POSSÍVEL.

Passa o conteúdo do XML então, seja em InputStream ou String ou byte, ou sei-lá-o-que.

Valeu cara pela ajuda !! Vou ver outra forma aqui de fazer ! No meu caso nao darai certo passar o conteudo nao, poi s meu .class tem que receber o caminho.

valeu !!

Eu uso assim na minha aplicação.

package br.com.system.server;

import ....;

class Server
{
...
URL url = this.getClass().getResource( "/br/com/system/log4j.xml" );
...
}

Eu tive problemas para colocar outros JARs e DLLs dentro do JAR de execução, o getResource acessava mas não conseguia acessar. Eu resolvi criando um rotina para copiar esses arquivos para o TEMP e dai usá-los.

[]s

Chulao

Na verdade Chulao eu tava querendo recuperar o caminho de dentro de um .jar e não de um diretorio como vc está fazendo, mas de qq forma valeu cara !!

falou !!

Deixa eu explicar o que eu estou fazendo para ver se é isso mesmo que você quer.

Eu tenho o JAR da minha aplicação, dentro dela eu tenho uma pasta lib onde eu tenho alguns JAR’s e DLL’s. Eu tenho uma outra estrutura br/com/system/… que é o meu package e dentro do meu package eu tenho vários arquivos XML’s de configuração espalhados.

O getResource sempre funcionou quando eu estava desenvolvendo a aplicação (Eclipse), mas quando eu empacotei o JAR eu tive o mesmo problema.

Para carregar os arquivos XML’s eu não tive problemas, eu simplesmente uso

URL file = this.getClass().getResource("/br/com/system/log4j.xml");

O que pode apresentar problemas é que se você estiver rodando o JAR em um diretório que contenha espaços, como, “arquivos de programas” ele vai retornar um endereço que não vai funcionar (pelo menos eu não consegui), então eu uso

getResource("..").getFile().replaceAll("%20", " ");

Carregar arquivos dentro do JAR funciona sim. Eu tenho DLL’s e JAR’s de outros módulos todos eles empacotados juntos e a minha aplicação reconhece todos eles, alguns diretos outros através do truque de copiar para o temp.

Qualque coisa me passe o código e eu tento ver aqui.

[]s

Chulao