【问题标题】:Dependencies not copied into jar (in Gradle)未复制到 jar 中的依赖项(在 Gradle 中)
【发布时间】:2014-09-25 12:47:30
【问题描述】:

TL;DR 我希望将模块的依赖项构建到其 .jar 中,但它们似乎没有。

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

由于我想在tests 的内容中使用app 中定义的类,所以我添加了适当的依赖项。受this answer 的启发,我进行了以下设置:

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)“包 org.json 不存在”。但是,如果我将 tests/build.gradle 更新为

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

(请参阅here)然后测试运行正确。

这不是我所期望的——如果 .jar 不打包其依赖项,那么任何依赖于该 .jar 的项目也必须显式依赖传递依赖项——这不会导致依赖项定义快速增加?

【问题讨论】:

  • 为什么要库Jar中的应用程序类?好像走错路了。
  • 该应用程序是一个 Android 应用程序,它将从服务器(也是项目的一部分)接收 JSON。该应用程序包含表示这些 JSON 响应的类。作为测试的一部分,我想启动服务器的测试实例,从中获取响应,并检查它们是否可以正确反序列化为这些类。因此,我需要测试依赖于应用程序类。

标签: java android gradle android-gradle-plugin


【解决方案1】:

我遇到了“fatJar”herehere 的概念,这似乎是“带有依赖项的 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)

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2014-10-13
    • 2015-05-15
    相关资源
    最近更新 更多