2

我希望使用maven-enforcer 插件bannedDependencies规则来强制执行特定的Spring 版本(3.1.2) 。

这是配置执行器插件以实现这一目标的正确方法吗?

<configuration>
    <rules>
        <bannedDependencies>
            <searchTransitive>true</searchTransitive>
            <excludes>
                <exclude>org.springframework</exclude>
            </excludes>
            <includes>
                <include>org.springframework:*:3.1.2</include>
            </includes>
        </bannedDependencies>
    </rules>
    <fail>true</fail>
    <failFast>true</failFast>
    <ignoreCache>true</ignoreCache>
</configuration>

以上似乎可行,并且mvn enforcer:enforce在命令行上突出显示 v3.1.0 或 org.springframework:spring-oxm 被作为传递依赖项引入。

似乎有人可能想要使用dependencyConvergence规则,但它突出了许多依赖错误,这些错误被maven自动排除为“冲突”。

这是一个包含更多上下文的片段:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>${maven.enforcer.plugin}</version>
            <executions>
                <execution>
                    <id>enforce-versions</id>
                    <goals>
                        <goal>enforce</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                        <rules>
                            <bannedDependencies>
                                <searchTransitive>true</searchTransitive>
                                <excludes>
                                    <exclude>org.springframework</exclude>
                                    <exclude>org.springframework.security</exclude>
                                    <exclude>org.slf4j</exclude>
                                </excludes>
                                <includes>
                                    <include>org.springframework:*:${spring.version}</include>
                                    <include>org.springframework.security:*:${spring-security.version}</include>
                                    <include>org.slf4j:*:${slf4j.version}</include>
                                </includes>
                            </bannedDependencies>
                            <requireJavaVersion>
                                <version>${enforce.jdk.version}</version>
                            </requireJavaVersion>
                        </rules>
                        <fail>true</fail>
                        <failFast>true</failFast>
                        <ignoreCache>true</ignoreCache>
            </configuration>
        </plugin>
 .....
</plugins>
4

1 回答 1

4

上面问题中的bannedDependencies代码段不起作用,因为<include>标签不理解groupId:artifactId:version:type符号。因此,通配符不能用来代替整个部分来表达include all versions of ALL artifacts in a group

但是,通过使用 Maven依赖版本范围,可以强制执行特定的依赖。

给定给定工件的以下版本(按它们发布的顺序):

3.0.0, 3.0.1, 3.1.0, 3.2.0.RELEASE,3.3.0

假设我们想告诉强制插件排除所有内容,但3.2.0.RELEASE唯一的方法是:

exclude versions X where X < DESIRED_VERSION OR X > DESIRED VERSION

以上将有效地意味着: exclude all versions X where X != DESIRED_VERSION

由于 maven 依赖版本表示法不允许使用“非版本”表示法,因此我们必须将小于和大于表示法组合使用,如下所示:

(,3.2.0.RELEASE),(3.2.0.RELEASE,)

这意味着: version < '3.2.0.RELEASE' or version > '3.2.0.RELEASE'

最后,一个有效的片段如下:

<bannedDependencies>
    <searchTransitive>true</searchTransitive>
    <excludes>
        <exclude>org.springframework:*:(,${spring.version}),(${spring.version},)</exclude>    
    </excludes>
</bannedDependencies>
于 2013-01-15T15:17:48.347 回答