java.lang.NoClassDefFoundError: org/apache/log4j/Priority

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33883509/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 22:13:52  来源:igfitidea点击:

java.lang.NoClassDefFoundError: org/apache/log4j/Priority

javamavenlog4jglassfish-3jboss-arquillian

提问by A.S

I am following a custom logging tool to implement logging functionality for emails using log4j.

我正在使用自定义日志记录工具来使用 log4j 实现电子邮件的日志记录功能。

I have added the dependency for the log4j:1.2.17 as well as the jar to the class path. I am trying to run a Test using arquillian. But every time I am getting the same error.

我已将 log4j:1.2.17 的依赖项以及 jar 添加到类路径中。我正在尝试使用 arquillian 运行测试。但每次我都遇到同样的错误。

I know its coming up as in I am using the Level instead of Priority which is now deprecated. I have added the correct jar and imports as well but still the error prevails when I run the Test.

我知道它即将到来,因为我正在使用 Level 而不是 Priority,后者现在已弃用。我也添加了正确的 jar 和导入,但是当我运行测试时错误仍然存​​在。

I have referred to these links as well but nothing works for me.

我也提到了这些链接,但对我没有任何作用。

What's causing this Maven/JBehave error?

是什么导致了这个 Maven/JBehave 错误?

https://community.oracle.com/thread/969941?start=0

https://community.oracle.com/thread/969941?start=0

Does anybody know how to solve this error?

有谁知道如何解决这个错误?

This is a snippet from my EmailTest.java class:

这是我的 EmailTest.java 类的一个片段:

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.*;
import org.junit.runner.RunWith;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.RootLogger;
import javax.inject.Inject;

       public class EmailTest{
       @Inject
       private Email email;

       @Deployment //(testable = true)
       public static JavaArchive createTestArchive(){

        return ShrinkWrap.create(JavaArchive.class, "test.jar")
                .addClasses(ErrorEmailThrottle.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");}

        @Test
        public void noFatalError(){            
        Assert.assertEquals(email.isTriggeringEvent(createLogEvent(Level.FATAL, System.currentTimeMillis())), true);
        Assert.assertEquals(email.isInThrottleMode(), false);
                    }
        .....

        private LoggingEvent createLogEvent(Level level, long time) {
                return new LoggingEvent("Email", new RootLogger(Level.INFO) , time, level, "Email message", null);
              }
        }

Here is my pom.xml dependency:

这是我的 pom.xml 依赖项:

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
   <!--<scope>test</scope>-->
   <exclusions>
        <exclusion>
          <groupId>com.sun.jdmk</groupId>
          <artifactId>jmxtools</artifactId>
        </exclusion>
        <exclusion>
           <groupId>com.sun.jmx</groupId>
           <artifactId>jmxri</artifactId>
        </exclusion>
    </exclusions>
 </dependency>

Getting this error:

收到此错误:

java.lang.NoClassDefFoundError: org/apache/log4j/Priority
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
    at java.lang.Class.getConstructors(Class.java:1651)
    at org.junit.runners.model.TestClass.<init>(TestClass.java:39)
    at org.junit.runners.ParentRunner.<init>(ParentRunner.java:75)
    at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:57)
    at org.jboss.arquillian.junit.Arquillian.<init>(Arquillian.java:60)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
    at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:31)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:138)
    at org.jboss.arquillian.junit.container.JUnitTestRunner.execute(JUnitTestRunner.java:66)
    at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.executeTest(ServletTestRunner.java:170)
    at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.execute(ServletTestRunner.java:135)
    at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.doGet(ServletTestRunner.java:98)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:745)


Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Priority
    at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1509)
    at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1359)
    ... 49 more

回答by Adrian Shum

I have just checked Log4j 1.2.17 source code, and org.apache.log4j.Priorityis still there.

我刚刚检查了 Log4j 1.2.17 源代码,org.apache.log4j.Priority仍然存在。

Therefore the problem is probably because your dependency is not properly added.

因此,问题可能是因为您的依赖项未正确添加。

There may be several possibilities:

可能有几种可能:

  1. You have put that <dependency>block under <dependencyManagement>instead of <dependencies>
  2. There are other dependency declared which Maven decided to take. It should be easily verifiable by mvn dependency:treeat the project. You can see which version of log4jis taken
  3. You file is damaged or empty or whatever. Check the content of log4j:log4j:1.2.17in your local repository etc.
  1. 你已经把那个<dependency>块放在下面<dependencyManagement>而不是<dependencies>
  2. Maven 决定采用其他依赖项。它应该很容易mvn dependency:tree在项目中验证。可以看到的是哪个版本log4j
  3. 您的文件已损坏或为空或其他什么。检查log4j:log4j:1.2.17本地存储库中的内容等。