Blz, galera
Eu preciso fazer uma aplicação com componentes plugáveis, ou seja, o usuário carrega um jar e minha aplicação “roda” esse jar dentro da aplicação, algo semelhante a widgets. mas só semelhante. O que foi feito:
projeto1 é uma aplicação seam que recebe e roda os .jar. Possui a biblioteca que possui a interface.IHello. Essa biblioteca está dentro de WEB-INF/libs
projeto2 é uma aplicação javase teste. Possui a biblioteca que possui a interface.IHello, tem a classe Hello que a implementa. Ao final, é criado um projeto2.jar que contém somente o Hello.class, além do MANIFEST.
No servidor, tenho um método getJar. Passo o caminho do .jar, que no meu caso é o projeto2.jar e o carrego dinamicamente por meio de URLClassLoader e Class. O problema acontece no loadClass. Em tempo de compilação, não há erros. Porém, qdo ele tenta carregar a classe Hello, dá erro (ClassNotFoundException), pois ele não enxerga a interface IHello. Ele não enxerga pq ele procura essa interface dentro do jar, mas a interface tah no servidor, na aplicação. Se eu puser o IHello dentro do jar, ele carrega a classe e eu crio uma nova instância, porém a nova instância é um Object e qdo eu tento fazer o cast de Objetc pra IHello, dá um no ClassCastException.
A minha aplicação funciona somente numa versão semelhante pra desktop.
import interfaces.IHello;
public class Hello implements IHello {
public void hello() {
System.out.println("hello");
}
}
package interfaces;
public interface IHello {
void hello();
}
package enovar.service;
import interfaces.IHello;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
@Name("service")
public class Service {
@Out
private IHello alo;
@Factory("alo")
public void getJar() {
String path = "C:/Users/ricky.paz/workspace/libs/designapi.jar";
try {
File file = new File(path);
URLClassLoader clazzLoader = URLClassLoader.newInstance(new URL[]{file.toURI().toURL()});
JarFile jarFile = new JarFile(file);
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry element = entries.nextElement();
if (element.getName().endsWith(".class")) {
try {
// se o jar tiver interfaces.IHello, passa do loadClass, mas dá problema no cast (ClassCastException), se não tiver, dá erro (ClassNotFoundException)
Class c = clazzLoader.loadClass(element.getName().replaceAll(".class", "").replaceAll("/", "."));
Object o = c.newInstance();
this.alo = (IHello) o;
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}