2010-01-14 30 views
50

我使用行家組裝插件來創建我的應用程序的一個罐,包括它的依賴如下包括:Maven 2的裝配用的依賴關係:在範圍「系統」罐子不

<assembly> 
    <id>macosx</id> 
    <formats> 
     <format>tar.gz</format> 
     <format>dir</format> 
    </formats> 
    <dependencySets> 
     <dependencySet> 
      <includes> 
       <include>*:jar</include> 
      </includes> 
      <outputDirectory>lib</outputDirectory> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

(I省略了一些其它與問題無關的東西)

到目前爲止,這工作正常,因爲它創建了一個lib目錄與所有依賴關係。但是,我最近添加了一個新的依賴項,其範圍是system,並且它不會將其複製到lib輸出目錄。我必須在這裏錯過一些基本的東西,所以我請求幫助。

,我剛剛添加的依賴關係是:

<dependency> 
    <groupId>sourceforge.jchart2d</groupId> 
    <artifactId>jchart2d</artifactId> 
    <version>3.1.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath> 
</dependency> 

我能有這種依賴的唯一途徑是通過添加以下到組裝元件:

<files> 
    <file> 
     <source>external/jchart2d-3.1.0.jar</source> 
     <outputDirectory>lib</outputDirectory> 
    </file> 
</files> 

然而,這股勢力我更改POM和程序集文件,只要這個jar被重命名,如果有的話。另外,這似乎是錯誤的。

我試過<scope>runtime</scope>dependencySets<include>sourceforge.jchart2d:jchart2d</include>沒有運氣。

那麼如何在maven 2中將一個system範圍的jar包含到您的程序集文件中?

非常感謝

+0

範圍「運行時」不會更改結果,因爲它是默認值。 – khmarbaise 2011-11-03 06:38:49

+0

我剛把jchart2d推到Maven Central! http://sourceforge.net/news/?group_id=50440 - 享受! – halfdan 2013-02-25 15:34:00

回答

68

我並不感到驚訝,系統範圍的依賴不會被添加(畢竟,與系統範圍的依賴關係必須被明確定義提供)。其實,如果你真的不希望把這種依賴在你的本地庫(例如,由於要其分發作爲項目的一部分),這是我會做什麼:

  • 我會把依賴於項目本地的「文件系統存儲庫」。
  • 我將宣佈該倉庫在我pom.xml這樣的:

    <repositories> 
        <repository> 
        <id>my</id> 
        <url>file://${basedir}/my-repo</url> 
        </repository> 
    </repositories> 
    
  • 我只想宣佈神器沒有system範圍,這僅僅是一個麻煩的來源:

    <dependency> 
        <groupId>sourceforge.jchart2d</groupId> 
        <artifactId>jchart2d</artifactId> 
        <version>3.1.0</version> 
    </dependency> 
    

我不是100%確定這將滿足您的需求,但我認爲這是比使用系統範圍更好的解決方案。

更新:我應該提到,在我原來的答案,我現在正在修復它。要安裝在基於文件的存儲庫中的第三方庫,使用install:install-filelocalRepositoryPath參數:

mvn install:install-file -Dfile=<path-to-file> \ 
         -DgroupId=<myGroup> \ 
         -DartifactId=<myArtifactId> \ 
         -Dversion=<myVersion> \ 
         -Dpackaging=<myPackaging> \ 
         -DlocalRepositoryPath=<path-to-my-repo> 

您可以將此作爲在* nix的外殼。在窗口上,刪除「\」並將所有內容放在一行上。

+0

絕妙的主意,我會嘗試。 – YuppieNetworking 2010-01-15 09:53:39

+1

它確實有效,但將文件安裝到不同於$ HOME/.m2/repository的本地存儲庫中並不是一項簡單的任務。 我不得不做一個mvn安裝:安裝文件[...安裝文件選項...] -Dmaven.repo.local = path_to_my_local_repo這迫使maven下載其最基本的插件。你能建議如何安裝文件到這個本地回購? – YuppieNetworking 2010-01-15 13:43:49

+0

我應該提到的是:)我會在本地回購('〜/)中安裝神器。m2/repository')用'install:install-file',然後將目錄樹移動到'$ {basedir}/my-repo'。我只是從'$ {basedir}/my-repo'中刪除不需要的東西。 – 2010-01-15 14:16:31

19

