Java упаковка модуля с автоматическим c модулем в JAR - PullRequest
1 голос
/ 23 апреля 2020

Я играю с модулями, но есть кое-что, что я не могу выполнить до сих пор, но факт довольно прост, но не работает.

У меня есть модуль с именем Student и только 1 пакет, который экспортирует и требует класс в немодульном фляге - что-то вроде этого.

ModuleSourcePath

Соответствующий код здесь состоит в том, что класс Administracion требует класс в немодульном jar код выглядит следующим образом.

public class Administracion extends classpath.ClassPathClass{

В этом примере я считаю, что у меня нет исходников, только двоичные файлы в файле Jar, на самом деле jar находится на root следующего в sr c но в каталоге out

Примерно так:

Jar file in the out directory

Я могу скомпилировать весь код модуля с помощью этой команды

C:\Ocp11>javac -d out --module-source-path src -p out --module Student

Отлично, двоичные файлы расположены в каталоге out, и теперь это выглядит так:

out directory

Я могу запустить его с помощью этой команды:

C:\Ocp11>java -p out --module Student/university.upel.Administracion

И работает как шарм, но шаг, который я не смог выполнить, я pac kage it.

Я хотел бы проигнорировать папку модуля root. Я имею в виду, что учащийся может облегчить управление основным классом.

Я хотел бы иметь структуру в банке вот так.

I would like to have this layout

Я пробовал это:

C:\Ocp11>jar --create --file App.jar -e university.upel.Administracion -C out/Student .

Это создает JAR-файл, и если я его распаковываю, я вижу то, что хотел .

The Jar file ClassPath.jar
The module-info.class for creating this as a module
The Main-Class: university.upel.Administracion

Структура пакета:

File Structure on the unziped Jar file

На самом деле, если я вижу module-info.class с использованием Javap, я вижу это

C:\Ocp11>javap App/module-info.class
Compiled from "module-info.java"
module Student {
  requires java.base;
  requires ClassPath;
  exports university.upel;
}

В настоящее время я думаю, что хорошо, кажется, работает. Выполнение:

C:\Ocp11>java -p App.jar -m Student
Error occurred during initialization of boot layer
java.lang.module.FindException: Module ClassPath not found, required by Student

Это говорит о том, что модуль ClassPath модуля automati c отсутствует, даже когда ClassPath.jar находится внутри банки. Я думаю, что это невозможно, верно? Я застрял в этот момент.

Я просто подумал, что таким образом Студент будет модулем с автоматическим c модулем внутри, который будет определять местоположение автоматического c модуля при каждом запуске.

Я уверен, что я ошибаюсь или я использую неправильный подход.

Если я немного изменю команду, то обнаружу Jar и запустится без проблем.

C:\Ocp11>java -p App.jar;out/ClassPath.jar -m Student
OUTPUT

Так я не могу положить JAR внутрь JAR и запустить его? Это раздражает перенос файла с 2 банками, даже когда только эта баночка использует модуль Automati c.

...