2015-04-03 3 views
1

История создания «», как запускать приложение без основного метода «вопросы, большинство из которых указывают что-то в строках« , вы не можете ». Я заметил, что теперь приложения JavaFX можно запускать, просто расширив Application. Я использовал метод, похожий на Application.launch(), но в этой ситуации я всегда видел основной метод в качестве шаблона. Поэтому я снова начал искать ответы.Как создать пользовательскую пусковую установку JVM?

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

Мой вопрос

Как бы один создать собственный JVM запуска для запуска приложения, основываясь на том, что расширяется? Например, представьте проект с 1 объявленного класса:

class MyApplcation extends App { 

} 

Нет основной метод не требуется для проекта, который будет запущен, поскольку он расширяет приложение. Это не вопрос, хотя это моя целевая цель. Вопрос: Как можно создать пользовательскую пусковую установку JVM?

Я предполагаю, что это предполагает использование какой-то базы, чтобы дать нам какой-то скелет, но я не уверен, где найти такую ​​вещь.

ответ

6

Как JavaFX Реализует его применение Execution Model

приложений JavaFX, которые содержат не основной метод не может быть запущен из-за реализации JEP 153: Enhance the java command-line launcher to launch JavaFX applications.

Это была модификация логики запуска openjdk, чтобы проверить, расширяет ли класс, запуская приложение, и, если да, вызовите специальную программу запуска JavaFX, которая запустила среду выполнения Java и связанные потоки, создала окно GUI (в условиях JavaFX a Stage), затем создается экземпляр приложения avaFX и вызывается методы запуска и запуска приложения в соответствии с JavaFX application lifecycle rules.

Прослеживая реализацию через в коде:

  1. main.c для JVM вызывает JLILaunch в java.c
  2. java.c looks для класса Java sun.launcher.LauncherHelper и calls into the java class using JNI, вызывая функцию checkAndLoadMain.
  3. Если класс, который должен быть запущен, не имеет основного метода, но имеет extend the JavaFX application class, создается класс FXHelper, содержащий параметры запуска.
  4. Ссылка на FXHelper возвращается в java.c через JNI.
  5. java.c invokesmain method on the FXHelper через JNI.
  6. FXHelper uses reflection для вызова com.sun.javafx.application.LauncherImpl.launchApplication().
  7. JavaFX LauncherImpl настроит загрузчик классов приложений, а затем первый try to invoke a main() метод для основного класса приложения.
  8. Если метода main() нет, JavaFX LauncherImpl будет start up the JavaFX launcher thread.
  9. На пусковой установке LauncherImpl будет call init() on the JavaFX application.
  10. В прикладной нити JavaFX LauncherImpl будет create a new Stage (window) и pass it to the start method of the application.
  11. Когда последний этап закрыт или выйдет платформа JavaFX, the stop method on the application is called от LauncherImpl.
  12. Все дорожки вызова возвращаются, и приложение завершается, потому что больше нечего делать.

Как можно настроить пусковую

  1. захватить копию sun.launcher.LauncherHelper кода.
  2. Игнорируйте предупреждение в верхней части кода «Это НЕ является частью любого API, поддерживаемого Sun Microsystems. Если вы пишете код, который зависит от этого, вы делаете это на свой страх и риск. Этот код и его внутренние интерфейсы для изменения или удаления без уведомления ». и начать модификацию кода в любом случае.
  3. Создайте свою собственную версию FXHelper, которая будет вызывать ваш собственный LauncherImpl, а не JavaFX (в том случае, если основной класс приложения расширяет класс рамок приложения, а не JavaFX).
  4. Напишите свой собственный LauncherImpl, который устанавливает загрузчик классов для вашего приложения, создает экземпляр класса вашего приложения и вызывает все точки запуска, которые вы хотите использовать для своего типа приложения.
  5. Запустите свои приложения, разместив взломанную версию sun.launcher.LauncherHelper и вашу LauncherImpl on the boot class path, чтобы они были подняты вместо версий по умолчанию, которые отправляют JDK.

команда запуска образца, предполагая, что целевое приложение будет запущен в com.mycompany.MyApplication:

java -Xbootclasspath/p <launcher class directory> com.mycompany.MyApplication 
Смежные вопросы