2013-07-29 2 views
3

Я ищу общий обратный эквивалент ShutdownHook в Java Runtime, то есть что-то вроде StartupHook, где может быть выполнен определенный пользовательский код разминки или настройки при запуске JVM.Есть ли обратный эквивалент Java Runtime ShutdownHook i.e StartupHook?

Я знаю об альтернативах, таких как использование ServletContexts и т. Д. При запуске контейнеров сервлетов или подобных подобных функциях в других средах, таких как Spring и т. Д. Но это не то, что я ищу. Я ищу общее решение JVM, если оно доступно.

Пожалуйста, дайте мне знать, если бы вся идея StartupHook была бы нецелесообразной для JVM и почему.

Update: После прохождения всех ответов (спасибо всем), кажется, что ближе всего к тому, что я ищу является Java Agents.

Хотя было бы неплохо (от простоты в использовании точки зрения, но, вероятно, не с точки зрения безопасности), если виртуальная машина позволяет мне сделать что-то вроде этого:

  1. Написать класс который реализует StartUpHook только один метод - пустое preMain()
  2. Поместить этот класс в файл банки и поставить эту банку в путь к классам или каталог JRE расширений
  3. Когда JVM запускается, он выглядит для всех классов в пути к классам который реализует StartUpHook, а затем вызывает его метод preMain().
+1

Как бы вы добавили пусковой крючок? –

+0

Через некоторую опцию командной строки JRE, я полагаю? Как -Dproperty = значение? – tsaixingwei

ответ

3

В Java нет загрузочного крючка. Ваш выбор (в том порядке, в котором я бы рекомендовал их).

  • Использовать функцию обратного вызова при запуске фреймворка, в котором вы работаете (т. Е. Сервлеты, Spring и т. Д.). Это также включает в себя просто наличие того, кто пишет основной метод, дает вам обратный вызов.
  • Оберните метод main(String[]) с помощью своего собственного метода main(String[]), а затем передайте его после вызова основной строки из командной строки.
  • Создайте библиотеку java agent с определением Premain-Class в манифесте jar, затем добавьте агента в JVM в командной строке.

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

+0

Я знаком с вашим выбором нет. 1 (через использование ServletContexts в Tomcat и т. Д.). – tsaixingwei

+0

Ваш выбор нет. 2 не подходит для меня, поскольку я пишу библиотеку, и к моменту загрузки моей библиотеки основной метод уже выполнен? – tsaixingwei

+0

Я думаю, что я действительно ищу выбор № 3 = java-агенты? Чтение через документы Java, кажется, что java-агенты могут быть автоматически запущены через некоторое время, когда JVM инициализируется, и это может контролироваться некоторыми параметрами, предоставляемыми в папках MANIFEST моей библиотеки jar. – tsaixingwei

2

Каков ваш прецедент?

Единственная причина, по которой крючки остановки полезны, потому что вы не знаете , когда JVM отключится. Некоторая часть кода может неожиданно вызвать System.exit, или все окна в графическом интерфейсе могут быть закрыты, что приведет к прекращению работы JVM.

С другой стороны, вы всегда знаете, когда запускается JVM. Поместите любой код, который необходимо запустить при запуске в вашем методе main.

+0

@ Downvoter Почему? – Jeffrey

+0

жир-палец на мышь, извините. – bmargulies

+0

Возможный вариант использования? Скажем, я пишу библиотеку, и я хочу, чтобы какой-то код запускался всякий раз, когда пользователи моей библиотеки ошибались .. использует мою библиотеку, и я не хочу требовать от них явного вызова некоторых приложений App.init() или App.start() метод. – tsaixingwei

0

См. http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html.

Вы должны быть агентской библиотекой и определить основной метод.

+0

Errm ... Я не управляю JVM, если я пишу библиотеку, используемую другими людьми, которые контролируя JVM, потому что это те, кто будет писать «основной» метод и загружать мою библиотеку. – tsaixingwei

+0

Затем дайте им основной метод в вашей библиотеке и попросите их назвать его основным методом. – bmargulies

+0

См. Мои другие комментарии выше, относящиеся к используемому случаю, например автоматической загрузке драйверов JDBC, без необходимости явно вызывать Class.forName («jdbc.driver.class») в JRE 6 и выше. В этом случае пользователю ящиков драйвера даже не нужно вызывать какой-либо метод в библиотеке, чтобы класс драйвера загружался во время инициализации JVM. Конечно, этот механизм включен реализацией JVM-поставщиком DriverManager. – tsaixingwei

1

Просто напишите статический блок инициализатора в классе, который, как вы знаете, будет загружен при запуске.

+0

Но тогда, что произойдет, если этот класс используется в другой программе, которая не хочет какого-либо поведения при запуске, «крючок запуска»? – Jeffrey

+0

Возможно, тогда «крючок запуска» может проверить наличие определенных переменных среды или свойств командной строки (например, -Dproperty = value)? – tsaixingwei

+0

Не является ли код в статическом блоке инициализатора класса, выполняемого только тогда, когда этот класс фактически ссылается на код вызывающего?Возможно ли, чтобы «пусковой крючок» моей библиотеки вызывался, даже когда ни один из его классов не упоминается в коде вызывающего абонента, а просто загружается библиотека, потому что она находится в пути к классам? Например, «автозапуск» автоматически инициализирует демона в фоновом режиме, просто используя эту библиотеку в пути к классам? – tsaixingwei

0

Как насчет использования статического блока в классе java, где вызывается main. Статический блок в этом случае будет действовать как пусковой крючок, если вы не хотите контролировать параметры уровня jvm

Смежные вопросы