JBoss ClassLoading Parent-Last loading

时间:2017-02-17 17:36:47

标签: java jboss classloader

我想了解应用程序JBoss应用程序服务器中的 parent-last 加载。我们在JBoss 4.2.1 GA中部署了遗留应用程序。我们正在尝试父母最后一次加载。

我指的是link。 我想学习父母最后一次加载。所以用maven-jar-plugin和配置创建了简单的maven jar包应用程序 - > addDefaultImplementationEntries = true。我从同一个jar创建maven应用程序创建了2个jar版本1.0.0和1.0.1。 jar有单个类TestClass和一个简单的String返回方法,它返回从中加载类的jar版本。 我想体验使用java2ClassLoadingCompliance 。我已经在服务器/ deploy / MyApplication / WEB-INF / lib中打包了1.0.0版本的jar(我的Web应用程序是一个简单的servlet应用程序,它调用类的方法,从而打印从中调用jar的版本号。)和server / lib中的1.0.1版jar。

注意 :逻辑上,在应用程序中使用旧版本的jar并使用服务器库中存在的较新版本覆盖它是没有意义的,但是只想体验课程加载。

我试过以下

  1. 在meta-inf文件夹中没有任何jboss-web.xml。
  2. 我尝试在META-INF中引入jboss-we.xml,并使用java2ClassLoadingCompliance = false执行相同操作。
  3. 使用java2ClassLoadingCompliance = true。
  4. 应用程序库中的所有时间类都将被应用程序加载。

    我的jboss-web.xml看起来像reference

    <jboss-web>
       <class-loading java2ClassLoadingCompliance="true">
          <loader-repository>
             com.example:archive=JBossClassLoadingTestServlet-0.0.1-SNAPSHOT.ear
             <loader-repository-config>java2ParentDelegation=true</loader-repository-config>
          </loader-repository>
       </class-loading>
    </jboss-web>
    

    有人可以帮我理解JBoss中的父级最后配置吗?我在这里做的错误总是来自应用程序li​​b的类被加载?

1 个答案:

答案 0 :(得分:0)

我担心您的链接与您的实验无关。它与EAR部署有关,其中存在多模块部署,需要多个版本的lib才能隔离。

在您的情况下,您只需在一个Jar中覆盖lib。

以下内容来自Servlet Spec:

  

还建议实现应用程序类加载器   WAR中打包的类和资源优先加载   驻留在容器范围的库JAR中的类和资源。

因此,JBoss遵循规范,它总是首先加载应用程序库。

我没有找到这样的旧版本doc,但它应该与AS7类似:

  

按优先级最高的顺序排列

     
      
  1. 系统依赖关系 - 这些是容器自动添加到模块的依赖关系,包括Java EE API。
  2.   
  3. 用户依赖关系 - 这些是通过JBoss-deployment-structure.xml或通过Dependencies:manifest条目添加的依赖关系。
  4.   
  5. 本地资源 - 在部署本身内打包的类文件,例如来自WEB-INF / classes或战争的WEB-INF / lib的类文件。
  6.   
  7. 部署间依赖关系 - 这些依赖于ear部署中的其他部署。这可以包括ear的lib目录中的类,或者其他EJB jar中定义的类。
  8.   

相关: