NoClassDefFoundError:org / apache / log4j / Logger

时间:2018-01-30 06:38:59

标签: java maven logging intellij-idea log4j

我在我的java项目中使用了log4j logger,并在我的pom.xml中有以下内容:

<dependencies>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>

我在名为&#34; resources&#34;的目录中添加了log4j.properties。我已经在intelliJ项目结构中添加了一个源代码。

当我构建项目时,它会成功构建。但是当我尝试通过运行jar运行java -jar myproject.jar文件时,会出现以下错误。

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
    at org.wso2.confvalidator.ConfigValidator.<clinit>(ConfigValidator.java:40)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

3 个答案:

答案 0 :(得分:1)

这是因为您只是在没有依赖罐的情况下运行jar。您需要使用-cp命令在类路径中添加所有依赖项。

另一种选择是使用maven-shade-plugin创建一个&#34; Fat&#34; jar包含同一jar中的依赖java类。这使得使用命令行运行jar非常简单。要使用它,只需将以下代码段添加到您的pom插件部分:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
        <createDependencyReducedPom>false</createDependencyReducedPom>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                </excludes>
            </filter>
        </filters>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass><ENTER_YOUR_MAINCLASS_HERE></mainClass>
                        <manifestEntries>
                            <Class-Path>..</Class-Path>
                        </manifestEntries>
                    </transformer>

                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/cxf/bus-extensions.txt</resource>
                    </transformer>

                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

注意:请在<ENTER_YOUR_MAINCLASS_HERE>

更换适当的罐子主要类别

如果您确实认为存在多个次要包含不同版本的相同依赖性问题,那么您应该使用

mvn dependency:tree

命令获取正在复制的库的详细信息,然后从依赖项中删除其中一个版本。

答案 1 :(得分:0)

请尝试清理 maven存储库,有时会选择相同jar的多个版本。

答案 2 :(得分:0)

这是log4j版本2依赖项。请试试这个。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.10.0</version>
</dependency>