java依赖项未复制到jar中(以Gradle为单位)
TL;DR I期望模块的依赖项被构建到其内部。罐子,但它们看起来不是强>
我在用Gradle做一个项目。我有两个子项目,app
(一个Android模块)和tests
(一个Java模块),由IntelliJ创建
{cdi}在{cdi}中添加了{cdi}的内容,因为{cdi}已在{cdi}中定义了相应的依赖项。受this answer的启发,我有以下设置:
应用程序/构建。格拉德尔:
...
task jarTask(type: Jar) {
baseName ="${project.archivesBaseName}"
from 安卓.sourceSets.main.java
}
configurations {
jarConfiguration
}
artifacts {
jarConfiguration jarTask
}
测试/构建。格拉德尔
...
dependencies {
...
testCompile project(path: ':app', configuration: 'jarConfiguration')
}
但是,app
中的一个类导入了org.json.JSONObject
。由于这是由Android SDK提供的,app
可以找到它,但是当我尝试运行测试时,我得到(在:tests:compileTestJava
)“package org.json不存在”。但是,如果我更新测试/构建。格拉德尔
...
dependencies {
...
testCompile project(path: ':app', configuration: 'jarConfiguration')
testCompile 'org.json:json:20090211'
}
(参见here)然后测试将正确运行
这不是我所期望的——如果是一个。jar不会打包它的依赖项,那么任何依赖它的项目都不会打包。jar还必须显式地依赖于可传递依赖项——这不会导致依赖项定义迅速增加吗
# 1 楼答案
我偶然发现了“fatJar”here和here的概念,它似乎是“具有依赖项的jar”的同义词,但改变了我的应用程序/构建。格拉德尔阅读
仍然给出一个错误
package org.json does not exist
。这似乎是因为org.json
在app/build中没有显式地作为依赖项调用。格雷德尔档案。使用以下应用程序/构建。gradle,我的项目按预期构建并运行了测试:(请注意,如果您只需要fatJar任务,只需设置
from files({configurations.compile.collect {it.isDirector() ? it : zipTree(it)}}, android.sourceSets.main.java)