2012-05-11 2 views
3

Я разрабатываю библиотеку jar для использования утилитой.Как реализовать дополнительную поддержку для jar, если ТОЛЬКО она существует

Я хочу значительно уменьшить зависимости от внешних банок/библиотек, но предоставить встроенную поддержку такой библиотеки, если она существует в пути к классу.

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

Есть ли способ реализовать это, без необходимости связывать спящие баночки с моей библиотекой?

+0

Проверьте использование ClassLoaders для загрузки классов из файла jar – maress

ответ

6

Во время инициализации, вы можете использовать Class.forName чтобы посмотреть один из классов Hibernate, и если она бросает ClassNotFoundException поймать его, и вы знаете, Hibernate не в среде   — установить флаг так, что вы не знаете делать вещи, связанные с гибернацией.

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

  • Создайте интерфейс для вашего конкретного типа спящего режима, например. HibernateStuff.
  • Обратитесь к интерфейсу только от вашего основного кода и не обращайтесь к любым классам Hibernate в вашем основном коде через import.
  • Имейте свой Hibernate-специфический материал в классе, реализующем этот интерфейс, например, HibernateStuffImpl. То, что класс может import Спящий материал.
  • После того, как вы определили, что Hibernate находится в пути к классам (через Class.forName), используйте Class.forName, чтобы загрузить HibernateStuffImpl, а затем использовать Class#newInstance создать экземпляр этого, присвоив его переменной типа HibernateStuff.
  • Используйте эту переменную для вызова в свой тип Hibernate.
  • Возможно, у вас есть класс HibernateStuffStub, который реализует интерфейс, ничего не делая и используя это, когда Hibernate не загружен, поэтому ваш код не надувается условными операторами. (JVM очень быстро работает без звонков.)

... и, конечно же, все вышеизложенное относится ко всему, а не только к спящему.

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