gpt4 book ai didi

Java包含多个库,在运行时决定使用哪一个?

转载 作者:行者123 更新时间:2023-12-02 05:57:05 27 4
gpt4 key购买 nike

我想将我的应用程序的串行库从 purejavacomm 更改为至 jRxTx 。这应该相对容易,因为它们具有非常相似的功能。

但是由于我使用 purejavacomm 的应用程序经过了良好的测试并受到客户的信任,而使用 jRxTx 的应用程序我不想在我的代码中包含这两个库。

因此,当我在客户系统中发现 jRxTx 实现存在问题时,我只需从客户 PC 中删除 jRxTx.jar,它就会自动再次使用 purejavacomm。

我想为此编写一个小测试程序,看看当 jRxTx.jar 不存在时我是否可以捕获 NoClassDefFoundError 并使用 purejavacomm 代替,但这似乎不起作用。

     try {
try {
gnu.io.SerialPort jrxtxSerialPort;

gnu.io.CommPortIdentifier portIdentifier = gnu.io.CommPortIdentifier.getPortIdentifier("COM12");

jrxtxSerialPort = (gnu.io.SerialPort) portIdentifier.open("Test", 0);
jrxtxSerialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
jrxtxSerialPort.setSerialPortParams(19200, 8, 1, SerialPort.PARITY_EVEN);
jrxtxSerialPort.getOutputStream().write("TEST\n".getBytes());
System.out.println("\n" + readFromInputStream(jrxtxSerialPort.getInputStream()) + "\n\n");
jrxtxSerialPort.close();
jRxTxLibFound = true;
} catch (java.io.IOException e) {
e.printStackTrace();
} catch (gnu.io.NoSuchPortException e) {
e.printStackTrace();
} catch (gnu.io.PortInUseException e) {
e.printStackTrace();
} catch (gnu.io.UnsupportedCommOperationException e) {
e.printStackTrace();
}
} catch (java.lang.NoClassDefFoundError e) {
System.out.println("jRxTx not found. Try with purejavacomm");
}

我预计这段代码会捕获 NoClassDefFoundError 但我仍然得到 NoClassDefFoundError:

java.lang.NoClassDefFoundError: gnu/io/NoSuchPortException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: gnu.io.NoSuchPortException
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main"

最佳答案

我通过为每个库编写包装类来解决这个问题,这些类实现了一个公共(public)接口(interface)。此接口(interface)有一个静态 getInstance() 方法,该方法在类路径中查找 jRxTx.jar 文件,如果找不到,则接口(interface)返回 purejavacomm 类。

String classpathStr = System.getProperty("java.class.path");
if (classpathStr.contains("jrxtx.1.0.1.jar")) {
return new JRxTxCommPortIdentifier();
} else {
return new PureJavaCommCommPortIdentifier();
}

JRxTxCommPortIdentifierPureJavaCommCommPortIdentifier 是两个包装类。

如果您知道解决此问题的任何更优雅的方法,请告诉我。

关于Java包含多个库,在运行时决定使用哪一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56002433/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com