`
一江春水邀明月
  • 浏览: 77669 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JBoss 中的ear 包中类加载顺序控制

 
阅读更多

 

最近几天研究Dozer的性能,需要改写Dozer 中的几个类但是又不打算重新编译Dozer的jar 包了, 所以偷懒在genidc-biz-service 工程的src 目录下创建在dozer jar 中相同名称的类包, 图中的"org.dozer", "org.dozer.cache", "org.dozer.converters", 拷贝dozer 源代码中的相关类过来, 然后在这里动手改。

 

 

 

发布的时候, 发现奇怪了, 程序还是在跑Dozer jar 包中的老代码, 我所新添加的代码都没跑到。 以前玩Tomcat的时候, 开源Jar 包下的类就这么干的, 工作好好的。 tomcat  的类文件优先加载级别是

 

 

Therefore, from the perspective of a web application, class or resource loading looks in the following repositories, in this order:

    Bootstrap classes of your JVM
    System class loader classes (described above)
    /WEB-INF/classes of your web application
    /WEB-INF/lib/*.jar of your web application
    Common class loader classes (described above)
 

所以web 工程编译出来的class 文件是比lib 包下的jar 文件中的class 文件优先加载的。  

恩,看来Jboss 下的类文件加载不是这么玩的。 咨询谷歌大神, 他告诉我需要以下步骤

1. 修改ear 下的jboss-application.xml, 做如下设置, 它的作用是告诉类加载器强制按照ear 包下的application.xml 中指定的jar 包顺序做加载。

<jboss-app>
  <module-order>strict</module-order>
</jboss-app> 
 

查看了我们的genidc-ear 工程, target 打出来的jboss-application.xml 已经是这样了,

2. 然后在application.xml 中设置加载顺序

<application xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd" version="1.4">
  <display-name>genidc-ear</display-name>
  <module>
    <java>lib/genidc-common-service-3.1.jar</java>
  </module>
  <module>
    <java>lib/genidc-common-presentation-3.1.jar</java>
  </module>
  <module>
    <java>lib/genidc-biz-manager-3.1.jar</java>
  </module>
  <module>
    <java>lib/genidc-biz-model-3.1.jar</java>
  </module>
  <module>
    <java>lib/genidc-biz-service-3.1.jar</java>
  </module>
  <module>
    <java>lib/dozer-5.2.0.jar</java>
  </module>
  <module>
    <ejb>genidc-ejb3-3.1.jar</ejb>
  </module>
</application> 

 

 

这里,没有在这里指定的ear 中的其他jar 包, 默认的加载顺序是和这里的jar 包一起按照字母顺序加载, 如果不特别指定dozer加载顺序, 那么因为dozer jar 比genidc-biz-service-3.1.jar 字母序靠前, 所以dozer 中的MappingProcessor.class会先加载, 然后等到加载genidc-biz-service-3.1.jar 中的MappingProcessor.class, 类装载器认为已经加载过, 就跳过了加载。  所以这里只要强行指定这个dozer-5.2.0.jar  比genidc-biz-service-3.1.jar后加载就OK了。   把这个修改了的ear 包放Jboss里,跑起来对了。

3. 且慢, 光这样改还不行, 重新run 下maven, application.xml 又变回去了, 那么这些配置文件的生成肯定和Maven的脚本有关。查看genidc-ear 工程下的pom 有个maven-ear plugin 的配置, 原来, application.xml 中的jar 以及顺序都是它指定, 还有jboss-application.xml 中的module-order 也是这里指定的。 在这里加上dozer 的配置, OK, maven build 出来的application.xml 就是我们想要的了。

 

 <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <displayName></displayName>
                    <description></description>
                    <version>1.4</version>
                    <defaultLibBundleDir>lib</defaultLibBundleDir>
                    <modules>
                        <jarModule>
                            <groupId>oasis.genidc</groupId>
                            <artifactId>genidc-utility</artifactId>
                            <includeInApplicationXml>false</includeInApplicationXml>
                        </jarModule>
                        <jarModule>
                            <groupId>oasis.genidc</groupId>
                            <artifactId>genidc-common-service</artifactId>
                            <includeInApplicationXml>true</includeInApplicationXml>
                        </jarModule>
                        <jarModule>
                            <groupId>oasis.genidc</groupId>
                            <artifactId>genidc-common-presentation</artifactId>
                            <includeInApplicationXml>true</includeInApplicationXml>
                        </jarModule>
                        <jarModule>
                            <groupId>oasis.genidc</groupId>
                            <artifactId>genidc-biz-manager</artifactId>
                            <includeInApplicationXml>true</includeInApplicationXml>
                        </jarModule>
                        <jarModule>
                            <groupId>oasis.genidc</groupId>
                            <artifactId>genidc-biz-model</artifactId>
                            <includeInApplicationXml>true</includeInApplicationXml>
                        </jarModule>
                        <jarModule>
                            <groupId>oasis.genidc</groupId>
                            <artifactId>genidc-biz-service</artifactId>
                            <includeInApplicationXml>true</includeInApplicationXml>
                        </jarModule>                  
                        <jarModule>
                            <groupId>net.sf.dozer</groupId>
                            <artifactId>dozer</artifactId>
                            <includeInApplicationXml>true</includeInApplicationXml>
                        </jarModule>
                        <ejbModule>
                            <groupId>oasis.genidc</groupId>
                            <artifactId>genidc-ejb3</artifactId>
                        </ejbModule>
                    </modules>
                        <jboss>
                            <version>4.2</version>
                            <module-order>strict</module-order>                       
                        </jboss>
                </configuration>
            </plugin> 
  • 大小: 50.7 KB
分享到:
评论

相关推荐

    MyEclipse中配置JBoss

    NULL 博文链接:https://blueprint86.iteye.com/blog/998660

    JBOSS启动顺序、JBOSS占用的端口

    JBOSS常见错误处理的基本知识,日常问题的解决利器

    jboss-modules:模块化的类加载系统

    换句话说,不是将所有的JAR都加载到平面类路径中的单个类加载器,而是每个库成为一个模块,该模块仅链接到其依赖的确切模块,仅此而已。 它实现了线程安全,快速和高度并发的委托类加载器模型,并与可扩展的模块...

    jboss rules 用户指南(中文)

    JBoss Rules中,规则是如何被表示的Rules 一条规则是对商业知识的编码。... 什么是JBoss Rules? JBoss Rules的含义是什么?  JBoss Rules 的前身是Codehaus的一个开源项目叫Drools。最近被纳入JBoss门下,更名为...

    jboss-modules, 模块化加载系统.zip

    JBoss模块是Java模块化的( 非分级) 类加载和执行环境的独立实现。 也就是说,每个类库装入的不是一个单独的类路径,而是将每个库变成一个只依赖于它所依赖的确切模块的,并没有任何其他的类。 它实现了一个线程安

    解决jboss中启动的优先级的问题

    解决jboss中启动的优先级的问题,介绍了WEB和EJB之间的启动顺序。

    jboss配置指南

    lib 一些 JAR , JBoss 启动时加载,且被所有 JBoss 配置共享。(不要把你的库放在这里) server 各种 JBoss 配置。每个配置必须放在不同的子目录。子目录的名字表示配置的名字。 JBoss 包含 3 个默认的配置: ...

    在jboss上部署web应用

    因为JBoss代码遵循LGPL许可,你可以在任何商业应 用中免费使用它,而不用支付费用。JBoss是纯Java的Web应用服务器,为了保证JBoss服务器的正常运行,在安装JBoss之前首先要确保系统 已经安装了JDK。可以从...

    JBOSS,JBoss安装部署

    JBOSS,JBoss安装部署 JBOSS,JBoss安装部署

    JBoss启动 JBoss启动

    JBoss启动JBoss启动JBoss启动JBoss启动JBoss启动JBoss启动JBoss启动JBoss启动 JBoss启动

    jboss-modules.jar

    换句话说,不同于Java传统的使用单个类加载器载入classpath中的所有JAR文件,每一个库(library,可以理解为完成某一个功能的一系列jar的组合)成为一个module,该module仅链接其依赖的其他module,而不再依赖其它任何...

    JBoss4 Guide 中文

    Jboss get started

    JavaEE源代码 jboss-common

    JavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-...

    eclipse3.6创建EJB+JPA+EAR(每个都是单独工程)完整介绍

    eclipse3.6创建EJB+JPA+EAR(每个都是单独工程)完整介绍:自动创建表结构、数据源配置、jpa和ejb工程添加到ear包中。以及注入Emanager。 要这么高的分只是为了物有所值。

    JBOSS中文文档 CSDN资源下载

    本书的目标就是,尽快使得用户能够将J2EE 1.4应用部署并运行在JBoss 4.0.x上。

    jboss rules 中文用户指南

    jboss rules 中文用户指南,mht文件,共十章。

    jboss seam 中文文档

    太闲,转成pdf方便大家学习。在这里谢谢 满红江20071230。

    jboss 中文开发文档

    第一章:入门 第二章:JBOSS-快速上手 第三章:关于实例应用 第四章:duke银行应用 第五章:javaee之web服务

    jboss drool5.1中文使用说明

    整理一下jboss drool5.1中文使用说明,doc格式

Global site tag (gtag.js) - Google Analytics