为什么 Java 应用程序不能从它自己的 .jar 加载库二进制文件?

Why can't a Java application load library binaries from its own .jar?

在为我的 Java 项目寻找一种方法来加载与项目一起打包的库二进制文件时,我看到几个人这样说:

before you can use the DLLs you need to actually extract these from the JAR and dump these on the hard disk somewhere otherwise you won't be able to load these

这个说法是真的吗?为什么?

动态 link 库 (DLL) 是特定于系统的,加载它们会调用 JVM 及其类加载器范围之外的某些操作系统操作。

因此您无法从 jar 文件中轻松加载它们。

DLL(动态 link 库)是特定于操作系统的。操作系统需要能够直接找到文件才能加载它们。 jar 文件本质上是一个 zip 文件,操作系统不会在 zip/jar 文件中寻找 DLL。

为了让操作系统找到一个 DLL,它需要可以直接在文件系统上访问,并且还可以在 OS.

的 DLL 路径中访问

请注意,jar 是 Java 特定实体,并且 Java 与操作系统不同。通过依赖于特定于 OS 的 DLL(或 Linux 中的 .o 文件),您可以限制程序在与库兼容的操作系统上运行——即使是位数(32 位或 64 位)也很重要一个动态链接库。

也就是说,如果您确实需要包含和使用 DLL,那么您将需要某种安装过程或说明来获取文件,然后才能 运行。