我遇到了一个我无法解决的特定问题,如果有任何帮助,我将不胜感激。 最初我在我的Java项目中包含了一些jar依赖项作为工件唯一的依赖项。 这看起来如下:
compile "com.example:projectA:1.0.0@jar"
到目前为止一切顺利。我们称这个项目为'A'。我已将项目A包含在另一个Java项目B中,再次使用gradle。我注意到,使用maven-publish发布的A在其pom文件中并未排除其在B中使用它时的所有传递依赖性。
所以我开始使用传递标志:
dependency("com.example:projectA:1.0.0") {
transitive = false
}
这确保在项目B中,我在使用eclipse插件时自己排除了A的所有传递deps并自行学习。
然而已发布的pom.xml中缺少排除的问题仍然存在。 然后我发现这个问题似乎在撰写本文和我的gradle版本时得到了解决:GRADLE-2945
所以我尝试了以下内容:
dependency("com.example:projectA:1.0.0") {
exclude group: '*'
}
pom文件现在根据maven doc正确地具有传递依赖项的所需排除规则:
<groupId>com.example</groupId>
<artifactId>projectA</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
然而会导致一系列不同的问题;在使用compileJava任务时,eclipse和gradle都不能在以这种方式包含A时编译Project B中的任何代码。随着它的传递依赖性,A本身就消失了。
奇怪的是,根据 dependencies 任务,它是编译类路径的一部分。
我正在使用JRE7和gradle 2.3与eclipse 4.41,我们使用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
}
}
}
答案 0 :(得分:1)
感谢@Peter Ledbrook让我看看其他版本。似乎这个bug已知并在gradle 2.4中修复。 GRADLE-3243 我想我没有深入挖掘。有点令人烦恼的是,2.3的gradle发行说明中的“已知问题”部分没有提到该错误。
如上所述,gradle的简单升级应该可以解决问题。
答案 1 :(得分:0)
我认为这可能是Gradle中的一个错误。我从命令行使用Gradle 2.3和2.5测试了您的示例文件。如果我使用List list1 = Arrays.asList("a","b","c"); // works perfectly
,两个版本都可以很好地编译项目。切换到transitive = false
语法会导致2.3版本中断。 Gradle 2.5继续正常工作。
简而言之,Gradle升级应解决您的问题。