3

我正在尝试使用Maven Enforcer 的禁止依赖项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>
4

1 回答 1

2

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

问题是 Maven 期望version给定的要么是单一的,要么*符合 Maven 的Version Spec。(即1.0[1.0,))它无法处理您正在使用的多个通配符。

不幸的是,我真的没有适合你的解决方案。您可能会 编写自己的规则并扩展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 源代码

于 2013-10-31T14:41:29.590 回答