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

Java 如果只有jar存在,如何实现对jar的可选支持,java,jar,Java,Jar,我正在开发一个供实用程序使用的jar库 我希望显著减少对外部JAR/库的依赖,但如果类路径中存在这样的库,则为其提供本机支持 例如,我希望库提供与hibernate一起工作的例程;但是,如果hibernate JAR不存在,我不希望应用程序因错误而死亡 有没有一种方法可以实现这一点,而不必将hibernate JAR与我的库捆绑在一起?在初始化过程中,您可以使用查找一个hibernate类,如果它抛出一个ClassNotFoundException捕获它,并且您知道Hibernate不在环境中,

我正在开发一个供实用程序使用的jar库

我希望显著减少对外部JAR/库的依赖,但如果类路径中存在这样的库,则为其提供本机支持

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


有没有一种方法可以实现这一点,而不必将hibernate JAR与我的库捆绑在一起?

在初始化过程中,您可以使用查找一个hibernate类,如果它抛出一个
ClassNotFoundException
捕获它,并且您知道Hibernate不在环境中,那么请设置一个标志,以便您知道不要执行Hibernate特定的操作

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

  • 为特定于Hibernate的东西创建一个接口,例如
    HibernateStuff
  • 仅从主代码中引用接口,不要通过
    import
    引用主代码中的任何Hibernate类
  • 将特定于Hibernate的内容放在实现该接口的类中,例如,
    HibernateStuffImpl
    。那个类可以导入休眠的东西
  • 一旦确定Hibernate位于类路径中(通过
    Class.forName
    ),使用
    Class.forName
    加载
    HibernateStuffImpl
    ,然后使用创建它的实例,将其分配给
    HibernateStuff
    类型的变量
  • 使用该变量调用特定于Hibernate的内容
  • 您可能有一个
    HibernateStuffStub
    类,该类通过不做任何操作来实现接口,并在未加载Hibernate时使用该类,这样您的代码就不会充满条件语句。(JVM在无操作调用时非常快。)

…当然,以上所有内容都适用于任何东西,而不仅仅是Hibernate。

检查类加载器在从jar文件加载类时的使用情况