【问题标题】:How to handle with CLASSPATH in Maven project?如何在 Maven 项目中处理 CLASSPATH?
【发布时间】:2013-12-01 10:41:09
【问题描述】:

我正在尝试使用 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 库:

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

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应该如何设置?

【问题讨论】:

  • 它可能就像你的类路径中可用的更多 log4j jar 并且它正在被混淆
  • 是的,我自己的另一个项目这个应用程序的依赖项也使用 Log4J,这可能是个问题吗?我不确定。
  • 在 Maven 中,由 mvn package 创建的 jar 不包含它的依赖项。所以你必须将 log4j-* 添加到你的类路径中。您可以检查诸如 maven-assembly-plugin 之类的东西来创建一个 jar-with-dependencies。

标签: java maven classpath


【解决方案1】:

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,并将所有依赖项汇总到一个文件中。

【讨论】:

  • 我已经尝试了 Maven Exec 插件并且应用程序运行正常,谢谢。这意味着我的应用程序找不到依赖项。我安装了 maven-dependency-plugin 将所有依赖项复制到 ${project.build.directory}/lib。我认为我需要解决的最后一个问题是将类路径设置为此目录。当我在生产环境中运行我的应用程序时如何解决它?复制所有目标目录并将类路径设置为“./lib”目录是否保存?
  • 这种情况下需要将classpath设置为"lib/*";不要忘记引号,您不希望外壳扩展星号!您必须将其传递给 Java。 stackoverflow.com/questions/1237093/…
猜你喜欢
  • 2012-05-28
  • 1970-01-01
  • 2011-05-01
  • 2017-09-20
  • 2018-06-30
  • 2015-07-08
  • 2010-09-18
  • 1970-01-01
相关资源
最近更新 更多