有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我偶然发现了“fatJar”herehere的概念,它似乎是“具有依赖项的jar”的同义词,但改变了我的应用程序/构建。格拉德尔阅读

    ...
    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,我的项目按预期构建并运行了测试:

    ...
    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)