Maven可以收集项目的所有依赖JAR,以帮助部署应用程序吗?

我刚刚开始使用Maven (真正的评估它),我需要能够为我的应用程序和一个具有所有依赖关系的目录(例如lib)快速生成一个JAR文件,以便我可以部署这两个以独立的方式运行。 使用适当的清单生成JAR文件很容易,但我不知道如何让Maven将当前项目的依赖项复制到我可以部署的lib目录中。

由于这是一个独立的Java应用程序,所以我对将其部署到Maven存储库感兴趣,这也相当微不足道,或者至less很容易googleable。

我已经find了如何做一切事情, 除了复制依赖的JAR文件到一些指定的目录。 这是我正在寻找的工作stream程:

 $ mvn clean $ mvn package $ cp -r target/{lib,myApp.jar} installLocation 

然后,作为JAR文件从installLocation运行myApp.jar应该“只是工作”,不pipe我的$CLASSPATH

尝试抢先一些答案:

  • 我有一个主要的类:设置,它工作正常。
  • 我也在MANIFEST.MF中设置了类path,而且工作正常。
  • 我已经发现如何使用<classpathPrefix><classpathMavenRepositoryLayout>来使这个工作,但只在我的机器上。 (通过: <classpathPrefix>${settings.localRepository}</classpathPrefix>

你想调查的是Maven的依赖插件 。 向pom.xml添加类似于以下内容的内容:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <configuration> <outputDirectory> ${project.build.directory} </outputDirectory> </configuration> </plugin> 

然后运行mvn clean dependency:copy-dependencies来复制执行副本。 把这个和汇编插件结合起来,你可以把所有的东西都打包成一个独立的文件夹来分发。

我并不关心Shade插件,因为它把所有jar子里的所有包装都放在一起。

要包含所有的外部库,你可以使用上面提到的依赖插件。

这个例子将在“包”阶段之前在“target / classes”下创build一个“lib”目录。

 <插件>
   <的groupId> org.apache.maven.plugins </的groupId>
   <artifactId的>行家依赖性-插件</ artifactId的>
   <版本> 2.6 </版本>
   <处决>
     <执行>
       <ID>复制的依赖关系</ ID>
       <阶段>制备封装</相位>
       <目标>
         <目标>复制的依赖关系</目标>
       </目标>
       <结构>
         <输出目录>目标/类/ lib中</输出目录>
         <overWriteIfNewer>真</ overWriteIfNewer>
         <excludeGroupIds>
           JUnit中,org.hamcrest,org.mockito,org.powermock,$ {} project.groupId
         </ excludeGroupIds>
       </configuration>
     </执行>
     <执行>
       <阶段>产生来源</相位>
       <目标>
         <目标>的来源</目标>
       </目标>
     </执行>
   </处决>
   <结构>
     <详细>真</冗长>
     <详细>真</细节>
     <输出目录> $ {project.build.directory} </输出目录>
   </configuration>
 </插件>

还有一个是组装者插件
我喜欢的是它将应用程序打包成可以使用的forms(带有.bat文件等)

当然可以。 你需要使用可以通过添加完成的阴影插件

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.3-SNAPSHOT</version> <configuration> <!-- put your configurations here --> </configuration> </plugin> 

到你的项目。

看看maven的依赖插件,特别是复制依赖目标。 用法部分描述了如何做到你想要的。

要从命令行执行操作,请执行以下操作:

 $ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR 

使用maven.repo.local可以收集所有的jar文件,但是它们被收集到一个带有maven层次结构(.m2)的目录中。

 mvn install -Dmaven.repo.local=./pick/some/folder 

然后你可以收集它们(在Linux上):

 mkdir flat-repo find ./pick/some/folder -type f -name "*.jar" | xargs -I'{}' cp '{}' flat-repo/