如何在Maven项目中处理CLASSPATH?

时间:2013-11-18 10:09:48

标签: java maven classpath

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

<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>

Eclipse看到Log4J库:

enter image description here

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

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

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

如何为Maven项目设置CLASSPATH?

1 个答案:

答案 0 :(得分:3)

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

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

您可以使用mvn dependency:build-classpath

获取Maven用于编译应用程序的类路径

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

该领域的另一个有用工具是assembly plugin;当您指定描述符jar-with-dependencies时,它将创建一个非常大的JAR,并将所有依赖项汇总到一个文件中。