java - 如果仅存在 jar,如何实现对 jar 的可选支持

标签 java jar

我正在开发一个供实用程序使用的 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/

相关文章:

java - 使用 Apache Camel 的 FluentProducerTemplate 上的 ClosedChannelException

java - 获取zxing生成的图片路径

java - 使用自己实现的链表时出错

执行代码时显示java.lang.ClassNotFoundException : oracle. jdbc.internal.XMLTypeIntf 异常?

java - Java 库仍有问题

java - 如何清除for循环中的所有jTextField?

java - 数据源的 jndi 名称是否应该由 ServiceLocator 查找?

java - jar libs\commons-compress-1.18.jar 有一个主类 org.apache.commons.compress.archivers.Lister 与声明的 main 不匹配

Java——如何访问(导入)与 src 文件夹位于同一目录的文件夹中的类文件?

java - 加载jar库 加载库