随着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
在这里。但是,这些库还没有任何模块信息。
为了解决这个问题,我读到我需要创建自动模块。据我了解,我需要将rxjavaand rxjavafxjars
重命名为一个简单的名称,然后在--module-pat
h参数中列出jars 。然后requires
,我module-info.java
在jar名称中添加一条指令。
module com.foo.bar {
requires rxjavafx;
requires rxjava;
}
我编写了gradle任务来为我编辑jar名称,在大多数情况下,它似乎可以正常工作。它需要所有需要编译的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放入单个jar中,并将其添加为单个模块。不过,这似乎不是一个好的解决方案…
所以我的问题是:
注意:我尝试使用标准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)
我是否正确使用新的模块系统?
是。你看到的是预期的行为,这是因为JPMS模块不允许拆分包。
如果你不熟悉术语“拆分包”,则它实际上意味着同一包的两个成员来自两个不同的模块。
例如:
com.foo.A(来自moduleA.jar)
com.foo.B(来自moduleB.jar)
我该怎么办?
你有两种选择:
希望rx最终会在将来的某个时候将其库更新为不包含拆分包。在此之前,我的建议是将两个jar一起捣成一个jar(选项2)。
随着Java9的临近,我认为将我的一些项目移植到Java9将是一个很好的学习练习。在我的一个项目中,我对rxjava和rxjavafx有依赖关系 我想创建这个项目作为一个命名模块。为此,我需要创建一个文件,我需要在这里指定和的要求。但是,这些库还没有任何模块信息。 为了解决这个问题,我读到我需要创建自动模块。据我所知,我需要重命名和jar,使其具有一个简单的名称,然后在参数中列出jar。然后在我的
我想在java模块中使用CDI功能。我希望我的代码保持泛型,不依赖于特定的实现。 我使用Java11和Maven3.6.0。 为了简单起见,我的目标被简化为在java文件中导入包。当我在没有module(没有)的情况下这样做时,每件事都能正常工作。 我的理解是,CDI库应该采用一个受jar文件名称启发的自动模块名称。当我使用指令运行maven时,我在类路径中看到。我相信,如果我错了,请更正,这应该
我的项目依赖于Netty Epoll Transport。以下是依赖关系: 无法派生模块描述符:netty-transport-native-epoll-4.1.17。final-snapshot-linux-x 86_64.jar netty.transport.native.epoll:无效的模块名:'native'不是Java标识符 有什么变通办法吗?(当然,除了“释放正确的netty神器”
学习到这里,可以说 Python 基础学习基本接近尾声了。 目录
主要内容:模块系统特征,创建模块Java 9是一种称为模块的新型编程组件。模块是一个自我描述的代码和数据集合,并有一个名称来标识它。 模块系统特征 使用模块组件,Java 9中增加了以下增强功能 - 引入了一个新的可选阶段,即链接时间。这个阶段介于编译时间和运行时间之间。 在此阶段,可以组合和优化一组模块,使用jlink工具制作自定义运行时映像。 javac,jlink和java有额外的选项来指定模块路径,它们进一步定位模块的定
食氧;视窗7;JDK 9决赛从9日开始,21日结束;JUnit4.12和现有的应用程序。作为起点,可以编译、执行应用程序,并且所有JUnit测试都显示为绿色。现在我们使用eclipse生成文件模块信息。JAVA结果是: 但有一个错误:junit无法解析为模块。问题是:如何告诉文件junit没有定义任何模块,应该在兼容模式下运行?