Я переношу проект библиотеки 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.