我创建了一个简单的Web应用程序,并在我的lib文件夹中添加了log4J的jar,它似乎工作正常。然后我创建了一个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
我甚至在classpath中没有任何其他版本的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文件放在我的appserver / lib目录中,它可以正常工作。为什么我不能在项目中使用外部jar文件?
答案 0 :(得分:3)
老实说,从你对问题的实际描述中很难说(你究竟是什么,你的应用程序的当前结构是什么,你指的是什么类路径等)。但我的理解是你的耳朵应该是这样的:
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 specification的一部分,并且不符合与Sun关于J2EE packaging的标准。所以据我所知,EJB和它所依赖的JAR应该打包在EAR中。