Cara tive falando com o daniel e ele falou não ser possível o q eu estou tentando fazer !! Dá uma olhada, eu descrevi a minha estrututra na mensagem de numero 11.
valeu !!
Cara tive falando com o daniel e ele falou não ser possível o q eu estou tentando fazer !! Dá uma olhada, eu descrevi a minha estrututra na mensagem de numero 11.
valeu !!
Arquivos dentro de um JAR não podem ser acessados via URL ou PATH, somente via getResource.
Olá.
Acredito que o getResource facilita a nossa vida, mas se você souber o caminho do JAR e o path interno você consegue criar um objeto URL que irá conseguir carregar o arquivo dentro do JAR.
Exemplo:
package relatorios.almoxarifado;
import java.io.IOException;
import java.net.URL;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;
/**
* @author juliano.lao
*/
public class Relatorio
{
private static final String configName = "/relatorios/almoxarifado/relatorio.xml";
private Properties status = new Properties();
public Relatorio()
throws InvalidPropertiesFormatException, IOException
{
init(1);
}
public Relatorio(int type)
throws InvalidPropertiesFormatException, IOException
{
init(type);
}
private void init(int type)
throws InvalidPropertiesFormatException, IOException
{
URL config;
switch ( type )
{
case 1 :
System.out.println("Tipo 1");
config = this.getClass().getResource( configName );
System.out.println("Config File : " + config.getFile().replaceAll("%20", " ") );
status.loadFromXML( config.openStream() );
break;
case 2 :
System.out.println("Tipo 2");
config = new URL(
this.getClass().getResource( configName ).getProtocol(),
this.getClass().getResource( configName ).getHost(),
this.getClass().getResource( configName ).getFile().replaceAll("%20", " ") );
System.out.println("Config File : " + config.getFile().replaceAll("%20", " ") );
status.loadFromXML( config.openStream() );
break;
}
}
public URL getFile()
{
return this.getClass().getResource( configName );
}
public void status()
{
System.out.println("Status : " + status);
}
public static void main(String[] args)
throws InvalidPropertiesFormatException, IOException
{
Relatorio rel = new Relatorio();
rel.status();
}
}
Arquivo XML dentro do diretório almoxarifado
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="status">Funcionou</entry>
</properties>
Classe para testar
package teste;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.InvalidPropertiesFormatException;
import relatorios.almoxarifado.Relatorio;
/**
* @author juliano.lao
*/
public class Carregar
{
public Carregar()
{
}
public void load()
{
try
{
System.out.println("");
System.out.println("Load");
Relatorio rel = new Relatorio();
rel.status();
}
catch (InvalidPropertiesFormatException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void reload()
{
try
{
System.out.println("");
System.out.println("Reload");
Relatorio rel = new Relatorio(2);
rel.status();
}
catch (InvalidPropertiesFormatException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void copy(String name)
throws InvalidPropertiesFormatException, IOException
{
File file = new File(name);
FileOutputStream fout = new FileOutputStream(file);
BufferedOutputStream out = new BufferedOutputStream( fout );
Relatorio rel = new Relatorio();
BufferedInputStream in = new BufferedInputStream( rel.getFile().openStream() );
int buf;
while ( (buf=in.read()) != -1 )
{
out.write(buf);
}
out.flush();
out.close();
in.close();
}
public static void main(String[] args)
throws InvalidPropertiesFormatException, IOException
{
Carregar carregar = new Carregar();
carregar.load();
carregar.reload();
carregar.copy("novo.xml");
}
}
Ant
<project name="Relatorios" basedir="." default="jar">
<property name="src.dir" value="src"/>
<property name="bin.dir" value="bin"/>
<property name="jar.relatorio.name" value="Rel.jar"/>
<property name="jar.teste.name" value="Teste.jar"/>
<target name="jar" depends="compile">
<jar destfile="${jar.relatorio.name}">
<fileset dir="${bin.dir}">
<include name="relatorios/**"/>
</fileset>
</jar>
<jar destfile="${jar.teste.name}">
<fileset dir="${bin.dir}">
<include name="teste/**"/>
</fileset>
</jar>
</target>
<target name="compile">
<javac srcdir="${src.dir}" destdir="${bin.dir}" />
</target>
</project>
run.bat
java -cp Teste.jar;Rel.jar teste.Carregar
pause
Resultado dentro do Eclipse
Load
Tipo 1
Config File : /C:/Arquivos de programas/Java/eclipse/workspace/Teste/bin/relatorios/almoxarifado/relatorio.xml
Status : {status=Funcionou}
Reload
Tipo 2
Config File : /C:/Arquivos de programas/Java/eclipse/workspace/Teste/bin/relatorios/almoxarifado/relatorio.xml
Status : {status=Funcionou}
Tipo 1
Config File : /C:/Arquivos de programas/Java/eclipse/workspace/Teste/bin/relatorios/almoxarifado/relatorio.xml
Resultado no console DOS
Load
Tipo 1
Config File : file:/C:/Arquivos de programas/Java/eclipse/workspace/Teste/Rel.jar!/relatorios/almoxarifado/relatorio.xml
Status : {status=Funcionou}
Reload
Tipo 2
Config File : file:/C:/Arquivos de programas/Java/eclipse/workspace/Teste/Rel.jar!/relatorios/almoxarifado/relatorio.xml
Status : {status=Funcionou}
Tipo 1
Config File : file:/C:/Arquivos de programas/Java/eclipse/workspace/Teste/Rel.jar!/relatorios/almoxarifado/relatorio.xml
Acredito que é possível sim acessar um arquivo dentro de um JAR usando URL, eu faço isso nas minhas aplicações para acessar os arquivos XML de configuração e as bibliotecas em DLL e SO.
[]s
Chulao
.