我正在评估maven建立公司软件的过程。 我的特殊情况是,允许在生产中使用的所有工件都受到限制。
批准的库是一个特殊的repositoy(在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-enforcer-plugin在bannedDependencies处有一个概念,但这需要一个广泛的配置才能开始,并且我希望能够跟上当前批准的版本而无需手动交互
有什么想法吗?我错过了配置吗?
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>
Build应该在这里失败,但是[INFO] BUILD SUCCESS
。
更新2:
更令人惊讶的是,在maven文档中,问题已经解决,需要修复版本3中的更改: https://cwiki.apache.org/confluence/display/MAVEN/Maven+3.x+Compatibility+Notes#Maven3.xCompatibilityNotes-ResolutionfromLocalRepository
本地存储库的解析 Maven 3.x使用的本地存储库已得到增强,可以跟踪工件从哪个远程存储库中解析出来。有关工件源的信息用于确保构建只有在配置了正确的存储库时才能访问本地缓存的工件。因此,在使用Maven 3构建时,POM中缺少所需远程存储库的项目可能会失败。这样可以通过本地存储库消除意外工件共享的影响,从而提高构建的可重复性。
答案 0 :(得分: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混合缓存工件配置我的插件存储库和我的项目存储库。
最终解决方案是尝试禁用中央存储库并使用个人名称配置项目和插件存储库:
<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>
不幸的是{* 3}}来自解决方案,因此如果他们使用名为central的存储库,那么不同的项目将与本地构建进行交互。
Maven Enforcer是一个插件,我仍然会寻找,但这至少是我试图解决的基本配置问题。
如果我从一个干净的缓存开始(例如在CI版本中),我会得到我期望的构建失败。
希望有助于某人尝试达到这种程度的隔离。它仍然不完美,因为你不能删除中央存储库,工件描述符应该在所有存储库中都是相同的,但我们至少有一个最小的支持。