С Java 9 на близком горизонте я подумал, что было бы хорошим упражнением по обучению переносить некоторые мои проекты на Java 9. В одном из моих проектов у меня есть зависимости для rxjava и rxjavafxПакет конфликтует с автоматическими модулями в Java 9
dependencies {
compile 'io.reactivex:rxjava:1.2.6'
compile 'io.reactivex:rxjavafx:1.0.0'
...
}
Я хочу создать этот проект как именованный модуль. Для этого мне нужно создать файл module-info.java
, и мне нужно указать требования для rxjava
и rxjavafx
здесь. Однако эти библиотеки еще не имеют информации о модуле.
Чтобы обойти это, я прочитал, что I need to create Automatic Modules. Из того, что я понимаю, мне нужно переименовать банки rxjava
и rxjavafx
, чтобы иметь простое имя, а затем перечислить банки в параметре --module-path
. Затем я добавляю директиву requires
в своем module-info.java
с названиями баннеров.
module com.foo.bar {
requires rxjavafx;
requires rxjava;
}
Я написал Gradle задачу, чтобы изменить имена фляги для меня, и это, кажется, работает в большинстве случаев. Он берет все банки, которые необходимо скомпилировать, и переименовывает их, чтобы не включать информацию о версии или слэши. Файлы затем объединяются в :
отделенной строку:
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)
Небольшие улучшения (возможно): при извлечении имени модуля из JAR-имени система модулей выкинет подстроки, похожие на версии ~> попробуйте, не переименовав их. Путь к модулю также принимает каталоги ~> в случае, если у вас есть каталог, который содержит только зависимости, поместите его прямо в путь модуля. – Nicolai
Не связанный с вашим текущим вопросом, я предлагаю перейти на новую сборку JDK 9. Build 148 (я думаю) внес существенные изменения в доступность частных типов и членов через отражение. Текущая сборка - 157. –