我遇到了一个我无法解决的特殊问题,将不胜感激。
最初,我在Java项目中包括了一些jar依赖项作为仅 Artifact 的依赖项。
如下所示:
compile "com.example:projectA:1.0.0@jar"
到现在为止还挺好。我们将此项目称为“A”。我再次使用gradle将项目A包含在另一个Java项目B中。我注意到,在B中使用A时,使用maven-publish发布的A在其pom文件中并未排除其所有传递依赖项。
所以我开始使用传递标志:
dependency("com.example:projectA:1.0.0") {
transitive = false
}
这可以确保在项目B中,使用eclipse插件和gradle本身时,我排除了A的所有可传递部门。
但是仍然存在已发布pom.xml中缺少排除项的问题。
然后我发现这个问题似乎在撰写本文时以及我的gradle版本中已解决:GRADLE-2945
所以我尝试了以下方法:
dependency("com.example:projectA:1.0.0") {
exclude group: '*'
}
现在,根据maven doc,pom文件正确具有所需的用于传递依赖项的排除规则:
<groupId>com.example</groupId>
<artifactId>projectA</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
但是会导致一系列不同的问题。使用compileJava任务时,eclipse或gradle本身都不能在Project B中以这种方式包含A时编译任何代码。随着它的传递依存关系,A本身也消失了。
但是奇怪的是,根据依赖项任务,它是编译类路径的一部分。
我正在使用带有Eclipse 4.41的JRE7和Gradle 2.3,并且我们使用nexus作为内部Maven存储库。
我希望我不需要使用传递标记并通过添加所需的排除项来手动操作生成的pom文件。
使用dbcp作为项目A重现该问题的示例项目:
Main.java:
import org.apache.commons.dbcp.BasicDataSource;
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
BasicDataSource ds = new BasicDataSource();
}
}
build.gradle:
version = '0.0.1'
group = 'com.example'
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'maven-publish'
repositories {
mavenCentral()
}
dependencies {
compile ('commons-dbcp:commons-dbcp:1.4')
{
transitive=false
}
// {
// exclude group: '*'
// }
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
最佳答案
我认为这可能是Gradle中的错误。我从命令行使用Gradle 2.3和2.5测试了示例文件。如果我使用transitive = false
,则两个版本都可以很好地编译项目。切换到exclude group: '*'
语法会导致2.3版本中断。 Gradle 2.5仍然可以正常工作。
简而言之,Gradle升级应该可以解决您的问题。
关于gradle - 当排除所有传递依赖项时,Gradle会排除self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31562948/