随着Java 9的出现,我认为将我的一些项目移植到Java 9是一个很好的学习练习.在我的一个项目中,我有rxjava和rxjavafx的依赖项
dependencies {
compile 'io.reactivex:rxjava:1.2.6'
compile 'io.reactivex:rxjavafx:1.0.0'
...
}
Run Code Online (Sandbox Code Playgroud)
我想将此项目创建为命名模块.要做到这一点,我需要创建一个module-info.java文件,我需要指定的要求rxjava,并rxjavafx在这里.但是,这些库还没有任何模块信息.
为了解决这个问题,我读过我需要创建自动模块.根据我的理解,我需要重命名rxjava和rxjavafx罐子有一个简单的名称,然后列出--module-path参数中的罐子.然后requires我module-info.java在jar中添加一个指令.
module com.foo.bar {
requires rxjavafx;
requires rxjava;
}
Run Code Online (Sandbox Code Playgroud)
我编写了一个gradle任务来为我编辑jar名称,它似乎在大多数情况下都有效.它需要编译所有的jar并将它们重命名为不包含version-info或slashes.然后将这些文件连接成一个:单独的字符串:
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: …Run Code Online (Sandbox Code Playgroud) 当我编译一个依赖于我之前编译的其他模块的模块时,我必须指定该--module-path <directory>选项.这使我依赖的模块可见.
但与此同时,我还想让一些非模块化的Jar文件可见.但是,如果不使它们成为自动模块并且只是在--class-path some.jar旁边指定--module-path <directory>,那么javac似乎忽略了claspath并抛出"package yyy not found"和其他"未找到"错误.
我可以理解,使用--class-path和--module-path在同一个(编译)时间是非法的,但javac并没有以任何方式警告我.