如果只存在jar,如何实现对jar的可选支持

时间:2012-05-11 08:42:05

标签: java jar

我正在为实用程序开发一个jar库。

我希望显着减少对外部jar /库的依赖性,但如果它存在于类路径中,则为这样的库提供本机支持。

例如,我希望库提供与hibernate一起使用的例程;但是,如果hibernate jar不存在,我不希望应用程序因错误而死亡。

有没有办法实现这一点,而不必将hibernate jar与我的库捆绑在一起?

1 个答案:

答案 0 :(得分:6)

在初始化期间,您可以使用Class.forName查找其中一个Hibernate类,如果它抛出ClassNotFoundException捕获它并且您知道Hibernate不在环境中 - 设置一个标志所以你知道不要做特定于Hibernate的事情。

但请注意,如果您的任何类静态引用Hibernate类(例如,通过import),那么如果Hibernate不在类路径中,则不会加载这些类。解决这个问题的通常方法是:

  • 为您的Hibernate特定内容创建一个界面,例如HibernateStuff
  • 仅参考主代码中的界面,不要通过import引用主代码中的任何Hibernate类。
  • 在实现该接口的类中使用特定于Hibernate的内容,例如HibernateStuffImpl那个类可以import Hibernate的东西。
  • 一旦确定Hibernate位于类路径中(通过Class.forName),请使用Class.forName加载HibernateStuffImpl,然后使用Class#newInstance创建一个实例它,将它分配给HibernateStuff类型的变量。
  • 使用该变量调用特定于Hibernate的内容。
  • 您可能有一个HibernateStuffStub类通过什么都不做来实现接口,并在未加载Hibernate时使用它,因此您的代码不会被条件语句所覆盖。 (JVM在无操作呼叫时非常快。)

...当然,以上所有内容都适用于任何事情,而不仅仅是Hibernate。