如何在Maven中从父项目中排除依赖项?

Sma*_*key 30 java maven

例如,我有2个Maven项目.一个是"项目 - 父母".另一个是"项目孩子".显然,"项目 - 孩子"是"项目 - 父母"的子项目.

"project-parent"具有log4j的依赖关系.但是我想把它从"项目孩子"中排除.有办法吗?

你可能会说我应该将log4j从"project-parent"移动到"project-child".这是完全正确的.但我的假设是我不能修改"项目 - 父母"的POM.

提前致谢.

Mat*_*ell 13

我不知道实际排除依赖关系的方法,但您可以将其从目标分发中排除,但这有点像黑客攻击.您需要将依赖项的范围更改为可以在最终分发中排除的内容.

所以,说我父母对junit 4.8的依赖,在我的pom中你说:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.8</version>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

所以我们正在改变提供的范围.有关其工作原理的说明,请参阅我在注释处理期间NoClassDefFoundError:org/junit/AfterClass的回答.不幸的是,这不会影响构建,但是当您复制最终分发的依赖项时,可以使用excludeScope配置元素不将依赖项复制到最终分发中:

<plugin>
<artifactId>maven-dependency-plugin</artifactId>

<executions>
    <execution>
        <id>copy-libs</id>
        <phase>package</phase>
        <goals>
            <goal>copy-dependencies</goal>
        </goals>
        <configuration>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
            <excludeScope>provided</excludeScope>
        </configuration>
    </execution>
Run Code Online (Sandbox Code Playgroud)


Adr*_*hum 12

我认为在Maven2中没有办法实现这一点,因为这就是POM继承的用途.但是我可以想到一个技巧:

假设您有权将工件上载到内部工件存储库.您可以创建一个空JAR,将其部署为log4j:log4j,具有明显异常的版本(例如log4j:log4j:9999).在project-child中添加这样的依赖项.然后它将覆盖parent的依赖关系取决于实际上为空的JAR.

  • 旁注:某人正在做类似的事情,并为此类“空”工件提供了公共存储库(http://version99.qos.ch/)。他们使用`99-empty`作为版本。人们认为我建议的方法可以将此作为惯例。 (2认同)