TL;DR 我希望将模块的依赖项内置到其 .jar 中,但事实似乎并非如此。
我正在使用 Gradle 构建一个项目。我有两个子项目,app
(Android 模块)和tests
(Java 模块),由 IntelliJ 创建。
因为我想使用中定义的类app
的内容中tests
,我添加了适当的依赖项。灵感来自这个答案,我有以下设置:
应用程序/build.gradle:
...
task jarTask(type: Jar) {
baseName ="${project.archivesBaseName}"
from android.sourceSets.main.java
}
configurations {
jarConfiguration
}
artifacts {
jarConfiguration jarTask
}
测试/build.gradle
...
dependencies {
...
testCompile project(path: ':app', configuration: 'jarConfiguration')
}
然而,其中一堂课app
进口org.json.JSONObject
。由于这是由 Android SDK 提供的,app
可以找到它很好 - 但是当我尝试运行测试时,我得到(:tests:compileTestJava
)“org.json 包不存在”。但是,如果我将tests/build.gradle更新为
...
dependencies {
...
testCompile project(path: ':app', configuration: 'jarConfiguration')
testCompile 'org.json:json:20090211'
}
(See here)然后测试就可以正确运行。
这不是我所期望的 - 如果 .jar 没有打包其依赖项,那么依赖于该 .jar 的任何项目也必须显式依赖于传递依赖项 - 这不会导致依赖项定义迅速增加吗?
我遇到了“fatJar”的概念here and here,这似乎是“具有依赖项的 jar”的同义词 - 但将我的 app/build.gradle 更改为读取
...
task jarTask(type: Jar) {
baseName ="test-${project.archivesBaseName}"
from android.sourceSets.main.java
}
task fatJar(type: Jar) {
baseName = project.name + "-all"
from {configurations.compile.collect {it.isDirectory() ? it : zipTree(it)}}
with jarTask
}
configurations {
jarConfiguration
}
artifacts {
jarConfiguration fatJar
}
仍然给出一个错误package org.json does not exist
。这似乎是因为org.json
未在 app/build.gradle 文件中明确调用为依赖项。使用以下 app/build.gradle,我的项目按预期构建并运行了测试:
...
dependencies {
...
compile 'org.json:json:20090211'
}
task jarTask(type: Jar) {
baseName ="${project.archivesBaseName}"
from android.sourceSets.main.java
}
task fatJar(type: Jar) {
baseName = project.name + "-all"
from {configurations.compile.collect {it.isDirectory() ? it : zipTree(it)}}
with jarTask
}
configurations {
jarConfiguration
}
artifacts {
jarConfiguration fatJar
}
(请注意,如果您只想要 fatJar 任务,您可以简单地设置from files({configurations.compile.collect {it.isDirector() ? it : zipTree(it)}}, android.sourceSets.main.java)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)