Groovy Java 9模块支持

时间:2018-05-03 20:15:17

标签: java groovy java-9 java-module jigsaw

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

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

1 个答案:

答案 0 :(得分:8)

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

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

├── build
├── jigsaw
│   └── module
│       └── test
│           └── Application.groovy
├── lib
│   └── groovy.all.jar
└── module-info.java  

<强> module-info.java

module main {
    requires groovy.all;
}

<强> Application.groovy

package jigsaw.module.test

class Application {
    static void main(String[] args) {
        println "Hello module!"
    }
}

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

我们这样做:

javac -d build --module-path lib/ module-info.java

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

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

groovyc -d build jigsaw/module/test/Application.groovy

顺利进行。
编译后,我们有 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

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

java --module-path build:lib --module main/jigsaw.module.test.Application

这就是我们得到的

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

这是什么意思?我不知道。经过大量的谷歌搜索后,我找到了something similar

因此我们需要手动从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!

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