【发布时间】:2017-07-10 12:43:56
【问题描述】:
随着 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 的要求。但是,这些库还没有任何模块信息。
为了解决这个问题,我阅读了I need to create Automatic Modules。据我了解,我需要重命名 rxjava 和 rxjavafx 罐子以具有简单的名称,然后在 --module-path 参数中列出罐子。然后我在我的module-info.java 中添加一个requires 指令和jar 名称。
module com.foo.bar {
requires rxjavafx;
requires rxjava;
}
我编写了一个 gradle 任务来为我编辑 jar 名称,它似乎在大多数情况下都有效。它需要所有需要编译的 jars 并将它们重命名为不包含版本信息或斜杠。然后将文件连接成: 分隔字符串:
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 的内容重新打包到一个jar 中并将其添加为单个模块。不过,这似乎不是一个好的解决方案...
所以我的问题是:
- 我是否正确使用了新的模块系统?
- 我该如何处理这个错误?和
- 这些依赖项会阻止我更新,还是应该等待 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 名称中提取模块名称时,模块系统会抛出看起来像版本的子字符串 ~> 尝试不重命名它们。模块路径也接受目录 ~> 如果你有一个只包含依赖项的目录,直接把它放在模块路径上。
-
与您当前的问题无关,我建议升级到更新版本的 JDK 9。Build 148(我认为)通过反射对私有类型和成员的可访问性进行了一些重大更改。当前版本为 157。
标签: java compiler-errors java-9 java-module java-platform-module-system