Ошибка получения определения класса не найдена. Log4J -> Java - PullRequest
1 голос
/ 29 мая 2010

Я создал простое веб-приложение и добавил jar log4J в свою папку lib, и, похоже, он работает нормально. Затем я создал модуль Ejb и сделал то же самое, добавив jar-файл в мой classpath, но я получаю эту ошибку: -

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 в classpath. Есть идеи, почему появляется эта ошибка?

На самом деле сначала я создал приложение Enterprise, и все, казалось, работало нормально. Но затем я скопировал файлы из модуля 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

2-е редактирование Если я помещаю файл lib в каталог appserver / lib, он работает нормально. Почему я не могу использовать внешние файлы JAR из моего проекта?

1 Ответ

3 голосов
/ 29 мая 2010

Честно говоря, по вашему фактическому описанию проблемы сложно сказать (что именно вы сделали, какова текущая структура вашего приложения, какой путь к классу вы имеете в виду и т. Д.). Но я понимаю, что ваше ухо должно выглядеть так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...