java - war 的 lib 和 Ear 的 lib 之间的 Wildfly 类加载器问题

标签 java classloader wildfly ear

我在 Wildfly 中部署了 EAR 架构:

  • 耳朵:
    • ejbA.jar
    • ejbB.jar
      • LibInterfaceA.jar
      • LibInterfaceB.jar
    • war
        • LibInterfaceA.jar

LibInterfaceA.jar 是一个仅在 ejb 模块(A 和 B)以及用于注入(inject) ejb 的 WAR 中使用的接口(interface)的库,并在 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 接口(interface)的类,该接口(interface)扩展了 LibInterfeceA 中的接口(interface),则该方法上的注释 @Custom 属于 jar EAR/lib/LibInterfaceA.jar ,因此这些类的类加载不同问题。

如何解决这个问题?

最佳答案

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

关于java - war 的 lib 和 Ear 的 lib 之间的 Wildfly 类加载器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40551536/

相关文章:

JAVA.使用lambda让代码变得干净

annotations - 字节码注入(inject)发生在哪里?

java - 反序列化动态加载的类java

eclipse - 部署目录中的war文件名错误

jboss - Logback + Wildfly 8 - 不正确的模式

java - java如何转换参数传递给方法?

java - java中如何分割下面的字符串?

java - NoSuchBeanDefinitionException 如何初始化 SessionFactory bean?

java - 如何从使用类加载器创建的类中调用方法

mysql - WildFly 不保留 MySQL 中的存储过程调用