【问题标题】:Dependency on a module on a multimodule gradle project对多模块 gradle 项目上的模块的依赖
【发布时间】:2019-09-06 19:35:49
【问题描述】:

我在 Gradle 中有一个多模块项目。

我将常用功能重构为一个名为common 的模块。

我在使用common 模块的src/main/java 下的类的多模块项目的不同模块(比如说module A)中进行了测试。

我可以从module A 的测试类中的common 模块导入这些类,但是当我运行测试时,我收到以下错误:

错误:包 'common.bla...' 不存在。

这是 module Abuild.gradle 文件,它依赖于 common 模块进行测试(我已经尝试了所有这些选项):

 dependencies  {
     compile project(':common')
     testCompile project(':common')
     testRuntime project(':common')
     runtime project(':common')
     implementation project(":common")
     testCompile 'junit:junit:4.12'
     testImplementation 'junit:junit:4.12'
     implementation 'junit:junit:4.12'
     testCompileOnly project(':common')
     testRuntimeOnly project(':common')
     testImplementation project(':common')
     runtimeOnly project(':common')
     testCompile project(":common").sourceSets.test.output
     compile project(":common").sourceSets.test.output
     testRuntime fileTree(dir: 'libs', include: ['*.jar'])
}

我还验证了在 common/build/libs 中创建了一个 jar。
我还能尝试什么?

【问题讨论】:

  • 您能否添加一些屏幕,您的项目结构在 IDE 中的外观如何?

标签: java gradle dependency-management multi-module


【解决方案1】:

在这么少的背景下回答你的问题有点困难,但无论如何让我试着去做。据我了解,您的目录结构类似于以下(不包括 Gradle Wrapper 文件):

.
├── common
│   ├── build.gradle
│   └── src
│       └── main
│           └── java
│               └── common
│                   └── Foobar.java
├── moduleA
│   ├── build.gradle
│   └── src
│       └── test
│           └── java
│               └── FoobarTest.java
└── settings.gradle

我可以从根目录成功运行./gradlew :moduleA:test(Gradle 5.6.2),文件内容如下:

./common/build.gradle

plugins {
    id 'java'
}

./common/src/main/java/common/Foobar.java

package common;

public class Foobar {
    public static void main(String... args) {
        System.err.println("Foobar");
    }
}

./moduleA/build.gradle

plugins {
    id 'java'
}

repositories {
    jcenter()
}

dependencies {
    testImplementation project(':common')
    testImplementation 'junit:junit:4.12'
}

./moduleA/src/test/java/FoobarTest.java

import common.Foobar;

public class FoobarTest {

    @org.junit.Test
    public void myTest() {
        org.junit.Assert.assertNotNull(Foobar.class);
    }
}

./settings.gradle

include 'common', 'moduleA'

如前所述,很难说你的错误究竟来自哪里。如果您不能使用我的最小设置来修复您自己的代码,那么可以尝试使用 minimal, reproducible example 更新您的问题以解决您的非工作设置。

【讨论】:

    【解决方案2】:

    依赖关系现在很复杂。同时拥有compiletestCompiletestCompileOnly 是令人困惑的,如果不是完全不正确的话。 testCompileOnly 可能是它在运行时不工作的原因。

    拥有compile 也意味着运行时和testCompile。您可以使用gradlew common:dependencies 进行检查。

    我认为清理依赖项会有所帮助。如果不是,请检查 jar 的内容以包含预期的类。

    【讨论】:

    • 谢谢,我只添加了 testImplementation 依赖项,但 jar 不包含所需的类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2019-02-11
    相关资源
    最近更新 更多