3

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

我想显着减少对外部 jars/库的依赖,但如果它存在于类路径中,则为此类库提供本机支持。

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

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

4

1 回答 1

7

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

但是请注意,如果您的任何类静态引用了 Hibernate 类(例如 via import),如果 Hibernate 不在类路径中,这些类将不会加载。通常的处理方法是:

  • 为您的 Hibernate 特定的东西创建一个接口,例如HibernateStuff.
  • 只在你的主代码中引用接口,不要在你的主代码中通过import.
  • 将特定于 Hibernate 的东西放在实现该接口的类中,例如HibernateStuffImpl. 那个类可以import休眠的东西。
  • 一旦您确定 Hibernate 在类路径中(通过Class.forName),使用Class.forName加载您的HibernateStuffImpl然后使用Class#newInstance创建它的实例,将其分配给 type 的变量HibernateStuff
  • 使用该变量调用特定于 Hibernate 的内容。
  • 您可能有一个HibernateStuffStub通过什么都不做来实现接口的类,并在未加载 Hibernate 时使用它,因此您的代码不会充满条件语句。(JVM 在无操作调用方面非常快。)

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

于 2012-05-11T08:45:12.787 回答