Gradle:在 Eclipse 类路径中可见子项目的依赖项

Adr*_*ian 7 java eclipse multi-project gradle

我最近在我们现有的 Web 项目中添加了 Gradle 性质。该项目本身是一个分层的java项目

Common - DataAccess - Business - Web
                              \- Batch
Run Code Online (Sandbox Code Playgroud)

在我们使用之前,我们手动管理了项目的依赖关系,只将必要的库添加到每个项目中。

为了支持我们的项目结构,我创建了一个 gradle 多项目:

root
 +-- build.gradle
 +-- settings.gradle
 +-- Common
      +-- build.gradle
 +-- DataAccess
      +-- build.gradle
 +-- Business
      +-- build.gradle
 +-- Web
      +-- build.gradle
 +-- Batch
      +-- build.gradle
Run Code Online (Sandbox Code Playgroud)

这些文件基本上看起来像这样(当然是缩短的)

通用 -> build.gradle

    [...]
    implementation 'javax.money:money-api:1.0.3'
    implementation 'org.slf4j:slf4j-log4j12:1.7.5'
    testImplementation 'org.springframework:spring-test:4.3.13.RELEASE'
    [...]
Run Code Online (Sandbox Code Playgroud)

数据访问 -> build.gradle

dependencies {
    [...]
    api project(':Common')
    implementation 'javax.money:money-api:1.0.3'
    implementation 'org.slf4j:slf4j-log4j12:1.7.5'
    implementation 'org.hibernate:hibernate-core:5.2.14.Final'
    implementation 'org.hibernate:hibernate-jcache:5.2.14.Final'
    implementation 'org.springframework.data:spring-data-jpa:1.11.9.RELEASE'
    testImplementation 'org.springframework:spring-test:4.3.13.RELEASE'
    [...]
}
Run Code Online (Sandbox Code Playgroud)

业务 -> build.gradle

dependencies {
    [...]
    api project(':DataAccess')
    implementation 'org.slf4j:slf4j-log4j12:1.7.5'
    implementation 'com.google.guava:guava:25.1-jre'
    implementation 'com.googlecode.java-ipv6:java-ipv6:0.16'
    testImplementation 'org.springframework:spring-test:4.3.13.RELEASE'
    [...]
}
Run Code Online (Sandbox Code Playgroud)

等等。到目前为止没问题,gradle 构建执行没有任何错误。

但是用gradle创建eclipse项目和类路径文件后,Business项目的类路径中包含了其子项目的所有库。起初这并不是一个大问题,但这允许开发人员使用 gradle 不可用的库。这可能会导致稍后在构建服务器上出现构建错误。

当然,我可以使用 api 而不是实现来添加所有依赖项,但是应该有一个在每一层上使用哪些东西的合同,对吧?在业务中甚至更糟糕的是在Web层访问hibernate/mysql库是没有意义的。

有没有办法阻止gradle将子项目的库添加到eclipse类路径中?

更新2019-10-16

试图走另一条路。我没有使用 API,而是使用自定义配置来导入子项目:

根项目 build.gradle:刚刚走了另一条路,但我还没有能够解决问题。在根构建项目中,我添加了以下内容:

allprojects {
    configurations {
        warOnly
        warOnly.transitive = false
        compile.extendsFrom(warOnly)
    }
    eclipse
    {
        classpath {
            minusConfigurations += [ configurations.runtimeClasspath, configurations.testRuntimeClasspath ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并切换自

api project(':Common')
Run Code Online (Sandbox Code Playgroud)

warOnly project(':subprojectname')
Run Code Online (Sandbox Code Playgroud)

然而,这似乎也从compileClasspath中删除了所有依赖项。不是一个可行的解决方案。