2009-02-20 33 views
47

我剛剛開始使用Maven(對它進行評估),我需要能夠快速生成用於我的應用程序的JAR文件以及包含所有依賴關係(例如,lib)的目錄,以便我可以部署這兩個將以獨立的方式運行。使用適當的清單生成JAR文件很容易,但我不知道如何讓Maven將當前項目的依賴項複製到我可以部署的lib目錄中。Can Maven是否可以收集項目的所有相關JAR以幫助進行應用程序部署?

由於這是一個獨立的Java應用程序,我對而不是感興趣部署到Maven存儲庫,這也相當微不足道,或者至少很容易googleable。

我已經發現如何做所有的事情,除了複製依賴的JAR文件到一些指定的目錄。這就是我要找的工作流程:

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

然後,運行從installLocation作爲一個JAR文件myApp.jar應該「只是工作」無論我$CLASSPATH的。

要嘗試和搶先一些答案:

  • 我有一個主類:集,並能正常工作。
  • 我也在MANIFEST.MF中設置了類路徑,而且工作正常。
  • 我已經發現如何使用<classpathPrefix><classpathMavenRepositoryLayout>來完成這項工作 - 但僅限於我的機器上。 (via:<classpathPrefix>${settings.localRepository}</classpathPrefix>

回答

73

你想調查的是Maven's dependency plugin。添加類似於以下到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複製執行復制。將此與assembly plugin結合在一起,您可以將所有內容打包到一個自包含的存檔中進行分發。

+0

將此添加到我的Eclipse內部的pom.xml。沒有什麼反應 – 2018-01-17 14:03:40

3

它當然可以。你需要使用shade plugin這可以通過添加

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

到您的項目。

6

然而,另外一個是appassembler plugin
我喜歡它,它包在準備使用窗體應用程序(使用.bat文件ANS等)

7

我沒有照顧陰影插件,因爲它將所有罐子中的所有包裝捲起來。

要包含所有外部庫,您可以使用上述的依賴項插件。

本示例將在「包」階段之前在「target/classes」下創建一個「lib」目錄。

 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
    <execution> 
     <id>copy-dependencies</id> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>target/classes/lib</outputDirectory> 
     <overWriteIfNewer>true</overWriteIfNewer> 
     <excludeGroupIds> 
      junit,org.hamcrest,org.mockito,org.powermock,${project.groupId} 
     </excludeGroupIds> 
     </configuration> 
    </execution> 
    <execution> 
     <phase>generate-sources</phase> 
     <goals> 
     <goal>sources</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <verbose>true</verbose> 
    <detail>true</detail> 
    <outputDirectory>${project.build.directory}</outputDirectory> 
    </configuration> 
</plugin> 
2

看看maven的依賴插件,特別是複製依賴目標。用法部分描述瞭如何完成你想要的。

要通過命令行這樣做只是做:

$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR 
-1

使用maven.repo.local一個可以收集所有的罐子,但是,他們收集到使用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/ 
相關問題