Как использовать зависимости варианта функции gradle в тестах?

Я переношу проект библиотеки Maven в Gradle. Исходный проект также имеет необязательные зависимости. Я использую плагин java-библиотеки, но перемещаю ранее необязательные зависимости в результаты реализации в зависимостях времени выполнения вместо компиляции. Поэтому я попробовал gradle варианты функций, что приводит к правильным зависимостям в pom.xml . Но это приводит к неудачной тестовой компиляции, поскольку зависимости варианта функции отсутствуют в пути к классам тестовой компиляции!

Вот мои текущие настройки в build.gradle:

apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'maven-publish'

sourceCompatibility = 1.8

java {
  registerFeature('oSupport') {
    usingSourceSet(sourceSets.main)
  }
}

dependencies {
  api 'my.compile:dep-a:1.0.0'
  implementation 'my.runtime:dep-i:1.0.0'
  oSupportApi 'my.optional:dep-o:1.0.0'
}

Предположим, что есть класс O, доступный из my.optional:dep-o. Если я импортирую O в любой класс в src/main/java, он отлично работает. Также зависимости экспортируются прямо в Maven (используя gradle generatePomFileForMavenJavaPublication, см. зависимости от сгенерированного pom.xml ниже). Но любой тест в src/test/java с использованием класса O не будет компилироваться (import my.optional.O; создает error: package my.optional does not exist)

<dependencies>
    <dependency>
      <groupId>my.compile</groupId>
      <artifactId>dep-a</artifactId>
      <version>1.0.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>my.rintime</groupId>
      <artifactId>dep-r</artifactId>
      <version>1.0.0</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>my.optional</groupId>
      <artifactId>dep-0</artifactId>
      <version>1.0.0</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
</dependencies>

Как это решить? Я знаю, что вместо этого мог бы использовать плагин nebula.Optional-base. варианта встроенной функции Gradle, но вместо этого я бы предпочел новую встроенную поддержку gradle для необязательных зависимостей.

PS: я использую Java 8 и Gradle 5.6.2.


person Arne Burmeister    schedule 18.09.2019    source источник


Ответы (2)


Это выглядит как ошибка, когда исходный набор функций использует основной исходный набор. Можете ли вы сообщить о https://github.com/gradle/gradle/issues?

Тем временем это должно исправить это:

configurations {
    testCompileClasspath.extendsFrom(oSupportApi)
    testRuntimeClasspath.extendsFrom(oSupportApi)
    testRuntimeClasspath.extendsFrom(oSupportImplementation)
}
person melix    schedule 18.09.2019
comment
Спасибо, по крайней мере, это работает, и я могу продолжать, создал сообщение об ошибке github.com/gradle/ град/проблемы/10778 - person Arne Burmeister; 18.09.2019

Действительно странно, я согласен с @melix, это похоже на ошибку Gradle.

Следующее исправит это, но не нужно, имхо:

dependencies {
  api 'my.compile:dep-a:1.0.0'
  implementation 'my.runtime:dep-i:1.0.0'
  oSupportApi 'my.optional:dep-o:1.0.0'
  testImplementation(project(":${project.name}")) {
    capabilities {
      requireCapability("${project.group}:${project.name}-o-support")
    }
  }
}

Для этой упрощенной настройки только с одной функцией зависимость может быть заменена на testImplementation 'my.optional:dep-o:1.0.0', но для общего большего списка зависимостей этот подход позволяет избежать повторения зависимостей, как решение extendsFrom @melix.

person Arne Burmeister    schedule 18.09.2019