Groovy Java 9模块支持

Nat*_*ruk 12 java groovy java-platform-module-system java-9 java-module

我花了一些时间将我用Groovy编写的项目迁移到Java 10.现在可以编译并运行它.但它仍然没有使用Java 9模块化的任何好处.
谷歌搜索Groovy和Java 9模块几乎没有.

那么是否可以迁移Groovy项目以使用带有Project Jigsaw模块的JDK 10?

Nat*_*ruk 13

好吧,经过几天的实验,我想出了答案 - 是的,可以使用Groovy和Project Jigsaw模块.
但它需要一些额外的努力.

假设我们有以下文件结构:

??? build
??? jigsaw
?   ??? module
?       ??? test
?           ??? Application.groovy
??? lib
?   ??? groovy.all.jar
??? module-info.java  
Run Code Online (Sandbox Code Playgroud)

module-info.java

module main {
    requires groovy.all;
}
Run Code Online (Sandbox Code Playgroud)

Application.groovy

package jigsaw.module.test

class Application {
    static void main(String[] args) {
        println "Hello module!"
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,我们需要使用javac编译module-info.java文件,而不是使用groovyc编译所有文件,因为groovy将模块文件视为闭包.

我们开始做吧:

javac -d build --module-path lib/ module-info.java
Run Code Online (Sandbox Code Playgroud)

--module-path将包含我们的groovy.all.jar作为自动模块,其名称源自JAR文件名.

接下来我们需要编译Application.groovy

groovyc -d build jigsaw/module/test/Application.groovy
Run Code Online (Sandbox Code Playgroud)

它很顺利.
编译后我们有module-info.class(又名模块描述符)和Application.class.

??? build
?   ??? jigsaw
?   ?   ??? module
?   ?       ??? test
?   ?           ??? Application.class
?   ??? module-info.class
??? jigsaw
?   ??? module
?       ??? test
?           ??? Application.groovy
??? lib
?   ??? groovy.all.jar
??? module-info.java
Run Code Online (Sandbox Code Playgroud)

现在让我们尝试运行我们编译的模块.

java --module-path build:lib --module main/jigsaw.module.test.Application
Run Code Online (Sandbox Code Playgroud)

这就是我们得到的

Error occurred during initialization of boot layer
java.lang.module.FindException: Unable to derive module descriptor for lib/groovy.all.jar
Caused by: java.lang.module.InvalidModuleDescriptorException: Provider class moduleName=groovy-all not in module
Run Code Online (Sandbox Code Playgroud)

这是什么意思?我不知道.经过大量的谷歌搜索,我发现了类似的东西.

所以我们需要手动从JAR中删除这些文件:

  • /META-INF/services/org.codehaus.groovy.source.Extensions
  • /META-INF/services/org.codehaus.groovy.runtime.ExtensionModule

最后,我们的Java模块能够启动

java --module-path build:lib --module main/jigsaw.module.test.Application
Hello module!
Run Code Online (Sandbox Code Playgroud)

所有操作都是使用Oracle JDK 10和Groovy 2.4.15完成的.