С приближением Java 9 я подумал, что будет хорошим учебным упражнением перенести некоторые из моих проектов на Java 9. В одном из моих проектов у меня есть зависимости для rxjava и rxjavafx
dependencies {
compile 'io.reactivex:rxjava:1.2.6'
compile 'io.reactivex:rxjavafx:1.0.0'
...
}
Я хочу создать этот проект как именованный модуль. Для этого мне нужно создать module-info.java
файл и указать здесь требования для rxjava
и rxjavafx
. Однако в этих библиотеках пока нет информации о модулях.
Чтобы обойти это, я прочитал, что мне нужно создать автоматический Модули. Насколько я понимаю, мне нужно переименовать банки rxjava
и rxjavafx
, чтобы они имели простое имя, а затем перечислить банки в параметре --module-path
. Затем я добавляю директиву requires
в свой module-info.java
с именами банок.
module com.foo.bar {
requires rxjavafx;
requires rxjava;
}
Я написал задачу gradle, чтобы отредактировать для меня имена jar-файлов, и, похоже, в большинстве случаев она работает. Он берет все jar-файлы, которые необходимо скомпилировать, и переименовывает их, чтобы не включать информацию о версии или косые черты. Затем файлы объединяются в строку, разделенную :
:
tasks.withType(JavaCompile) {
delete { delete '/tmp/gradle' }
copy {
from configurations.compile + configurations.testCompile
into '/tmp/gradle'
rename '(.*)-[0-9]+\\..*.jar', '$1.jar'
rename { String fileName -> fileName.replace("-", "") }
}
options.compilerArgs += ['--module-path', fileTree(dir: '/tmp/gradle', include: '*.jar').getFiles().join(':')]
}
Естественно, библиотеки rx
используют одни и те же имена пакетов ... однако это заставляет компилятор выдавать такие ошибки, как:
error: module reads package rx.subscriptions from both rxjava and rxjavafx
error: module reads package rx.schedulers from both rxjava and rxjavafx
error: module reads package rx.observables from both rxjava and rxjavafx
error: module rxjava reads package rx.subscriptions from both rxjavafx and rxjava
error: module rxjava reads package rx.schedulers from both rxjavafx and rxjava
error: module rxjava reads package rx.observables from both rxjavafx and rxjava
error: module rxjavafx reads package rx.subscriptions from both rxjava and rxjavafx
error: module rxjavafx reads package rx.schedulers from both rxjava and rxjavafx
error: module rxjavafx reads package rx.observables from both rxjava and rxjavafx
Похоже, что единственный способ обойти эту проблему - переупаковать содержимое rxjava
и rxjavafx
в одну банку и добавить ее как один модуль. Хотя это не кажется хорошим решением ...
Итак, мои вопросы:
- Правильно ли я использую новую модульную систему?
- Что мне делать с этой ошибкой? а также
- Эти зависимости мешают мне обновляться, или мне просто нужно дождаться, пока rx обновит свои библиотеки?
Примечание. Я пробовал запускать это со стандартным _17 _ / _ 18_, и они вызывают те же проблемы. Также вот моя версия java:
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+140)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+140, mixed mode)