没有得到一流的画质发现错误。 Log4J的 - > Java的(Getting no cl

2019-10-22 10:47发布

我创建了一个简单的Web应用程序,并在我的lib文件夹添加Log4j的罐子,它似乎很好地工作。 然后,我创建了一个EJB模块并没有在我的类路径中添加jar文件的同样的事情,但我得到这个错误: -

Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean: java.lang.NoClassDefFoundError: org/apache/log4j/Logger
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:4929)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4761)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955)
        ... 94 more
Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/Logger
        at common.Utils.getRssFeed(Utils.java:128)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
        at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
        at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5243)
        at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
        at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567)
        at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)
        at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139)
        at sun.reflect.GeneratedMethodAccessor102.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
        at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367)
        at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5215)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5203)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190)
        ... 92 more
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
        at com.sun.enterprise.loader.ASURLClassLoader.findClassData(ASURLClassLoader.java:736)
        at com.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:626)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
        ... 113 more

我甚至不具备的log4j的类路径中的任何其他版本。 任何想法,这是为什么错误来了吗?

其实首先我创建了一个企业应用程序,一切似乎正常工作。 但后来,我复制从我的企业应用程序的EJB模块文件到一个单独的模块,自此这些错误都来了。 这是在我的build-impl.xml中: -

<target depends="compile" name="library-inclusion-in-archive">
        <copyfiles files="${libs.Log4J.classpath}" todir="${build.classes.dir}"/>
    </target>
    <target depends="compile" name="library-inclusion-in-manifest">
        <copyfiles files="${libs.Log4J.classpath}" todir="${dist.ear.dir}/lib"/>
        <manifest file="${build.ear.classes.dir}/META-INF/MANIFEST.MF" mode="update"/>
    </target>

不知道这是为什么指向耳朵,而不是罐子。 是否存在与上述声明的任何问题吗? 我要如何解决这个问题? 我使用NetBeans 6.8

提前致谢 :)

编辑: -

我的EJB模块的结构是: -

   mymodule.jar
    |_mypackage
    | |_myclass.class
    |
    |_META_INF
    | |_MANIFEST.MF
    | |_persistence.xml
    | |_sun-ejb-jar.xml
    |
    |_log4j-1.2.16.jar

我的MANIFEST.MF的内容是: -

Manifest-Version: 1.0

Ant-Version: Apache Ant 1.7.1

Created-By: 14.1-b02 (Sun Microsystems Inc.)

Class-Path: log4j-1.2.16.jar

没有的application.xml

第二编辑如果我把库文件在我的应用服务器/ lib目录下,它工作正常。 为什么我不能使用外部JAR文件从我的项目中?

Answer 1:

老实说,很难从问题的实际描述说(究竟做了你,你是什么应用,什么类路径你指的是,等目前的结构)。 但我的理解是,你的耳朵应该是这样的:

myear.ear
|-- lib
|   `-- log4j.jar
|-- META-INF
|   |-- application.xml
|   `-- MANIFEST.MF
|-- mywebapp.war
`-- myejbs.jar

MANIFEST.MF应该包含这样一个条目:

Class-Path: myejbs.jar lib/log4j.jar

仔细检查你有类似的东西。 如果你这样做,请更新你的耳朵,你的结构你的问题MANIFEST.MF ,您application.xml


EJB不的等效WEB-INF/lib ,虽然包装的EJB-JAR内库可能与一些应用程序服务器正常工作,或没有,这不是一部分JAR规范和不符合Sun的有关标准,符合J2EE包装 。 所以,据我所知,一个EJB,它依赖于JAR文件应该打包在一个EAR。



文章来源: Getting no class def found error. Log4J -> Java
标签: java log4j