Z Java 9 na zbliżającym się horyzoncie myślałem, że byłoby dobrym ćwiczeniem edukacyjnym do przeniesienia niektórych moich projektów na Java 9. W jednym z moich projektów mam zależności od rxjava i rxjavafxKonflikty w pakietach z automatycznymi modułami w Javie 9
dependencies {
compile 'io.reactivex:rxjava:1.2.6'
compile 'io.reactivex:rxjavafx:1.0.0'
...
}
Chcę utworzyć ten projekt jako nazwany moduł. Aby to zrobić, muszę utworzyć plik module-info.java
i muszę tutaj określić wymagania dla rxjava
i rxjavafx
. Jednak te biblioteki nie mają jeszcze żadnych informacji o module.
Aby obejść ten problem, przeczytałem: I need to create Automatic Modules. Z tego co rozumiem, muszę zmienić nazwę słoików rxjava
i rxjavafx
, aby mieć prostą nazwę, a następnie listę słoików w parametrze --module-path
. Następnie dodam dyrektywę requires
w moim module-info.java
z nazwami słoików.
module com.foo.bar {
requires rxjavafx;
requires rxjava;
}
Napisałem zadanie gradle, aby edytować nazwy słoików dla mnie i wygląda na to, że działa w większości przypadków. Zajmuje wszystkie słoiki, które należy skompilować i zmienia ich nazwy tak, aby nie zawierały informacji o wersji ani ukośników. Pliki te są następnie łączone w :
oddzielone wyrażenie:
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(':')]
}
Naturalnie biblioteki rx
dzielić niektóre z ich nazw pakietów ... to jednak powoduje, że kompilator pluć powrotem błędy, takie jak:
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
Wygląda na to, że jedynym sposobem obejścia tego problemu byłoby ponowne spakowanie zawartości rxjava
i rxjavafx
do pojedynczego słoika i dodanie go jako pojedynczego modułu. To nie wydaje się dobrym rozwiązaniem mimo ...
Więc moje pytania to:
- Am I poprawnie przy użyciu nowego systemu modułu?
- Co mogę zrobić z tym błędem? i
- Czy te zależności uniemożliwiają mi aktualizację, czy powinienem poczekać, aż rx zaktualizuje swoje biblioteki?
Uwaga: Próbowałem ten działa ze standardowym java
/javac
i powodują te same problemy. Również tutaj jest moja wersja 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)
Małe ulepszenia (możliwe): Podczas wyodrębniania nazwy modułu z nazwy JAR, system modułowy będzie wydzielał podciągi, które wyglądają jak wersje ~> wypróbuj bez zmiany ich nazwy. Ścieżka modułu również akceptuje katalogi ~> w przypadku, gdy masz katalog zawierający tylko zależności, umieść go bezpośrednio na ścieżce modułu. – Nicolai
Niezwiązane z twoim bieżącym pytaniem, proponuję uaktualnienie do nowszej wersji JDK 9. Zbudowanie 148 (jak sądzę) wprowadziło kilka istotnych zmian w dostępności prywatnych typów i członków za pomocą refleksji. Obecna wersja to 157. –