Сплит-пакеты и загрузочные банки в 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
Опция предназначена только для тестирования и отладки. Его использование в производственных условиях настоятельно не рекомендуется.