Сплит-пакеты и загрузочные банки в Java 9

Кажется, что в Java 9 не разрешено иметь так называемые Split Packages, то есть один и тот же пакет, определенный в двух разных модулях. Это вызывает проблему с моим процессом миграции: (Gradle) проект содержит файл Jar, который называется bootstrap.jarс такой структурой:

bootstrap.jar
- com
  - example
    - Foo.class
    - Bar.class
    - Baz.class

src каталог содержит класс com.example.Bar это зависит от Foo а также определение модуля, для com.example, bootstrap.jar Файл не содержит информацию о модуле, так как он был скомпилирован до Java 9, поэтому он использует автоматический модуль под названием bootstrap, Проблема в том, что сейчас пакет com.example определяется в обоих модулях, com.example а также bootstrap,

Причина есть это bootstrap.jar Файл, для начала, выглядит следующим образом:

src/com/example папка на самом деле содержит Bar.java, Baz.java и другой файл, Foo.dyvil, Последний написан на языке программирования JVM. Таким образом, цепочка зависимостей выглядит следующим образом:

Bar.java -> Foo.dyvil -> Baz.java

В процессе сборки он компилируется в Foo.class, который помещается в новый файл Jar, который позже заменяет bootstrap.jar, Причина размещения всех этих файлов заключается в том, что компилятор Java и Dyvil не могут обрабатывать файлы других языков, поэтому им требуется некоторый доступ к скомпилированным классам из предыдущей сборки. Так вот почему bootstrap.jar,

Теперь о реальной проблеме: поскольку в Java 9 запрещены разделенные пакеты, есть ли какой-нибудь способ добиться "разделенных сборок" с использованием jar-файлов начальной загрузки, как описано и используется в моем проекте? Или есть другой подход?

1 ответ

Хотя долгосрочным решением этой проблемы является разрешение таких пакетов на существование в одном модуле и последующая модульность кода.

В качестве временного решения вы можете использовать опцию:-

--patch-module <module>=<file>(<pathsep><file>)*

как в твоем случае

--patch-module com.example=bootstrap.jar

Имейте в виду, хотя, --patch-module Опция предназначена только для тестирования и отладки. Его использование в производственных условиях настоятельно не рекомендуется.

Другие вопросы по тегам