2016-02-25 115 views
0

我正在評估構建公司軟件的maven過程。 我的特殊情況是,所有允許在生產中使用的工件都受到限制。maven從庫定義中排除項目依賴項的插件

批准的庫被維護爲一個特殊的庫(在一個Artifactory實例中)。

儘管最終產品受到限制,我們可能會使用更多的依賴關係來構建(maven插件及其依賴關係具有較小的限制)。

所以我配置了pom中的repository部分和pluginRepository

現在的問題是,所有已解決的工件(針對插件和項目)都只緩存在一個本地資源庫/文件夾中。 如果有人因爲maven-plugin而意外地將編譯依賴項添加到僅存在於高速緩存中的任何項目中,它將在沒有任何警告的情況下使用。

我刪除了本地存儲庫,並重新編譯了測試的項目,並且構建失敗,因爲無法解決的依賴項如預期的那樣失敗。

我在網上搜索過,沒有找到具體的答案。有Maven的分離爲每個庫的本地高速緩存未處理的請求,但似乎只有在被審查的maven 4狀態: https://cwiki.apache.org/confluence/display/MAVEN/Local+Repository+Separation

https://issues.apache.org/jira/browse/MNG-3655 https://issues.apache.org/jira/browse/MNG-4302

的Maven的執行者,插件有樣這裏的概念與bannedDependencies,但這需要一個廣泛的配置開始,並idealy我想跟上目前批准的版本,無需手動交互。

有關於此的任何想法?我錯過了一個配置嗎?

UPDATE1:

好甚至試圖列出在執法插件所有允許的依賴關係,我沒有工作:

<dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.2</version> 
    </dependency> 
    ... 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-enforcer-plugin</artifactId> 
      <version>1.4.1</version> 
      <executions> 
       <execution> 
        <id>enforce-versions</id> 
        <goals> 
         <goal>enforce</goal> 
        </goals> 
        <configuration> 
         <rules> 
          <bannedDependencies> 
           <excludes> 
            <exclude>*:*</exclude> 
           </excludes> 
           <includes> 
            <include>commons-io:commons-io:1.4</include> 
            ... 
           </includes> 
          </bannedDependencies> 
         </rules> 
         <fail>true</fail> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

構建失敗了,但這裏是[INFO] BUILD SUCCESS

更新2:

什麼是更suprising是maven的文檔中的問題已不客氣被固定在3.0版本的變化: https://cwiki.apache.org/confluence/display/MAVEN/Maven+3.x+Compatibility+Notes#Maven3.xCompatibilityNotes-ResolutionfromLocalRepository

從本地的資源庫 的決議Maven 3.x使用的本地存儲庫已得到增強,可以跟蹤遠程存儲庫的工件解決方案。有關工件來源的這些信息用於確保構建只有在配置了正確的存儲庫時才能訪問本地緩存的構件。因此,在使用Maven 3構建時,在其POM中缺少必需的遠程存儲庫的項目可能會失敗。通過消除通過本地存儲庫共享非工件共享的影響,這可以提高構建的可重複性。

+0

我會檢查artifactory,如果它有某種採購(nexus術語),它可以解決這種問題......從字面上定義這個在maven版本中是沒有意義的,任何可以改變pomfile的人都可以改變這一點。 ..最終沒有意義...... – khmarbaise

+0

因爲我瞭解採購功能,您可以將遠程鏡像切換到脫機模式,因此不會下載任何新的依賴關係。這就是我已經 - 我有一個存儲庫,其中包含所有批准在生產應用程序中使用的工件。我遇到的問題是,maven構建需要更多的構件才能使插件自身工作,並且這些依賴關係在客戶端混合,從而導致可能包含不允許使用的artifactes的構建。我需要嚴格分離由編譯器使用的Maven和工件可用的工件。 – dag

+0

Maven當然在使用工件。編譯器是指JDK?否則,它是沒有意義的,因爲maven-compiler-plugin需要的也是工件,否則你不能編譯你的代碼。除此之外,settings.xml可以配置爲分隔maven-plugins和其他通常不會做的工件。 – khmarbaise

回答

0

好吧,我終於明白是什麼引起了我的頭痛。 首先,我想擁有一個自包含的項目。沒有特殊的用戶settings.xml可供運行(如果需要切換,鏡像將阻止其他項目從工作中運行)。

正如我所說我不希望構建使用他不允許的工件,所以我必須重新配置Maven中心,它不會被訪問。 因此,這是我的方法:

<repository> 
    <id>central</id> 
    <url>http://${company-repo-manager}/${project-repository}</url> 
</repository> 
... 
<pluginRepository> 
    <id>central</id> 
    <url>http://${company-repo-manager}/${plugin-repository}</url> 
</pluginRepository> 

我看起來像一個好主意,但有上述問題,以混合來自插件和項目依賴localy緩存的假象。

現在我知道的Maven 3應該引進一種local repo management我在我的本地庫仔細一看,發現了與此內容命名爲_remote.repositories文件:

commons-io-2.2.jar>central= 
commons-io-2.2.pom>central= 

在這裏你可以看到Maven記得存儲庫是一個工件來源,但它記住了存儲庫ID,而不是URL! 正如我配置我的插件存儲庫和我的項目存儲庫都與id central兩個存儲庫的maven混合緩存工件。

的解決方案finaly是嘗試禁用中央存儲庫,以個人名義配置項目和插件庫:

<repository> 
    <id>${project-repository}</id> 
    <url>http://${company-repo-manager}/${project-repository}</url> 
</repository> 
<repository> 
    <id>central</id> 
    <name>Maven Central</name> 
    <url>http://repo1.maven.org/maven2</url> 
    <releases> 
    <enabled>false</enabled> 
    </releases> 
    <snapshots> 
    <enabled>false</enabled> 
    </snapshots> 
</repository> 
... 
<pluginRepository> 
    <id>maven-plugins-repo</id> 
    <url>http://${company-repo-manager}/${plugin-repository}</url> 
</pluginRepository> 
<pluginRepository> 
    <id>central</id> 
    <name>Maven Central</name> 
    <url>http://repo1.maven.org/maven2</url> 
    <releases> 
    <enabled>false</enabled> 
    </releases> 
    <snapshots> 
    <enabled>false</enabled> 
    </snapshots> 
</pluginRepository> 

可惜you can not remove central從分辨率等不同的項目將與地方共建,如果他們互動使用名爲central的存儲庫。

Maven Enforcer是一個插件我仍然會看看,但這至少是我試圖解決的基本配置問題。

如果我從乾淨的緩存開始(例如在CI構建中),我會得到我期望的構建失敗。

希望能幫助有人試圖達到這種隔離水平。它仍然不完美,因爲您無法刪除中央存儲庫,並且工件描述符在所有倉庫中都應該是相同的,但我們至少有一個最小的支持。

相關問題