Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Maven项目中处理类路径?_Java_Maven_Classpath - Fatal编程技术网

Java 如何在Maven项目中处理类路径?

Java 如何在Maven项目中处理类路径?,java,maven,classpath,Java,Maven,Classpath,我正在尝试使用Log4J版本2-beta 9的简单Maven应用程序。在pom.xml文件中,我有以下两个依赖项(如中所述): org.apache.logging.log4j log4japi 2.0-beta9 org.apache.logging.log4j log4j型芯 2.0-beta9 Eclipse可以看到Log4J库: 但当我打包应用程序并运行它时,会引发此异常: java -cp target/notification-1.0.0.jar com.example.San

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


org.apache.logging.log4j
log4japi
2.0-beta9
org.apache.logging.log4j
log4j型芯
2.0-beta9
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
java-cp-target/notification-1.0.0.jar com.example.Sandbox
线程“main”java.lang.NoClassDefFoundError中出现异常:org/apache/log4j/LogManager
位于com.example.Sandbox(Sandbox.java:13)
原因:java.lang.ClassNotFoundException:org.apache.log4j.LogManager
在java.net.URLClassLoader$1.run(URLClassLoader.java:366)
在java.net.URLClassLoader$1.run(URLClassLoader.java:355)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:354)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:425)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 还有一个
我搜索了这个异常,它似乎与类路径变量有关


如何为Maven项目设置类路径?

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

您可以使用
mvn exec:java-Dexec.mainClass=“com.example.Sandbox”
来运行您的应用程序(请参见问题),但当您必须向其传递参数时,这会变得很乏味

您可以使用
mvn依赖项:buildclasspath

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


这方面的另一个有用工具是;当您指定描述符时,它将创建一个非常大的JAR,将所有依赖项合并到一个文件中。
JAR with dependencients

它可能类似于在类路径中提供的更多log4j JAR,并且它正在被限制是的,我自己的另一个项目此应用程序的依赖项也是使用log4j的,这会是一个问题吗?我不确定。在Maven中,由
mvn包创建的jar不包含它的依赖项。因此,必须将log4j-*添加到类路径中。你可以检查maven assembly plugin之类的东西来创建一个带有依赖项的jar。我已经尝试了maven Exec plugin,该应用程序运行正常,谢谢。这意味着我的应用程序找不到依赖项。我安装了maven依赖插件,将所有依赖项复制到${project.build.directory}/lib。我认为我需要解决的最后一个问题是设置这个目录的类路径。在生产环境中运行应用程序时,如何解决这个问题?复制所有目标目录并将classpath设置为“/lib”dir是否保存?在这种情况下,您需要将classpath设置为
“lib/*”
;不要忘记引号,你不想让shell扩展星号!您必须将其传递给Java。
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