jboss7 ClassNotFoundException

转载自:http://blog.csdn.net/leimengyuanlian/article/details/41622813

一、jboss老版本部署项目

       1.将数据源需要的jar包放到jbosshome\server\default\lib下,copy数据源配置文件到部署目录jbosshome\server\default\deploy.

    2.将需要的第三方jar包放到jbosshome\server\default\lib下.

    3.将项目产生的jar包或war包部署到jbosshome\server\default\deploy目录。

二、jboss7项目部署

        在jboss7中当我们以旧的方式部署项目或者将低版本中的项目转移到jboss7中,通常抛出以下异常信息

[java]  view plain  copy
 print ?
  1. ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC00001: Failed to start service jboss.deployment.unit."<ear_name>.ear".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."<ear_name>.ear".INSTALL: Failed to process phase INSTALL of deployment "<ear_name>.ear"  
  2.     at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:121)  
  3.     at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1765)  
  4.     at org.jboss.msc.service.ServiceControllerImpl$ClearTCCLTask.run(ServiceControllerImpl.java:2291)  
  5.     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [:1.6.0_23]  
  6.     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [:1.6.0_23]  
  7.     at java.lang.Thread.run(Thread.java:662) [:1.6.0_23]  
  8. Caused by: java.lang.RuntimeException: Error getting reflective information for class <my_class_name>  
  9.     at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:70)  
  10.     at org.jboss.as.ee.component.EEModuleClassDescription$DefaultConfigurator.configure(EEModuleClassDescription.java:144)  
  11.     at org.jboss.as.ee.component.EEClassConfigurationProcessor.processClasses(EEClassConfigurationProcessor.java:133)  
  12.     at org.jboss.as.ee.component.EEClassConfigurationProcessor.deploy(EEClassConfigurationProcessor.java:76)  
  13.     at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:115)  
  14.     ... 5 more  

问题原因

        在jboss7中以模块化方式部署,在同一个项目中生成的若干个jar包部署到jboss中以不同类加载器加载,而传统的方式所有的class文件都由一个类加载器完成。这样就造成了如果在项目中一个jar包中的类引用了另一个jar包中的类,以传统的方式部署到jboss7中就会抛出NoClassDefFoundError 或者ClassNotFoundException。

解决方法

       1.如果是web项目将引用的jar包放到项目的lib文件下,然后部署到jboss中,这样整个war包统一以一个类加载器加载项目中的所有class文件。

          

      2.如果是Java项目,将相应的jar包以模块的方式部署到jboss中,并在模块中配置相应的模块依赖关系。

         

[html]  view plain  copy
 print ?
  1. <module xmlns="urn:jboss:module:1.1" name="com.oracle">  
  2.   
  3.     <properties>  
  4.         <property name="jboss.api" value="public"/>  
  5.     </properties>  
  6.   
  7.     <resources>  
  8.         <resource-root path="ojdbc14-10.2.0.4.0.jar"/>  
  9.         <!-- Insert resources here -->  
  10.     </resources>  
  11.     <dependencies>  
  12.         <module name="javax.api"/>  
  13.         <module name="javax.transaction.api"/>  
  14.         <module name="javax.servlet.api" optional="true"/>  
  15.     </dependencies>  
  16. </module>  

      3如果是ejb项目则部署时

           a、通过配置jboss-deployment-structuer.xml,配置模块之间的依赖关系

                 

           b、在程序中通过maven将依赖关系配置到manifest.mf文件中

                  

[html]  view plain  copy
 print ?
  1. Manifest-Version: 1.0  
  2. Archiver-Version: Plexus Archiver  
  3. Built-By: zx  
  4. Created-By: Apache Maven 3.2.3  
  5. Build-Jdk: 1.8.0_25  
  6. Dependencies: org.apache.log4j  


三、总结

            传统运行一个java应用的方法是使用常用的classpath机制。它会创建一个application的类加载器,并且所有相关jar文件资源提供的class联系汇聚到一起成为一个大块。
    可以想象如果有一个很大很复杂的应用,包含很多的Jar文件,并且有些jar在所有的时候都不会使用,或者有些jar因为冲突的依赖关系会有几个不同的版本。这些问题我们习惯性的称之为"JAR Hell". 
    模块可以极大的缓解这个问题。如果所有的jar都打包成为模块,一个jar再也不会看到依赖里一个冲突版本的类,或者加载到一个根本不需要加载的资源。同时,如果一个模块用到才被加载能够极大的提高大型应用的启动时间。但是模块化加载需要我们以新的方式去开发、部署项目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值