【问题标题】:Getting no class def found error. Log4J -> Java没有找到类定义错误。 Log4J -> Java
【发布时间】:2010-05-29 14:26:51
【问题描述】:

我创建了一个简单的 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

我什至在类路径中没有任何其他版本的 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 文件?

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    老实说,从您对问题的实际描述中很难说清楚(您到底做了什么,您的应用程序的当前结构是什么,您指的是什么类路径等)。但我的理解是你的耳朵应该是这样的:

    耳朵 |-- 库 | `--log4j.jar |-- 元信息 | |-- 应用程序.xml | `--清单.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 中。

    【讨论】:

    • 嗨 Pascal,我没有企业应用程序,但它只是一个简单的 Ejb 模块。请阅读我编辑的帖子。等待您的回复。
    • @Nitesh Panchal - 您需要将应用程序打包为 am EAR 文件中所述的 Pascal。包括您的 EJB jar 文件。您的 EJB jar 将从 EAR 获取其依赖的 jar。我可以建议在没有 Log4J 的情况下运行您的 EJB,并首先运行它。
    • 嗨 Romain,我的 ejb 在没有 Log4J 的情况下运行完美。只是当我包含 log4j 时,我得到了上述错误。为什么要在 EAR 中打包?我希望我的项目是一个独立的 ejb 模块。
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    相关资源
    最近更新 更多