Поддержка модулей Groovy Java 9 - PullRequest
0 голосов
/ 03 мая 2018

Я потратил некоторое время, чтобы перенести мой проект, написанный на Groovy, на Java 10. Теперь можно скомпилировать и запустить его. Но все же он не использует никаких преимуществ модульности Java 9.
Поиск в Google модулей Groovy и Java 9 практически ничего не дает.

Так можно ли перенести проект Groovy для использования JDK 10 с модулями Project Jigsaw?

1 Ответ

0 голосов
/ 06 мая 2018

Ну, после нескольких дней экспериментов я придумаю ответ - да, возможно использовать 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!"
    }
}

Прежде всего нам нужно скомпилировать файл module-info.java с помощью javac вместо компиляции всех файлов с помощью groovyc, потому что groovy рассматривает файл модуля как закрытие.

Давайте сделаем это:

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

- путь к модулю будет включать наш 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

А что это значит? Я не знаю. После долгих поисков я обнаружил что-то похожее .

Так что нам нужно вручную удалить из JAR эти файлы:

  • / META-INF / услуги / org.codehaus.groovy.source.Extensions
  • / META-INF / услуги / 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.

...