2011-03-14 57 views
12

因此,我有一個戰爭項目,其中有幾個依賴jar,這些jar在任何版本庫中都不可用。直到最近,我一直在src/main/webapp/WEB-INF/lib,並將它們添加到與system scope pom。Maven:在項目版本控制中保留相關的jar文件

我明白這是有問題的,所以我正在尋找清理我的構建。我已經通過install:install-file插件將這些罐子半手動安裝到我的.m2/repository中。這對我來說很好,但我的團隊中的其他人呢?我們很小,設置Nexus對我們來說不是一個真正的選擇。我已經使用pom.xml來解釋如何爲每個罐子運行install:install-file

我與install:install-file解決好了,但我仍想包括在我的項目的版本控制這些文物,而不是僅僅讓他們灑我的文件系統。

他們留在src/main/webapp/WEB-INF/lib不起作用,因爲這會自動將它們添加到導致戰爭神器(題外話:如果行家只會繼續前進,把它們添加到這裏的classpath中我會做,無需安裝:安裝文件)

問:有在Maven目錄佈局的批准地方,我可以掖這些.jar文件,只是這樣我就可以讓他們爲我的項目的一部分嗎?

我不知道這是怎麼回事這裏 - Maven是試圖保持依賴jar 我的身材之外這樣,當其他項目依賴於我的生成,使其能夠解決的傳遞依賴。對於進入公共maven回購站的開源項目來說,這非常好,但我敢打賭,絕大多數使用Maven的人正在從事諸如此類的「葉子」項目工作,並且擁有一個方法非常方便將jar文件作爲項目的一部分,而不用跳過這麼多的箍。

+3

設置Nexus是很容易的。我有一個實例在家裏爲自己運行。 – ColinD 2011-03-14 16:07:46

+0

用nexus創建一個本地倉庫太過於矯枉過正?你可以用它代理所有的maven回購站並保留這些第三方的罐子。 – Augusto 2011-03-14 16:09:15

+3

當然,我可以安裝Nexus。但之後我不得不要求每個接觸這個項目的人都這樣做。或者將其設置在服務器上,備份它,擔心安全性等。它似乎是處理一些定製jar文件的非常麻煩的解決方案。 – 2011-03-14 17:09:58

回答

5

如果設置的Nexus或只是一個簡單的文件服務器回購揚的建議是真的太麻煩了,這裏有一些其他的選項:

  • 只需包括JAR文件,並且將它們安裝腳本全部放在您選擇的版本控制目錄中。 Maven結構無需對其進行處理。
  • 使用您的版本控制系統作爲存儲庫的主機,既可以在您的主項目的分支上,也可以作爲單獨的項目。讓任何已經用於版本控制的備份,安全性等應用於存儲庫,而不在實際正在簽出和提交的文件集中包含jar。
  • 將jar包含在一個文件夾中,該文件夾充當與其餘代碼簽出的小型存儲庫。讓pom.xml指向該文件夾作爲它使用的存儲庫。我不是100%肯定這是可能的,但它似乎是可能的。
+0

我們按照你的第一個建議。 Maven不支持你最後的建議。 – 2011-03-14 18:12:35

+0

+1:最後的建議似乎也可以使用(使用Maven 2.2.1)。 – Lars 2011-03-14 22:01:49

+2

我幾乎想給你一個+1,只是爲了不迴應「但實際上,設置Nexus並不困難。」 :-)在一些(許多?)項目中設置像Nexus這樣的工具根本不是一種選擇。如果您沒有團隊/資源像維護您的源代碼回購一樣仔細維護該外部存儲庫,那麼將主題保存在主源代碼回購之外並不是一個好主意。使用ant的人只是在lib目錄中放入jar文件,他們就完成了。我經常希望Maven會採用「簡單的事情應該很簡單」的口頭禪。感謝您的答覆。 – 2011-03-20 23:34:50

2

我認爲你的情況最好的解決方案將是建立一個內部存儲庫。首先不需要設置整個Nexus。任何簡單的網絡服務器都將是足夠的或共享文件夾的地方。

檢查Maven DOC如何設置內部存儲庫。

+0

但是如果內部存儲庫不是一個選項呢? – Lars 2011-03-14 17:37:36

+2

Maven包含install:install-file就是爲了這個目的。將〜/ .m2/repository放到/ network/maven/repository有多難?也許nexus是矯枉過正,也許HTTP是矯枉過正,但文件服務器?這些如何不是一種選擇? – 2011-03-14 17:45:38

+1

@Chris在一個足夠複雜的公司中,源控制服務器可能是所有相關方都可訪問的唯一服務器;儘管長期內部的maven倉庫可能是最好的選擇,但需要一些東西來彌合這個過渡期。 – Lars 2011-03-14 17:53:01

2

在我的公司我們使用的是Archiva,它是目前爲止最簡單的Repository Manager設置和維護。特別是如果你使用獨立版本。每位開發人員只需在其~/.m2/settings.xml文件中設置profile以指向內部存儲庫。如果這太麻煩了,只需將<repositories/>中的內部存儲庫直接放入pom.xml即可,但這是非常糟糕的做法。如果存儲庫網址不斷移動,則必須更新所有項目pom.xml文件。在使用settings.xml時,開發人員需要更新其本地配置。

