我正在评估构建公司软件的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