Séb*_*nec 81 dependencies maven-2 pom.xml maven
我正在尝试找到一种"通用"方法,将传递依赖项排除在外,而不必将其从依赖于它的所有依赖项中排除.例如,如果我想要排除slf4j,我会执行以下操作:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jmx</artifactId>
<version>3.3.2.GA</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.4.0.GA</version>
<type>jar</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这部分是为了清理pom文件,部分是为了避免将来添加依赖于被排除依赖项的依赖项的问题 - 并且忘记排除它.
有办法吗?
Jof*_*fer 60
这有帮助吗?http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html
"假设我想从我的WAR中排除avalon-framework,我会将以下内容添加到我的项目POM中,并提供范围.这适用于所有传递依赖项,并允许您指定一次.
<dependencies>
<dependency>
<artifactId>avalon-framework</artifactId>
<groupId>avalon-framework</groupId>
<version>4.1.3</version>
<scope>provided</scope>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
当在父POM中指定它时,这甚至可以工作,这将阻止项目必须在所有子POM中声明它."
Guu*_*sma 17
我创建了一个空jar并创建了这个依赖项:
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<scope>system</scope>
<systemPath>${basedir}/src/lib/empty.jar</systemPath>
<version>0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
它并不完美,因为从现在开始,你的编译/测试路径中有一个空jar.但这只是化妆品.
扩展dnault的评论:
可以使用Maven Enforcer插件的Banned Dependencies规则来确保排除依赖关系.仍然必须手动排除它们,但如果有人错误地将依赖项添加到其他位置,则构建将失败.
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jmx</artifactId>
<version>3.3.2.GA</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<bannedDependencies>
<excludes>
<exclude>org.slf4j:slf4j-api</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)
还有一个开放的功能请求:MNG-1977全球依赖性排除
提醒一下,这是Maven官方文档的答案:
为什么要排除每个依赖项而不是在POM级别进行排除
这样做主要是为了确保依赖关系图是可预测的,并防止继承效应排除不应排除的依赖关系。如果您采用了不得已的方法并且必须排除在外,则应该绝对确定哪些依赖项带来了该有害的传递性依赖项。
如果要使构建更加健壮,可以使用版本范围。这将确保没有任何新版本的依赖项可以干扰项目。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>[1.4.2,)</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
从配置的类路径或容器中,所有大于等于1.4.2的slf4j-api版本都将被视为在运行时提供(提供)。
参考文献
| 归档时间: |
|
| 查看次数: |
35796 次 |
| 最近记录: |