Когда я использую следующие зависимости в моем файле pom:
<properties> <rxkotlinfx.version>2.2.0</rxkotlinfx.version> <rxkotlin.version>2.1.0</rxkotlin.version> <kotlin.version>1.1.51</kotlin.version> <tornadofx.version>1.7.12</tornadofx.version> </properties> <dependencies> <dependency> <groupId>com.github.thomasnield</groupId> <artifactId>rxkotlinfx</artifactId> <version>${rxkotlinfx.version}</version> </dependency> <dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxkotlin</artifactId> <version>${rxkotlin.version}</version> </dependency> <dependency> <groupId>no.tornado</groupId> <artifactId>tornadofx</artifactId> <version>${tornadofx.version}</version> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>${kotlin.version}</version> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-test</artifactId> <version>${kotlin.version}</version> <scope>test</scope> </dependency> </dependencies>
И запустив следующий код:
fun main(args: Array<String>) { val source = listOf("A", "B", "C").toObservable() .filter { it == "B" } .subscribeBy( onNext = { println(it) } ) }
Im получает следующую ошибку:
Error:(37, 40) Kotlin: Cannot access class 'io.reactivex.Observable'. Check your module classpath for missing or conflicting dependencies
Почему я получаю эту ошибку и какую настройку зависимостей мне нужно, чтобы иметь возможность работать с этим стеком?
Единственное решение, которое я нашел, это сделать явную зависимость от:
<dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxjava</artifactId> <version>2.1.3</version> </dependency>
io.reactivex.Observable находится в библиотеке rxjava-2.1.3.jar , которая является транзитивной зависимостью, вызванной двумя зависимостями, которые вы указали в pom.xml:
com.github.thomasnield: rxkotlinfx: 2.2.0
io.reactivex.rxjava2: rxkotlin: 2.1.0
Я пробовал настройку с помощью градиента (извините, мне нравится больше gradle, чем maven), и я использую командную строку gradle, чтобы увидеть, что такое разрешение конфликта. Вот результат:
io.reactivex.rxjava2:rxjava:2.1.3 (conflict resolution) \--- io.reactivex.rxjava2:rxjavafx:2.2.0 \--- com.github.thomasnield:rxkotlinfx:2.2.0 \--- compileClasspath io.reactivex.rxjava2:rxjava:2.1.0 -> 2.1.3 \--- io.reactivex.rxjava2:rxkotlin:2.1.0 \--- compileClasspath io.reactivex.rxjava2:rxjavafx:2.2.0 \--- com.github.thomasnield:rxkotlinfx:2.2.0 \--- compileClasspath io.reactivex.rxjava2:rxkotlin:2.1.0 (selected by rule) \--- compileClasspath
и разрешение конфликта градиента выбрано v 2.1.3
Я знаю, что управление зависимостями в gradle более мощное, чем в maven, но я бы заставил maven использовать определенную версию транзитивной зависимости, исключив версию нежелательной зависимости.
Я бы попробовал следующее:
<dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxkotlin</artifactId> <version>${rxkotlin.version}</version> <exclusions> <exclusion> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxjava</artifactId> </exclusion> </exclusions> </dependency>
Или, если вам не нужен какой-либо API, вы можете удалить
<dependency> <groupId>com.github.thomasnield</groupId> <artifactId>rxkotlinfx</artifactId> <version>${rxkotlinfx.version}</version> </dependency>