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中删除了所有依赖项。不是一个可行的解决方案。
| 归档时间: |
|
| 查看次数: |
1064 次 |
| 最近记录: |