我正在开发一个供实用程序使用的 jar 库。
我想显着减少对外部 jar/库的依赖,但如果此类库存在于类路径中,则为此类库提供 native 支持。
例如,我希望库提供与 hibernate 一起工作的例程;但是,如果不存在 hibernate jar ,我不希望应用程序因错误而死。
有没有一种方法可以实现这一点,而不必将 hibernate jar 与我的库捆绑在一起?
最佳答案
在初始化期间,您可以使用 Class.forName
查找 Hibernate 类之一,如果它抛出 ClassNotFoundException
捕获它并且您知道 Hibernate 不在环境中 - 设置一个标志以便您知道不要执行特定于 Hibernate 的事情。
但是请注意,如果您的任何类静态引用 Hibernate 类(例如,通过 import
),如果 Hibernate 不在类路径中,这些类将不会加载。通常的处理方法是:
- 为您的 Hibernate 特定内容创建一个接口(interface),例如
HibernateStuff
. - 仅在主代码中引用接口(interface),不要通过
import
在主代码中引用任何 Hibernate 类。 - 将特定于 Hibernate 的内容放在实现该接口(interface)的类中,例如
HibernateStuffImpl
。 那个 类可以导入
Hibernate 的东西。 - 一旦确定 Hibernate 在类路径中(通过
Class.forName
),使用Class.forName
加载您的HibernateStuffImpl
然后使用Class#newInstance
创建它的实例,将其分配给HibernateStuff
类型的变量。 - 使用该变量调用您的 Hibernate 特定内容。
- 您可能有一个
HibernateStuffStub
类,它什么都不做就实现了接口(interface),并在未加载 Hibernate 时使用它,这样您的代码就不会充斥着条件语句。 (JVM 在空操作调用时非常快。)
...当然,以上所有内容都适用于任何事物,而不仅仅是 Hibernate。
关于java - 如果仅存在 jar,如何实现对 jar 的可选支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10548158/