java - 为什么 2 加载库 JNA 的路径
问题描述
你好这是我的代码:
if (isWindows()) {
//System.setProperty("jna.library.path", getClass().getResource("/resources/win32-x86").getPath());//netbeans WinOs
System.setProperty("jna.library.path", System.getProperty("user.dir").toString()+File.separator+"Desktop");//compiler WinOs
} else if (isMac()) {
//System.setProperty("jna.library.path", getClass().getResource("/resources").getPath());//netbeans MacOs
System.setProperty("jna.library.path", System.getProperty("user.dir").toString()+File.separator+"Desktop");//compiler MacOs
} else {
System.out.println("Your OS is not support!!");
}
为什么我有 2 路径(不明白,因为添加图像我只有一个路径)由操作系统,一个用于 IDE,另一个用于 .JAR ?
我刚刚意识到,当我使用 Windows 并运行项目(来自 netbeans)时,“库”加载并获得了信息,但是当我编译并启动我的 .jar 时,我得到了错误:
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: %1 is not a valid Win32 application.
它是正确的?
在 mac 上只能使用这个命令:java -jar "/System/Volumes/Data/Users/hugoclo/NetBeansProjects/Prezauto/dist/Prezauto.jar"
因为终端。如果单击 jar 我有消息错误:未找到.....对不起我的英语,
解决方案
“为什么”可能有两个原因。虽然 Java 是跨平台的,但 JNA(依赖于一些本机代码)在不同的操作系统上必须表现不同。特别是在加载 DLL (Windows) 或动态库 (OSX) 的情况下,您不想混搭。因为可能会为不同的操作系统编译具有相同名称的 dll,所以 JNA 的入门页面确定了这些库的标准位置:
使您的目标库可用于您的 Java 程序。做这件事有很多种方法:
- 首选方法是将
jna.library.path
系统属性设置为目标库的路径。此属性类似于java.library.path
,但仅适用于 JNA 加载的库。- 在启动 VM 之前更改适当的库访问环境变量。这是
PATH
在 Windows、LD_LIBRARY_PATH
Linux 和DYLD_LIBRARY_PATH
OSX 上。- 使您的本机库在您的类路径中可用,在 path 下
{OS}-{ARCH}/{LIBRARY}
,{OS}-{ARCH}
JNA 的本机库规范前缀在哪里(例如 win32-x86、linux-amd64 或 darwin)。如果资源在 jar 文件中,加载时会自动提取。
在您的代码中,您似乎正在尝试执行第一个选项(设置jna.library.path
)以包含用户的桌面。这对测试很好,对生产不利,并且可能是您编译的 jar 找不到它的原因。此外,通过设置此变量,您将覆盖它之前的任何(默认)位置。如果你想走这条路线,你应该复制保存的位置,然后将你自己的附加路径附加到它。
但是,对于您将分发给用户的代码,您不希望必须依赖绝对文件路径。最好将库放在标准的相对路径位置:执行时在您(或任何用户的)类路径上可用的resources
路径(如果使用 Maven)。src/main/resources
这似乎与代码的注释掉的 Windows 分支一致,它将在文件夹的win32-x86
子目录中查找resources
。
您可能已经告诉您的 IDE 向类路径添加一些内容(因此它可以在那里工作),但如果它不在标准位置,它可能会在 jar 中失败。
我不确定为什么代码的 macOS 分支没有将资源放在darwin
子目录中,但它可能应该。
推荐阅读
- javascript - 对象中的最高值,用键显示,javascript
- ios - 如何在数组中插入不同类型的元素
- angular - Angular2 - 如何在 *ngIf 中使用字符串枚举
- swift - 限制非高级用户每天仅写入一次 Firebase 数据库
- react-native - 标题 TabNavigator 的左期
- angular - RXJS 6 中的返回承诺
- java - javax.mail:无法向 SMTP 主机发送命令
- go - 去 dep 列表依赖链接
- angular - angular pip 函数如何创建和应用它 ngFor
- excel - 如何检查Excel表格单元格是否已被用户编辑?