順便說一句,你可以自動執行它,並讓它成爲你Maven構建的一部分。下面將安裝您的罐子到你的本地庫編譯之前:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-install-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>hack-binary</id> 
        <phase>validate</phase> 
        <configuration> 
         <file>${basedir}/lib/your-lib.jar</file> 
         <repositoryLayout>default</repositoryLayout> 
         <groupId>your-group</groupId> 
         <artifactId>your-artifact</artifactId> 
         <version>0.1</version> 
         <packaging>jar</packaging> 
         <generatePom>true</generatePom> 
        </configuration> 
        <goals> 
         <goal>install-file</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+0

它不支持同時安裝多個文件嗎? – 2010-09-22 16:04:28

+0

哇,這真是太棒了!非常感謝! @Tuukka Mustonen你必須複製 ...部分爲每個文件 – timaschew 2011-09-25 13:35:59

+5

不幸的是,這是行不通的。我也來到了這個解決方案,認爲它似乎是最簡單的,但Maven要求在執行與validate階段相關的插件(比如'compile'等等)之前解決所有依賴關係。因此一旦安裝了這個工件,它將重新安裝它,但它不會進行初始安裝 - 這是一個雞/蛋問題。一個_could_將它綁定到'clean'階段(因爲它不需要先依賴解析),並告訴開發人員首先運行'mvn clean',但不再使用「標準過程」。 – Chadwick 2011-10-12 18:35:09

14

我找到簡單的解決方案的情況下,你創建的jar

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <configuration> 
    <webResources> 
    <resource> 
     <directory>dependencies/mydep</directory> 
     <targetPath>WEB-INF/lib</targetPath> 
     <filtering>true</filtering> 
     <includes> 
      <include>**/*.jar</include> 
     </includes> 
    </resource> 
    </webResources> 
</configuration> 
</plugin> 
+3

這更簡單了......爲什麼要添加到本地回購等? – 2012-04-11 20:41:16

+0

這是一個快速完成任務的骯髒方法。謝謝。有一天,世界將全部成爲maven,但在此之前,這將拯救我們的生命。 – Jacob 2014-06-04 05:33:43

+0

恕我直言,它會更安全的過濾:假 – ATorras 2015-03-29 16:14:20

4

您還可以通過在你的dependencySets添加補充dependencySet處理這個問題。

<dependencySet> 
    <scope>system</scope> 
    <includes> 
    <include>*:jar</include> 
    </includes> 
    <outputDirectory>lib</outputDirectory> 
</dependencySet> 

最好的辦法是使用一個倉庫管理器(如Nexus,Artifactory的,Archiva),並在特定的倉庫安裝了這種依賴。之後,你可以使用這種簡單的依賴關係。這將簡化你的生活。

文檔:https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

1

編輯:對不起,我不知道ALX還提到關於清理生命週期的解決方法。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-install-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>hack-binary</id> 
      <phase>clean</phase> 
      <configuration> 
       <file>${basedir}/lib/your-lib.jar</file> 
       <repositoryLayout>default</repositoryLayout> 
       <groupId>your-group</groupId> 
       <artifactId>your-artifact</artifactId> 
       <version>0.1</version> 
       <packaging>jar</packaging> 
       <generatePom>true</generatePom> 
      </configuration> 
      <goals> 
       <goal>install-file</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

基於alx提供的解決方案,您可以在清理階段執行安裝文件步驟。但由於清理階段沒有處於默認生命週期,因此您必須在第一時間執行mvn clean以確保罐在本地回購中已準備就緒。

例如:MVN清潔; MVN包

2

這樣做的一個簡單的解決方案是將其添加到本地的倉庫做

一種方式是通過MVN安裝命令,在以前的帖子建議。

另一個簡單的方法是, 1)在Eclipse IDE中右鍵點擊項目選擇Maven的選項。 2)選擇安裝或部署工件到Maven存儲庫選項,然後單擊下一步。 3)點擊瀏覽旁邊的神器文件複選框&選擇你的jar文件 4)輸入groupId和artifactId和version確保產生POM &創建校驗和檢查&包裝罐子

單擊Finish,Wallah! !您的工作已完成將jar添加到您的本地存儲庫中,您可以在setting.xml或m2目錄中定義這個jar文件

現在只需添加簡單的maven依賴項,根據您輸入的GroupId,ArtifactId & jar版本導入,這就是你的外部jar將由maven打包。

+0

感謝您的幫助。它對我來說非常好,而且比這裏給出的其他方式更容易。乾杯:) – 2015-10-26 14:43:58