Java 如何在Maven项目中处理类路径?
我正在尝试使用Log4J版本2-beta 9的简单Maven应用程序。在pom.xml文件中,我有以下两个依赖项(如中所述):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
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