Preciso chamar um aquivo.jar a partir de uma classe, mas como posso fazer isso?
Por exemplo, tenho uma classe chamanda “Cadastro.java” e um jar chamado “cliente.jar”, como posso fazer para utilizar as classes que estão no “cliente.jar” através da classe principal “Cadasro.java” ?
Existem métodos para você trabalhar com jars de dentro de uma outra classe e tal, mas se tudo que você quer é utilizar uma classe que está dentro de um jar, basta que este jar esteja no classpath.
P
page
Está classe foi apenas de exemplo, pois na verdade precisarei utilizar várias classes. E ficar colocando no classpath vai ser meio trabalhoso, principalmente para o suporte.
Será que não tens um exemplo básico de como chama-la?
Obrigado.
Bani
Até onde eu sei, você não consegue encontrar uma classe se você não especificar o lugar onde ela está no classpath.
E talvez eu não tenha sido clara, mas não é a classe em si que você coloca no classpath, e sim o JAR.
Dependendo do tipo de aplicação que você estiver fazendo, é possível criar um arquivo (.bat no Windows ou um shell script no Linux) que configure o classpath para aquela sessão em que você está rodando a aplicação, o que facilitaria o suporte.
smota
Ola,
Tenho uma classe chamada JarResources que me permite carregar e utilizar recursos contidos num JAR. Estou usando para emcapsular imagens, mas com classes é a mesma coisa. (exceto porque voce vai usar reflexão pra instanciar as classes).
Ela precisa ser melhorada pq ela armazena em memoria todo o conteudo em uma hashTable … o melhor seria ela carregar apenas ao ser solicitado um recurso …
Ah, nao eh minha, eh de um artigo em algum lugar da net.
importjava.io.*;importjava.util.*;importjava.util.zip.*;/** * JarResources: JarResources maps all resources included in a * Zip or Jar file. Additionaly, it provides a method to extract one * as a blob. */publicfinalclassJarResources{// external debug flagpublicbooleandebugOn=false;// jar resource mapping tablesprivateHashtablehtSizes=newHashtable();privateHashtablehtJarContents=newHashtable();// a jar fileprivateStringjarFileName;/** * creates a JarResources. It extracts all resources from a Jar * into an internal hashtable, keyed by resource names. * @param jarFileName a jar or zip file */publicJarResources(StringjarFileName){this.jarFileName=jarFileName;init();}/** * Extracts a jar resource as a blob. * @param name a resource name. */publicbyte[]getResource(Stringname){return(byte[])htJarContents.get(name);}/** * initializes internal hash tables with Jar file resources. */privatevoidinit(){try{// extracts just sizes only. ZipFilezf=newZipFile(jarFileName);Enumeratione=zf.entries();while(e.hasMoreElements()){ZipEntryze=(ZipEntry)e.nextElement();if(debugOn){System.out.println(dumpZipEntry(ze));}htSizes.put(ze.getName(),newInteger((int)ze.getSize()));}zf.close();// extract resources and put them into the hashtable.FileInputStreamfis=newFileInputStream(jarFileName);BufferedInputStreambis=newBufferedInputStream(fis);ZipInputStreamzis=newZipInputStream(bis);ZipEntryze=null;while((ze=zis.getNextEntry())!=null){if(ze.isDirectory()){continue;}if(debugOn){System.out.println("ze.getName()="+ze.getName()+","+"getSize()="+ze.getSize());}intsize=(int)ze.getSize();// -1 means unknown size. if(size==-1){size=((Integer)htSizes.get(ze.getName())).intValue();}byte[]b=newbyte[(int)size];intrb=0;intchunk=0;while(((int)size-rb)>0){chunk=zis.read(b,rb,(int)size-rb);if(chunk==-1){break;}rb+=chunk;}// add to internal resource hashtablehtJarContents.put(ze.getName(),b);if(debugOn){System.out.println(ze.getName()+" rb="+rb+",size="+size+",csize="+ze.getCompressedSize());}}}catch(NullPointerExceptione){System.out.println("done.");}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}/** * Dumps a zip entry into a string. * @param ze a ZipEntry */privateStringdumpZipEntry(ZipEntryze){StringBuffersb=newStringBuffer();if(ze.isDirectory()){sb.append("d ");}else{sb.append("f ");}if(ze.getMethod()==ZipEntry.STORED){sb.append("stored ");}else{sb.append("defalted ");}sb.append(ze.getName());sb.append(" ");sb.append(""+ze.getSize());if(ze.getMethod()==ZipEntry.DEFLATED){sb.append("/"+ze.getCompressedSize());}return(sb.toString());}}// End of JarResources class.
dukejeffrie
A Bani tem (quase) razão. A menos que vc faça um esquema um tanto complicado, as classes que vc acessa devem estar no seu classpath.
Um classpath é um diretório-base. Ou seja, se sua classe tem nome completo br.page.Cadastro, e seu classpath é “./classes”, ele vai procurar o arquivo ./classes/br/page/Cadastro.class na hora que ele precise da classe.
Um arquivo JAR também é um diretório-base. Se seu classpath é “page.jar”, ele vai procurar a classe em br/page/Cadastro.class dentro do jar.
Eu to escrevendo um artiguinho pequeno sobre como carregar classes do outro jeito e quando vale a pena. Bani, pensa assim: se o JBoss consegue carregar classes depois de iniciado, vc também consegue, certo?