码迷,mamicode.com
首页 > 其他好文 > 详细

jboss7 ClassNotFoundException

时间:2014-11-30 16:59:25      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:jboss   模块化   jar   

一、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中,通常抛出以下异常信息

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"
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:121)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1765)
    at org.jboss.msc.service.ServiceControllerImpl$ClearTCCLTask.run(ServiceControllerImpl.java:2291)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [:1.6.0_23]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [:1.6.0_23]
    at java.lang.Thread.run(Thread.java:662) [:1.6.0_23]
Caused by: java.lang.RuntimeException: Error getting reflective information for class <my_class_name>
    at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:70)
    at org.jboss.as.ee.component.EEModuleClassDescription$DefaultConfigurator.configure(EEModuleClassDescription.java:144)
    at org.jboss.as.ee.component.EEClassConfigurationProcessor.processClasses(EEClassConfigurationProcessor.java:133)
    at org.jboss.as.ee.component.EEClassConfigurationProcessor.deploy(EEClassConfigurationProcessor.java:76)
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:115)
    ... 5 more

问题原因

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

解决方法

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

          bubuko.com,布布扣

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

         

<module xmlns="urn:jboss:module:1.1" name="com.oracle">

    <properties>
        <property name="jboss.api" value="public"/>
    </properties>

    <resources>
        <resource-root path="ojdbc14-10.2.0.4.0.jar"/>
        <!-- Insert resources here -->
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.servlet.api" optional="true"/>
    </dependencies>
</module>

      3如果是ejb项目则部署时

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

                 bubuko.com,布布扣

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

                  

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: zx
Created-By: Apache Maven 3.2.3
Build-Jdk: 1.8.0_25
Dependencies: org.apache.log4j


三、总结

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

      

jboss7 ClassNotFoundException

标签:jboss   模块化   jar   

原文地址:http://blog.csdn.net/leimengyuanlian/article/details/41622813

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!