Как исправить сплит-пакет в тестовых зависимостях? - PullRequest
0 голосов
/ 03 июля 2019

Я создал пример проекта, чтобы объяснить возникшую проблему. У меня есть тесты, которые используют две банки зависимостей, которые имеют разделенный пакет. В этом случае Google-True имеет сплит-пакет.

build.gradle

plugins {
    id 'java-library'
    id 'org.javamodularity.moduleplugin' version '1.5.0'
}

group 'example'
version '1.0-SNAPSHOT'

sourceCompatibility = 11

repositories {
    mavenCentral()
}

dependencies {
    testImplementation group: 'junit', name: 'junit', version: '4.12'
    testImplementation 'com.google.truth:truth:0.42'
    testImplementation 'com.google.truth.extensions:truth-java8-extension:0.42'
}

SRC / главная / Java / module-info.java

module truth.tests.main {
    exports example.truthtest;
}

SRC / тест / Java / модуль-info.test

--add-reads
  truth.tests.main=truth

SRC / тест / Java / пример / truthtest / ATest.java

package example.truthtest;

import org.junit.Test;

import static com.google.common.truth.Truth.assertThat;

public class ATest {
    @Test
    public void test() {
        assertThat(15).isEqualTo(15);
    }
}

Когда я запускаю сборку, я получаю следующую ошибку.

> Task :compileTestJava FAILED
error: the unnamed module reads package com.google.common.truth from both truth and truth.java8.extension
error: module truth reads package com.google.common.truth from both truth and truth.java8.extension
error: module hamcrest.core reads package com.google.common.truth from both truth and truth.java8.extension
error: module com.google.common reads package com.google.common.truth from both truth and truth.java8.extension
error: module checker.compat.qual reads package com.google.common.truth from both truth and truth.java8.extension
error: module checker.qual reads package com.google.common.truth from both truth and truth.java8.extension
error: module diffutils reads package com.google.common.truth from both truth and truth.java8.extension
error: module auto.value.annotations reads package com.google.common.truth from both truth and truth.java8.extension
error: module error.prone.annotations reads package com.google.common.truth from both truth and truth.java8.extension
error: module jsr305 reads package com.google.common.truth from both truth and truth.java8.extension
error: module j2objc.annotations reads package com.google.common.truth from both truth and truth.java8.extension
error: module animal.sniffer.annotations reads package com.google.common.truth from both truth and truth.java8.extension
error: module truth.java8.extension reads package com.google.common.truth from both truth and truth.java8.extension
error: module junit reads package com.google.common.truth from both truth.java8.extension and truth
error: module truth.tests.main reads package com.google.common.truth from both truth and truth.java8.extension
15 errors

FAILURE: Build failed with an exception.

Мне кажется, проблема в том, что truth и truth.java8.extension оба содержат классы в одном пакете com.google.truth. Если я удаляю truth-java8-extensions, тесты компилируются, но это обязательная зависимость в моем реальном проекте. Как я могу заставить эти два модуля работать вместе в тестах с использованием системы модулей Java?

Когда я отлаживаю gradle, это параметры компилятора, которые не работают (пути усекаются).

Compiler arguments: 
-source 11 
-target 11 
-d build\classes\java\test 
-g 
-sourcepath  
-proc:none 
-s build\generated\sources\annotationProcessor\java\test -XDuseUnsharedTable=true 
-classpath  
--module-path build\classes\java\main;build\resources\main;truth-java8-extension-0.42.jar;truth-0.42.jar;junit-4.12.jar;hamcrest-core-1.3.jar;guava-25.1-android.jar;checker-compat-qual-2.5.3.jar;checker-qual-2.5.3.jar;diffutils-1.3.0.jar;auto-value-annotations-1.6.2.jar;error_prone_annotations-2.3.1.jar;jsr305-3.0.2.jar;j2objc-annotations-1.1.jar;animal-sniffer-annotations-1.14.jar 
--patch-module truth.tests.main=src\test\java 
--add-modules junit 
--add-reads truth.tests.main=junit src\test\java\example\truthtest\ATest.java

1 Ответ

1 голос
/ 03 июля 2019

Исправлено исправление truth с truth.java8.extension.Это может быть сделано в Gradle с patchModules.

patchModules.config = [
        "truth=truth-java8-extension-0.42.jar"
]

Эта конфигурация приводит к следующему:

Compiler arguments: 
-source 11 
-target 11 
-d build\classes\java\test 
-g 
-sourcepath  
-proc:none 
-s build\generated\sources\annotationProcessor\java\test 
-XDuseUnsharedTable=true 
-classpath  
--module-path build\classes\java\main;build\resources\main;truth-0.42.jar;junit-4.12.jar;hamcrest-core-1.3.jar;guava-25.1-android.jar;checker-compat-qual-2.5.3.jar;checker-qual-2.5.3.jar;diffutils-1.3.0.jar;auto-value-annotations-1.6.2.jar;error_prone_annotations-2.3.1.jar;jsr305-3.0.2.jar;j2objc-annotations-1.1.jar;animal-sniffer-annotations-1.14.jar 
--patch-module truth.tests.main=src\test\java 
--add-modules junit 
--add-reads truth.tests.main=junit 
--patch-module truth=${gradle-path}\truth-java8-extension-0.42.jar 
--add-reads truth.tests.main=truth src\test\java\example\truthtest\ATest.java

С патчем расширений к правде тесты теперь работают.Приятно то, что эта конфигурация автоматически заполняет путь к банке.

...