Как запустить метод инициализатора в Java при запуске JVM? - PullRequest
0 голосов
/ 27 апреля 2018

Я создаю библиотеку Java из нескольких проектов Java, Maven. В любом из проектов нет основного метода, поскольку это библиотека. В веб-приложениях вы можете создать класс, который реализует ServletContextListener, и он будет выполняться при запуске вашего сервера (например, при запуске Tomcat). Я хочу сделать то же самое, но для библиотеки (которая не является веб-приложением или консольным приложением. Это просто библиотека многократного использования). Если кто-то пишет программу, использующую мою библиотеку, я хочу, чтобы мой класс initialzer выполнялся при запуске JVM, чтобы выполнить некоторую инициализацию, которую я хочу. Как я мог это сделать?

Спасибо

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Вы хотите, чтобы определенный код инициализации всегда выполнялся сначала, до использования библиотеки (Java).

Параметр J2EE / Spring, использующий @PostConstruct, уже задан для поставленного вопроса. Используя Java SE, вы можете инкапсулировать свою библиотеку Java с помощью класса singleton - класса, который является «входом» в остальные функции вашей библиотеки.

Конструктор класса singleton может вызвать весь необходимый код инициализации перед передачей управления вызывающей стороне (основному веб-приложению).

public class LibraryInstance {

    private FunctionalClass1 functionalClass1;
    private FunctionalClass2 functionalClass2;
    ...

    private LibraryInstance() { runInitializingCode(); }
    private static final LibraryInstance instance = new LibraryInstance();
    public static LibraryInstance getInstance() {
        return instance;
    }

    private void runInitializingCode() { 
        ....
    }
}

Должно работать "из коробки".

0 голосов
/ 30 апреля 2018

Если вы добавите JAR как -javaagent: в командной строке, метод premain будет вызываться до основной программы, которую вы запускаете.

, например

import java.lang.instrument.Instrumentation;

public class Agent {
  public static void premain(String args, Instrumentation instrumentation){
    // early initalization
  }
}

https://zeroturnaround.com/rebellabs/how-to-inspect-classes-in-your-jvm/

0 голосов
/ 28 апреля 2018

Полагаю, вопрос сводится к тому, как вы можете инициализировать свои объекты до того, как они будут использованы. Это, в свою очередь, зависит от того, какие данные вам нужны для инициализации. Если вам нужно:

  • для выполнения работы по инициализации, которая не зависит от внешней информации, вы можете сделать это при создании объекта (например, в конструкторе или, если вы используете инфраструктуру EE, в чем-то вроде аннотированного метода @PostConstruct), или в статическом блоке инициализации, который будет запущен во время загрузки класса.
  • данные из среды вашего пользователя, статические вызовы в классе System могут обеспечить это. Опять же, это можно сделать во время строительства объекта.
  • Статический выбор, который пользователи сделали в отношении того, как использовать вашу библиотеку, рассмотрите возможность использования файла свойств (который должен быть задокументирован). Опять же, строительство объекта - время для этого.
  • динамический выбор, который пользователи сделали при использовании вашей библиотеки, это будет доступно во время выполнения где-то внутри объектов, сотрудничающих с вашей библиотекой.

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

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

Редактировать : Просто чтобы прояснить, все эти опции находятся на уровне приложения. Сама JVM уже запущена и работает. Мы говорим об инициализации кода приложения, а не о JVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...