加入非模块JAR包“netty-transport-native-kqueue-4.1.15.Final-osx-x86_64.jar”作为依赖将会自动生成一个模块名,不过因为JAR包含了Java关键字native,我们的应用程序无法正常编译。
Netty将在下一个版本中解决这个问题,而在问题得到解决之前,我们可以在JAR包的manifest文件中加入“Automatic-Module-Name”来绕过这个问题。为此,我们需要解压JAR包,修改“MANIFEST.MF”文件,加入“Automatic-Module-Name: io.netty.transport.kqueue”,然后通过下面的命令重新打包:
可以通过下面的命令来验证在manifest文件中指定的自动模块名是否可以被正确识别:
我们还要使用相同的命令解决其他非模块JAR包的命名问题。
接下来就可以构建和运行我们的CI系统了。下面是运行应用程序的命令:
为了支持JPMS,我们在“javac”和“java”命令中增加了一些新的参数,这些参数告诉Java编译器和运行时,使用模块路径和模块JAR包来替代原先的类路径。
一些值得注意的参数:
“-p”或“—module-path”用于告诉Java系统在指定的目录中查找Java模块。
“-m”或“—module”用于指定模块和主类。
在这篇文章里,我们基于Vert.x设计了一个模块化的微服务应用程序。我们使用了JPMS和JDK 9,并构建了一个Docker原生的CI系统。可以在GitHub上下载相关代码,了解如何基于Vert.x和模块化系统开发一个小型的自包含模块化Java应用程序。
关于作者Uday Tatiraju 是Oracle的首席工程师,在电子商务平台、搜索引擎、后端系统和Web与移动编程领域拥有十年的开发经验。
查看英文原文:Building a CI System with Java 9 Modules and Vert.x Microservices