我正在評估構建公司軟件的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中缺少必需的遠程存儲庫的項目可能會失敗。通過消除通過本地存儲庫共享非工件共享的影響,這可以提高構建的可重複性。
我會檢查artifactory,如果它有某種採購(nexus術語),它可以解決這種問題......從字面上定義這個在maven版本中是沒有意義的,任何可以改變pomfile的人都可以改變這一點。 ..最終沒有意義...... – khmarbaise
因爲我瞭解採購功能,您可以將遠程鏡像切換到脫機模式,因此不會下載任何新的依賴關係。這就是我已經 - 我有一個存儲庫,其中包含所有批准在生產應用程序中使用的工件。我遇到的問題是,maven構建需要更多的構件才能使插件自身工作,並且這些依賴關係在客戶端混合,從而導致可能包含不允許使用的artifactes的構建。我需要嚴格分離由編譯器使用的Maven和工件可用的工件。 – dag
Maven當然在使用工件。編譯器是指JDK?否則,它是沒有意義的,因爲maven-compiler-plugin需要的也是工件,否則你不能編譯你的代碼。除此之外,settings.xml可以配置爲分隔maven-plugins和其他通常不會做的工件。 – khmarbaise