2016-02-25 117 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构建中),我会得到我期望的构建失败。

希望能帮助有人试图达到这种隔离水平。它仍然不完美,因为您无法删除中央存储库,并且工件描述符在所有仓库中都应该是相同的,但我们至少有一个最小的支持。

相关问题