С 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
с именами jar.
module com.foo.bar {
requires rxjavafx;
requires rxjava;
}
Я написал задачу gradle для редактирования имен 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 обновит их библиотеки?
Примечание. Я попытался запустить это со стандартным java
/javac
, и они вызывают те же проблемы. Также здесь моя версия 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)