当前位置: 首页 > 知识库问答 >
问题:

具有maven依赖项(log4j)的java NoClassDefFoundError

易研
2023-03-14

我试图用Maven做一个小程序。我使用的是来自我大学教授的模板,我想使用log4j进行日志记录。当我在eclipse中运行该程序时,它工作得很好。然而,当我用“MVN install”创建jar并尝试用cmd运行程序时,我得到的是一个NoClassDefFoundError

C:\eclipse_workspace_buchhaltung\Buchhaltung\target>c:\jdk-11.0.4\bin\java.exe -jar Buchhaltung-1.0.0-SNAPSHOT.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
        at ch.hslu.demo.DemoKlasse.<clinit>(DemoKlasse.java:11)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 1 more
package ch.hslu.demo;

import java.time.LocalDateTime;
import java.util.Scanner;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class DemoKlasse {

    private static final Logger logger = LogManager.getLogger(DemoKlasse.class); // that's line 11

    public static void main(String[] args) {

        logger.info("DemoKlasse gestartet: " + LocalDateTime.now());

        System.out.println("Dies ist eine Testklasse!");
        String eingabe = "";
        Scanner sc = new Scanner(System.in);

        while(true) {

            System.out.println("Bitte geben Sie etwas ein. Beenden mit \"exit\"");

            eingabe = sc.nextLine();

            logger.info("Eingabe lautet: " + eingabe);

            if(eingabe.equalsIgnoreCase("exit")) {
                System.out.println("Das Programm wird beendet");
                logger.info("Exit wurde eingegeben: " + LocalDateTime.now());
                sc.close();
                System.exit(1);
            }

        }

    }

}
    <properties>
        ...
        <log4j2.version>2.12.1</log4j2.version>
        <junit5.version>5.5.1</junit5.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>${log4j2.version}</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>${log4j2.version}</version>
                <scope>runtime</scope>
            </dependency>
            ...

我在这里还发现了这一点:NoClassDefFoundError在Maven依赖上,我尝试使用maven-shade-plugin和maven-assembly-plugin,但仍然无法使其工作。

有人知道为什么我不能让这么简单的程序工作吗?

共有1个答案

邬飞捷
2023-03-14

您正在创建一个包含代码的JAR文件(以及指向主类的清单文件)。

您正在将代码导出到一个JAR文件,但没有导出依赖项。显然,您的程序需要依赖项才能运行(日志libriaries不是必需的,但其他libs是必需的)。

你说,你试过影子和组装插件。您可以同时添加两者的依赖项。我想你只是配置不正确。

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>fully.qualified.MainClass</mainClass>
            </manifest> 
        </archive> 
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

您的程序可能使用提供的作用域来声明log4j。在这种情况下,jar-with-dependencies中不包括log4j。

见https://stackoverflow.com/a/574650/10871900

 类似资料:
  • 希望是一个简单的问题,但我的google foo让我失望了--我有一个maven项目,我们在其中使用了SLF4J和Log4J1.2绑定。 我们现在想要转移到Log4J2,特别是为了提高性能--但是,我一辈子都找不到Log4J2.0绑定的maven依赖项。我在http://logging.apache.org/log4j/2.x/log4j-SLF4j-impl/上找到了一些注释,但没有提到任何依赖

  • 问题内容: 我有一个独立的Java应用程序,我想将其打包为:myapp.jar。并将所有相关的jar文件复制到“备用文件夹”。理想情况下,我想让Maven更新META- INF文件,以将所有类路径依赖项jar条目添加到其中。 例如,如果我的项目引用了commons.jar,并且当我使用此插件构建程序集时,它将所有.class文件和程序包从commons.jar复制到myappjar- with-d

  • Java和Maven新手。 我试图配置我的应用程序,以便我可以通过cmd线生成一个jar,其中包含我所有的依赖项。 据我所知,我正在正确设置Pom以使用此插件:https://github.com/javafx-maven-plugin/javafx-maven-plugin 以下是我在Pom中的依赖项: 在我的

  • 我们在自己的Maven项目中使用jaxb2-maven-plugin生成一组通用的XSD(数据类型、词汇表等)。在第二个项目中,我需要在编译时引用其中一个或多个XSD,但不希望它们包含在生成的工件中。我创建了一个曲库文件,除了我在其中获取所有内容外,它运行良好。 我仔细研究了插件文档,但它们在细节上少得可怜。有没有办法在不需要每个项目都复制它们的情况下重用常见模式? 谢谢

  • 根据Maven完整参考中的图像,当直接依赖关系范围为“编译”并且传递依赖关系的范围为“提供”时,传递依赖关系将被忽略。 我的问题是,如果直接依赖类从我的项目的传递依赖编译中扩展一个类将失败,因为在编译时'javac'将从传递依赖中寻找由直接依赖扩展的类,并且不会在编译时类路径中找到它,因为maven忽略了它。 基本上这就是编译直接依赖时编译传递依赖范围而不是运行时的原因,为什么提供传递依赖范围时不

  • 我是maven的新手。(我已经搜索了几个小时的答案,但没有运气。mvn依赖:复制依赖不能解决我的问题)我需要复制项目的所有依赖项(以jar的形式),如果我的一个jar依赖于另一个工件,也复制该工件。 示例project1 pom。xml: “project1”依赖于project2。人工制品罐子当我使用“mvn依赖项:复制依赖项”时,我得到了project2。人工制品但我没有得到project3。