Java 如果只有jar存在,如何实现对jar的可选支持
我正在开发一个供实用程序使用的jar库 我希望显著减少对外部JAR/库的依赖,但如果类路径中存在这样的库,则为其提供本机支持 例如,我希望库提供与hibernate一起工作的例程;但是,如果hibernate JAR不存在,我不希望应用程序因错误而死亡Java 如果只有jar存在,如何实现对jar的可选支持,java,jar,Java,Jar,我正在开发一个供实用程序使用的jar库 我希望显著减少对外部JAR/库的依赖,但如果类路径中存在这样的库,则为其提供本机支持 例如,我希望库提供与hibernate一起工作的例程;但是,如果hibernate JAR不存在,我不希望应用程序因错误而死亡 有没有一种方法可以实现这一点,而不必将hibernate JAR与我的库捆绑在一起?在初始化过程中,您可以使用查找一个hibernate类,如果它抛出一个ClassNotFoundException捕获它,并且您知道Hibernate不在环境中,
有没有一种方法可以实现这一点,而不必将hibernate JAR与我的库捆绑在一起?在初始化过程中,您可以使用查找一个hibernate类,如果它抛出一个
ClassNotFoundException
捕获它,并且您知道Hibernate不在环境中,那么请设置一个标志,以便您知道不要执行Hibernate特定的操作
但是请注意,如果您的任何类静态地引用Hibernate类(例如,通过导入
),则如果Hibernate不在类路径中,则不会加载这些类。通常的处理方法是:
- 为特定于Hibernate的东西创建一个接口,例如
HibernateStuff
- 仅从主代码中引用接口,不要通过
引用主代码中的任何Hibernate类import
- 将特定于Hibernate的内容放在实现该接口的类中,例如,
。那个类可以导入休眠的东西HibernateStuffImpl
- 一旦确定Hibernate位于类路径中(通过
),使用Class.forName
加载Class.forName
,然后使用创建它的实例,将其分配给HibernateStuffImpl
类型的变量HibernateStuff
- 使用该变量调用特定于Hibernate的内容
- 您可能有一个
类,该类通过不做任何操作来实现接口,并在未加载Hibernate时使用该类,这样您的代码就不会充满条件语句。(JVM在无操作调用时非常快。)HibernateStuffStub
…当然,以上所有内容都适用于任何东西,而不仅仅是Hibernate。检查类加载器在从jar文件加载类时的使用情况