我对Maven有问题。我在pom.xml中加入了依赖性:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.6</version>
</dependency>
我正在使用Intellij作为IDE,在那里我没有任何编译警告。我正在使用命令行来运行Maven命令,并且可以运行mvn install
compile
package
毫无麻烦。
但是,当我尝试运行罐子时:
java -cp target/stride-1.0-SNAPSHOT.jar com.myapp.maven.App
我得到此错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/csv/CSVFormat
at com.stride.maven.App.parseCsv(App.java:43)
at com.stride.maven.App.main(App.java:25)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.csv.CSVFormat
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
显然,Maven找不到那条路。我尝试删除.m2,重建,并且主要是我在Stackoverflow上发现的所有内容,但是我找不到问题,或者无法了解问题。请注意,在我的Intellij中,我可以在外部库中看到依赖关系。
我还尝试使用Shade将依赖项复制到JAR:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<transformers>
<transformer implementation=
"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.myapp.maven.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
关注我MVN清洁安装程序包,然后是我的构建命令。没有运气。
我还尝试了Maven Assembly插件。猜猜是什么,没有运气!
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>
com.myapp.maven.App
</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
我确认依赖关系甚至没有被内置。
谢谢!
maven在这种情况下效果很好。但是,您似乎错过了依赖点。
定义依赖项时,Maven在编译期间使用它(因此,Intellij和执行mvn install
时都没有错误(
,但这并不意味着依赖项就放在罐子中。
应用程序的应用程序类型更复杂,它的确可以工作(依赖性罐子中包含在工件中(,例如春季启动应用程序,Web Archives(WAR(等。但是,由于您编译了一个普通的罐子,它将仅包含模块的类,并且在这种情况下不会包括Commons-CSV类。
因此,为了能够运行此应用程序,您应该选择一个:
-
将Commons-CSV的公罐(以及您可能拥有的其他依赖项(放入类路径:
java -classpath <path-to-commons-csv> -jar YourApp
-
使用Maven Shade插件创建一个jar,它确实将所有依赖项都包含为class
如其他答案中所述,您需要在可执行罐中包装依赖项(又称Uber-jar(。您提到您已经尝试了两种方法:使用与Descriptorref jar-with依赖性和Maven Shade插件的Maven组件。
第一个全局备注:Maven插件配置可以在<pluginManagement>
块中或直接在POM的<build>
部分中定义。我建议将它们放在<build>
中,我认为您已经将它们放在那里,但是我无法验证,因为您仅在问题中粘贴了一部分。
在Maven Assembly插件中使用jar-with-dependencies
Descriptorref时,将在您的target/
文件夹中创建两个JAR文件:stride-1.0-snapshot.jar和stride-1.0-snapshot-snapshot-with-with intendendencies.jar。您应该使用-with-dependencies.jar
,因此运行java -cp target/stride-1.0-SNAPSHOT-with-dependencies.jar com.myapp.maven.App
Shade插件比Maven Assembly插件提供了更多的选项。但是,在粘贴的代码中,您没有将Maven Shade插件的执行限制为Maven生命周期的包装阶段。如果运行mvn package
,您将不会将Maven Shade插件视为Maven所做的构建步骤的一部分。如果您更仔细地查看Mkyongs指南,您会发现您需要在<execution>
块中包含<phase>package</phase>
。
嗨,问题是,当jar创建时,下载的依赖项并未附加到可执行jar上,这就是为什么出现错误的原因,我们可以将下面的部分添加到构建标签以使依赖项附加到可执行JAR上,然后您可以使用Java -jar命令
执行JAR 毛绒组装 - plugin 包装单 ...哇。dxdatagenerator.App jar依赖性 ->