在Maven中,我的依赖项已经设置,但是当我运行生成的jar时,我得到了一个ClassNotFoundException

我在http://www.youtube.com/watch?v=IRKu8_l5YiQ上关注了maven教程。

我用默认的原型创建了一个maven项目。 然后我将以下依赖项添加到我的pom.xml:

 org.slf4j slf4j-api 1.7.7  

然后我尝试将Logger放入我的App.java文件中。 此文件内置了我使用的默认maven原型。 代码如下:

 package GroupID; import org.slf4j.*; /** * Hello world! */ public class App { public static void main(String[] args) { //System.out.println( "Hello World!" ); Logger logger = LoggerFactory.getLogger(App.class); logger.info("Hello, World!"); } } 

然后我运行’mvn package’并且它不会产生任何错误。 但是,当我尝试使用以下命令运行输出的jar时:

 java -cp /Users/stephenmorse/Desktop/myapp/ArtifactID/target/ArtifactID-1.jar GroupID.App 

我收到以下错误消息:

 Exception in thread "main" java.lang.NoClassDefFoundError: org.slf4j.LoggerFactory at GroupID.App.main(App.java:12) Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory at java.net.URLClassLoader$1.run(URLClassLoader.java:372) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ...1 more 

看来即使我通过不在依赖块中指定范围来接受默认的“编译”范围,我仍然无法在运行时访问下载的jar。 在设置了依赖项后,如何在运行时找到jar? 他们为什么不在我的案子里工作?

谢谢!

当我第一次开始使用Maven时,我不得不提供一些额外的构建“插件”/“配置”,以便使用正确的清单文件构建Jar,包括class-path条目和jar中包含的依赖jar。 ..

    maven-jar-plugin 2.4    true    lib/       org.apache.maven.plugins maven-dependency-plugin 2.1   copy-dependencies package  copy-dependencies   ${project.build.directory}/lib false false true      org.apache.maven.plugins maven-compiler-plugin 2.3.2  

考虑使用maven shade插件创建Uber Jar。

使用slf4j-api时,您需要在运行时添加API实现依赖项,例如slf4j-simple或logback :

 ...  1.7.7    org.slf4j slf4j-api ${slf4j.version}   org.slf4j slf4j-simple ${slf4j.version} runtime