Groovy Java 9个模块支持
Groovy Java 9 modules support
我花了一些时间将我用 Groovy 编写的项目迁移到 Java 10。现在可以编译并 运行 它了。但它仍然没有使用 Java 9 模块化的任何好处。
谷歌搜索 Groovy 和 Java 9 个模块几乎没有任何结果。
那么是否可以迁移 Groovy 项目以将 JDK 10 与 Project Jigsaw 模块一起使用?
好吧,经过几天的实验,我得出了答案 - 是的,可以将 Groovy 与 Project Jigsaw 模块一起使用。
但它需要一些额外的努力。
假设我们有以下文件结构:
├── build
├── jigsaw
│ └── module
│ └── test
│ └── Application.groovy
├── lib
│ └── groovy.all.jar
└── module-info.java
模块-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 完成。
我花了一些时间将我用 Groovy 编写的项目迁移到 Java 10。现在可以编译并 运行 它了。但它仍然没有使用 Java 9 模块化的任何好处。
谷歌搜索 Groovy 和 Java 9 个模块几乎没有任何结果。
那么是否可以迁移 Groovy 项目以将 JDK 10 与 Project Jigsaw 模块一起使用?
好吧,经过几天的实验,我得出了答案 - 是的,可以将 Groovy 与 Project Jigsaw 模块一起使用。
但它需要一些额外的努力。
假设我们有以下文件结构:
├── build
├── jigsaw
│ └── module
│ └── test
│ └── Application.groovy
├── lib
│ └── groovy.all.jar
└── module-info.java
模块-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 完成。