<?xml version="1.0" encoding="UTF-8"?> 
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 
    <profiles> 
     <profile> 
      <id>internal</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
      </activation> 
      <repositories> 
       <repository> 
        <id>mycompany.internal</id> 
        <name>Internal Release Repository</name> 
        <url>http://maven.mycompany.com/repository/internal/</url> 
        <releases> 
         <enabled>true</enabled> 
        </releases> 
        <snapshots> 
         <enabled>false</enabled> 
        </snapshots> 
       </repository> 
       <repository> 
        <id>mycompany.snapshots</id> 
        <name>Internal Snapshot Repository</name> 
        <url>http://maven.mycompany.com/repository/snapshots/</url> 
        <releases> 
         <enabled>false</enabled> 
        </releases> 
        <snapshots> 
         <enabled>true</enabled> 
        </snapshots> 
       </repository> 
      </repositories> 
     </profile> 
    </profiles> 


    <servers> 
     <server> 
      <id>internal</id> 
      <username>guest</username> 
     </server> 
     <server> 
      <id>snapshots</id> 
      <username>guest</username> 
     </server> 
    </servers> 

</settings> 

如果建立一個倉庫管理器是太麻煩了,我想你需要手動添加的東西替代重新用手本地資源庫,這是非常容易出錯且費時。我爲我的個人開發運行Archiva實例,僅僅因爲它很容易添加release插件並管理版本,而不必記住在每臺計算機上向本地存儲庫添加內容所需的所有神祕的-D選項。複製~/.m2/settings.xml文件是非常容易的,如果它在一臺機器上運行,它可以在所有機器上運行。

以下是添加到您的pom.xml以啓用自動執行發佈並將工件推送到存儲庫的示例,在我的示例中爲Archiva。

<distributionManagement> 
    <repository> 
     <id>internal</id> 
     <name>Internal Archiva Repository</name> 
     <url>http://maven.mycompany.com/repository/internal/</url> 
     <layout>default</layout> 
     <uniqueVersion>false</uniqueVersion> 
    </repository> 
    <snapshotRepository> 
     <id>snapshots</id> 
     <name>Internal Archiva Repository</name> 
     <url>http://maven.mycompany.com/repository/snapshots/</url> 
     <layout>default</layout> 
     <uniqueVersion>false</uniqueVersion> 
    </snapshotRepository> 
</distributionManagement> 

然後你要做的就是mvn clean release:prepare自動更新您的pom.xml版本支票標籤和可選分支釋放,包中的所有文物,然後mvn release:perform的假象推送到遠程的存儲庫並檢入新版本的pom.xml,並且您已準備好開始下一個版本的開發。

快照得snaphots併發布到internal在發佈插件自動運行。你必須配置SCM插頭爲好,但就是配置的短短的幾行,你只需要輕觸一下,以及。

這是它看起來像git的,我們使用Gitorious作爲我們的Git倉庫經理

<scm> 
    <connection>scm:git:git://gitorious.mycompany.com:myproject/myproject.git</connection> 
    <developerConnection>scm:git:ssh://[email protected]/myproject/myproject.git</developerConnection> 
    <url>http://gitorious.mycompany.com/myproject/myproject</url> 
</scm> 

運行Linux可以處理存儲庫的職責是這樣一個開發團隊,而無需涉及採購的舊臺式電腦和IT。

2

我在現實生活中並沒有使用過它,但它似乎在工作:只需將源代碼佈局粘貼到源代碼樹中(使用install:install-file,我想)並檢查它。指向那個回購。 POM像這樣:

<?xml version="1.0" encoding="utf-8"?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 
    <name>Depending project</name> 

    <groupId>com.example</groupId> 
    <artifactId>dependent</artifactId> 
    <version>0.9</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>dependency</artifactId> 
     <version>0.9.3</version> 
     <type>jar</type> 
    </dependency> 
    </dependencies> 

    <repositories> 

    <repository> 
     <id>project-specific-deps</id> 
     <name>project-specific-deps</name> 
     <url>file:///${basedir}/repo</url> 
    </repository> 

    </repositories> 

</project> 

實例樹,像這樣:

. 
|-- pom.xml 
|-- repo 
| `-- com 
|  `-- example 
|   `--dependency 
|    |-- 0.9.3 
|    | |-- dependency-0.9.3.jar 
|    | |-- dependency-0.9.3.jar.md5 
|    | |-- dependency-0.9.3.jar.sha1 
|    | |-- dependency-0.9.3.pom 
|    | |-- dependency-0.9.3.pom.md5 
|    | `-- dependency-0.9.3.pom.sha1 
|    |-- maven-metadata.xml 
|    |-- maven-metadata.xml.md5 
|    `-- maven-metadata.xml.sha1 
|-- src 
| `-- main 
|  `-- java 
|   `-- com 
|    `-- example 
|     `-- dependent 
|      `-- Foobar.java 

你覺得如何?

出於完整性:

$ mvn -version 
Apache Maven 2.2.1 (rdebian-4) 
Java version: 1.6.0_20 
Java home: /usr/lib/jvm/java-6-sun-1.6.0.20/jre 
Default locale: sv_SE, platform encoding: ISO-8859-1 
OS name: "linux" version: "2.6.32-3-686" arch: "i386" Family: "unix" 
3

那裏有許多已經很好的答案,你應該認真考慮您的組建立一個倉庫管理器,如Archiva,因爲它會無論是現在還是在提供其他好處時間。

然而,直接回答你的問題,這裏是存儲在版本控制Maven的依賴模式:http://brettporter.wordpress.com/2009/06/10/a-maven-friendly-pattern-for-storing-dependencies-in-version-control/

請記住,它限制了該項目所使用的警告自足本身 - 如果您開始希望將其作爲其他Maven項目的依賴項共享,您仍然需要設置存儲庫。

相關問題