在很多情况下,我不确定最好处理maven项目的依赖关系。那是在执行一个包含mvn包结果的jar时。
我尝试过的事情
1)Maven-shade插件 对于某些用例(例如hadoop作业),我发现使用Maven shade插件与包步骤集成是很方便的(它构建了一个全包的uber-jar)。缺点是超级罐太大了。此外,我不能让maven阴影处理datanucleus依赖,因为它弄乱了一些东西。
2)将依赖项与jar一起分发。
//something like this
$ mvn package dependency:copy-dependencies
$ java -cp target/project.jar:target/dependency com.MyMainClass
生成一个包含所有依赖项和jar的目录。
我想做的是
3)只需能够在执行jar时分发jar并处理依赖项。由于mvn包将pom放在jar文件夹中,所有信息都在那里吗? 。现在,我希望如果有一行命令能够运行这个jar,请求maven管理依赖项。如果有人知道这样的东西是否可以用作hadoop工作,那就更棒了。
答案 0 :(得分:2)
我认为在你的观点3中没有问题的解决方案。
我的三个选项,在所有情况下,您都可以使用简单的java -jar target/project.jar
运行应用程序。不需要更多。
(这里错过了jar配置中的清单)
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.2</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
Maven依赖插件,正确的jar配置(classpath)和maven程序集自定义描述符,用于打包在一起。
(如果您的项目没有使用快照依赖项,则可以简化此操作)
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>your.package.MainApp</mainClass>
<packageName>your.package</packageName>
<classpathLayoutType>custom</classpathLayoutType>
<customClasspathLayout>lib/$${artifact.artifactId}.$${artifact.extension}/customClasspathLayout>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<excludeScope>test</excludeScope>
<includeScope>compile</includeScope>
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<configuration>
<attachToBuild>true</attachToBuild>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>