我遇到了一个我无法解决的特定问题,如果有任何帮助,我将不胜感激。最初,我在我的 Java 项目中包含了一些 jar 依赖项作为仅工件依赖项。如下所示:
compile "com.example:projectA:1.0.0@jar"
到目前为止,一切都很好。我们称这个项目为“A”。我已经将项目 A 包含在另一个 Java 项目 B 中,再次使用 gradle。我注意到使用 maven-publish 发布的 A 在 B 中使用它时并没有在其 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>
然而,这会导致一系列不同的问题;当以这种方式包含 A 时,使用 compileJava 任务时 eclipse 和 gradle 本身都不能编译项目 B 中的任何代码。连同它的传递依赖,A 本身也消失了。
奇怪的是,根据依赖项任务,它是编译类路径的一部分。
我正在使用带有 eclipse 4.41 的 JRE7 和 gradle 2.3,我们使用 nexus 作为内部 maven 存储库。
我希望我不需要使用传递标志并通过添加所需的排除来手动操作生成的 pom 文件。
使用 dbcp 作为项目 A 重现问题的示例项目:
主.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();
}
}
构建.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
}
}
}