Java:如何干净地处理缺少外部库的情况?

Java:如何干净地处理缺少外部库的情况?,java,external,Java,External,我使用的是一个商业API库,我没有发布该库的许可证 我的应用程序的最终用户必须在类路径中安装库,才能使我的应用程序工作。除了jar之外,它们的LD_LIBRARY_路径中还必须有一些其他文件 我更愿意在启动时运行一个测试,确保安装了前提条件,并且我使用的对象能够正常工作。如果没有,则返回一条用户友好的消息,并附上说明或执行某种更正。(比如询问用户库的安装位置并将一些变量写入启动脚本) 我已经发现,我想我应该使用这个,但我还没有找到一个例子来说明我的用例,我不确定直接使用它是否合适 我相信如果lo

我使用的是一个商业API库,我没有发布该库的许可证

我的应用程序的最终用户必须在类路径中安装库,才能使我的应用程序工作。除了jar之外,它们的LD_LIBRARY_路径中还必须有一些其他文件

我更愿意在启动时运行一个测试,确保安装了前提条件,并且我使用的对象能够正常工作。如果没有,则返回一条用户友好的消息,并附上说明或执行某种更正。(比如询问用户库的安装位置并将一些变量写入启动脚本)

我已经发现,我想我应该使用这个,但我还没有找到一个例子来说明我的用例,我不确定直接使用它是否合适

我相信如果loadClass成功,我需要实例化一个类对象,并尝试使用它来确定LD_LIBRARY_路径是否设置正确


如果有任何帮助,我将不胜感激。

要查找jar是否可用,我将使用
Class.forName
尝试从该jar加载类


如果本机库在封装它们的类中的静态块中初始化/签入,那么同样的方法也应该适用于它们。

您需要一个抛出异常的方法,在该方法中可以捕获
ClassNotFoundException
NoClassDefFoundError

        public void testCatchException() {
            try {
                checkClassesExisting();
            } catch (ClassNotFoundException ex) {
                // TODO handle exception
            } catch (NoClassDefFoundError ex) {
                // TODO handle exception
            } catch (Exception ex) {
                // other error
            }
        }


        public void checkClassesExisting() throws Exception {
            // instantiate here the class in doubt
            Dummy = new Dummy("xx");
        }

附加信息位于

如果您需要购买第三方库才能使用您的库,您不应该做任何事情。让ClassNotFoundException到达顶部。异常将告诉您缺少哪个库


如果您捕获了ClassNotFoundException,并且库中的某个类存在配置问题,那么它将被您认为缺少的第三方库所掩盖

在这里,我试图让事情变得更复杂。谢谢你让我轻松。事实证明,你无法尝试/捕获
ClassNotFoundException
。如果这样做,您将收到以下错误:
ClassNotFoundException的不可访问捕获块。决不会从try语句体引发此异常
。您可以做的是尝试/捕获一个Throwable,但由于这可能是另一种错误,因此您必须检查getClass().getName().equals(“java.lang.NoClassDefFoundError”)的Throwable,并适当/不同于构造函数中可能出现的任何其他异常或错误。ok,请随时使用工作解决方案更新我的答案,或发布新答案。我确实想让用户知道问题所在,但我更愿意提供一条错误消息,让他们更好地理解。NoClassDefFoundError对我的最终用户没有任何意义。“找不到XX API。请参阅docs/apirors.pdf以获取此问题的解决方案”将更有帮助。至少要确保添加原始异常作为原因(通常是异常的第二个参数),以便它具有完全可见性…@AlexWien-事实证明,
ClassNotFoundException
不能这样捕获。我把实际实现/测试它推迟到今天早些时候。我正在研究一个解决方案,当我弄清楚的时候,我会发布它,但是我陷入了一个与类路径错误无关的泥潭,所以可能需要一两天的时间。好吧,有趣的是,我不明白为什么它不应该工作,也许你以后可以解释一下。显然,
ClassNotFoundException
是一个必须声明的已检查异常,否则会出现编译时错误。当java在运行时找不到类时,它会抛出一个错误而不是异常,因此通用的try/catch(异常e)也不起作用。但是错误和异常都源自Throwable,因此您可以使用一个通用的try/catch(Throwable e)来捕获NoClass和任何其他错误。好的,您可以用instanceof检查Throwable吗?