繁体   English   中英

依赖关系未复制到jar中(在Gradle中)

[英]Dependencies not copied into jar (in Gradle)

TL; DR我希望将模块的依赖关系构建到其.jar中,但它们似乎不是。

我正在使用Gradle来构建一个项目。 我有两个子项目, app (Android模块)和tests (Java模块),由IntelliJ创建。

由于我想在tests内容中使用app中定义的类,因此我添加了适当的依赖项。 受到这个答案的启发,我有以下设置:

应用程序/的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 )“package org.json不存在”。 但是,如果我更新tests / build.gradle

...
dependencies {
    ...
    testCompile project(path: ':app', configuration: 'jarConfiguration')
    testCompile 'org.json:json:20090211'
}

(见这里 )然后测试正确运行。

这不是我所期望的 - 如果.jar没有打包它的依赖项,那么依赖于.jar的任何项目也必须明确地依赖于传递依赖 - 这不会导致依赖关系定义快速增加吗?

我在这里这里遇到了“fatJar”的概念,这似乎是“带有依赖关系的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)设置from files({configurations.compile.collect {it.isDirector() ? it : zipTree(it)}}, android.sourceSets.main.java)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM