如何在版本包含某个部分的情况下禁止Maven依赖?

时间:2013-10-31 11:10:38

标签: maven maven-enforcer-plugin

我正在尝试使用Maven Enforcer's banned dependencies我要禁止对包含compile的任何工件存在runtime-redhat-依赖关系。背景知识:JEE API和其他东西已经存在于JBoss AS中,并且永远不应该包含在EAR中。

这就是我正在尝试的,但它不起作用:

      <execution>
        <id>banned-dependencies</id>
        <goals>
          <goal>enforce</goal>
        </goals>
        <configuration>
          <rules>
            <bannedDependencies>
              <searchTransitive>false</searchTransitive>
              <excludes>
                <exclude>*:*:*-redhat-*:*:compile</exclude>
                <exclude>*:*:*-redhat-*:*:runtime</exclude>
              </excludes>
            </bannedDependencies>
          </rules>
          <fail>true</fail>
        </configuration>
      </execution>

1 个答案:

答案 0 :(得分:0)

正如你所发现的那样,你不会按照你想要的方式工作。 (我假设你发现强制执行器插件匹配你的pom中列出的所有依赖项?)

问题在于Maven希望version给出一个*或符合maven的Version Spec。 (即1.0[1.0,)等)它无法处理您正在使用的多个通配符。

不幸的是,我真的没有适合你的解决方案。你可能会 Write Your Own Rule并扩展BannedDependencies规则并按照您希望的方式运行。

以下是对导致问题的代码的深入研究

BannedDependencies类中,对exclude字符串中给出的版本进行了以下检查:

if (pattern[2].equals("*") || artifact.getVersion().equals(pattern[2]) ) {
    result = true;
} else {
    try {
        result = AbstractVersionEnforcer.containsVersion(
                VersionRange.createFromVersionSpec(pattern[2]),
                new DefaultArtifactVersion(artifact.getBaseVersion()));
    } catch ( InvalidVersionSpecificationException e ) {
        throw new EnforcerRuleException("Invalid Version Range: ", e);
    }
}

您遇到的具体问题是

AbstractVersionEnforcer.containsVersion(
       VersionRange.createFromVersionSpec(pattern[2]),
       new DefaultArtifactVersion(artifact.getBaseVersion()))

您可以看到由VersionRange引起的VersionRange.createFromVersionSpec()期待。这里的代码可以在这里看到: VersionRange source code