war的lib和ear的lib之间的wildfly类加载器问题

时间:2016-11-11 15:50:32

标签: java classloader wildfly ear

我为Wildfly中部署的EAR设计了这个模式:

  • EAR:
    • ejbA.jar
    • ejbB.jar
    • LIB
      • LibInterfaceA.jar
      • LibInterfaceB.jar
    • WAR
      • LIB
        • LibInterfaceA.jar

LibInterfaceA.jar是ejb模块(A adn B)和WAR中用于注入ejb并在LibInterfaceB.jar中扩展的接口的库。

当我在LibInterfaceA中搜索自定义注释时,问题出在java反射:

public Annotation getAnnotazione(Method method, Class annotationType){
    Annotation annotazioni[] = method.getAnnotations();
    URL locationsearch = annotationType.getResource('/' + annotationType.getName().replace('.', '/') + ".class");
    for(Annotation a : annotazioni){
        Class klass = a.annotationType();
        URL location = klass.getResource('/' + klass.getName().replace('.', '/') + ".class");
        if(a.annotationType().getName().equals(annotationType.getName())){
            return a;
        }
    }
    return null;
}

我在WAR内的一个类中调用此方法来查找注释 annotationType = @ Custom 。 @Custom属于WAR / lib / LibInterfaceA.jar

如果我调用此方法来查找实现LibInterfaceB接口的类,该接口扩展了LibInterfeceA中的接口,则该方法上的注释@Custom属于jar EAR / lib / LibInterfaceA.jar,因此类加载的类不同问题

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以从战争中删除LibInterfaceA.jar。默认情况下,ear的子部署可以使用其lib目录(除非你在ear的jboss-depoyment-structure.xml中设置ear-subdeployments-isolated = true)