如何在 Maven 项目中处理 CLASSPATH?

use*_*736 8 java classpath maven

我正在尝试使用 Log4J ver 2-beta 9 的简单 Maven 应用程序。在我的 pom.xml 文件中,我有这两个依赖项(如Log4J Maven 网页中所述):

<dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.0-beta9</version>
</dependency>
<dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.0-beta9</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

Eclipse 看到 Log4J 库:

在此处输入图片说明

但是当我打包应用程序并运行它时,会抛出这个异常:

java -cp target/notification-1.0.0.jar com.example.Sandbox

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/LogManager
    at com.example.Sandbox.<clinit>(Sandbox.java:13)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.LogManager
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 1 more
Run Code Online (Sandbox Code Playgroud)

我搜索了这个异常,它似乎与 CLASSPATH 变量有关。

应该如何为 Maven 项目设置 CLASSPATH?

Aar*_*lla 8

Maven 是一个构建工具。它对您运行最终应用程序没有多大帮助。

您可以使用mvn exec:java -Dexec.mainClass="com.example.Sandbox"来运行您的应用程序(请参阅问题Maven Run Project),但是当您必须将参数传递给它时,这会变得很乏味。

您可以获得 Maven 用来编译您的应用程序的类路径 mvn dependency:build-classpath

这会将类路径打印到控制台。请注意,它将丢失target/notification-1.0.0.jar

这方面另一个有用的工具是程序集插件;当您指定描述符时,它将创建一个非常大的 JAR,将所有依赖项都卷入一个文件中jar-with-dependencies