当前位置: 首页 > 面试题库 >

如何在JAR内捆绑本机库和JNI库?

归松
2023-03-14
问题内容

我想要在一个JAR文件中具有本机库,JNI库和所有Java API类,以避免重新分配的麻烦。

似乎在GitHub上有尝试,但是
1.
2. 它不包括实际的本机库,仅包括JNI库。
3. 它似乎特定于Leiningen的本机依赖插件(它不能作为可再发行组件使用)。

问题是,我可以将所有内容捆绑在一个JAR中并重新分发吗?如果是,怎么办?

PS:是的,我意识到这可能会带来可移植性。


问题答案:

可以创建具有所有依赖性的单个JAR文件,包括一个或多个平台的本机JNI库。基本机制是使用System.load(File)加载库,而不是使用典型的System.loadLibrary(String)来搜索java.library.path系统属性。由于用户不必在系统上安装JNI库,因此此方法使安装更加简单,但是这样做可能会不支持所有平台,因为平台的特定库可能未包含在单个JAR文件中。

流程如下:

  • 在平台特定位置的JAR文件中包含本机JNI库,例如在NATIVE / $ {os.arch} / $ {os.name} /libname.lib
  • 在主类的静态初始化中创建代码以
  • 计算当前的os.arch和os.name
  • 使用Class.getResource(String)在预定义位置的JAR文件中查找库
  • 如果存在,请将其提取到临时文件中,并使用System.load(File)加载。
    我添加了为jzmq(ZeroMQ(无耻插件)的Java绑定)执行此操作的功能。该代码可以在这里找到。jzmq代码使用混合解决方案,因此,如果无法加载嵌入式库,则该代码将恢复为沿java.library.path搜索JNI库。


 类似资料:
  • 问题内容: 如何从jar库创建OSGi捆绑包? 问题答案: 如果您使用的是eclipse:有一个向导。 它允许您选择许多jar库,并创建一个包含这些jar的插件项目(即OSGi捆绑包)。 你可以在这里找到它:

  • 问题内容: 我做了一个Java应用程序。并将所有类捆绑在jar文件中。.我从netbeans运行项目,我的应用程序运行成功..但是我将我的.jar文件放在另一个地方,然后从那里运行..我没有我的应用程序使用的图标..在代码中,我从项目文件夹中存在的images目录中获取我的图标。 现在,我想知道如何将这些图像文件呈现给最终用户(就像我们呈现.jar文件一样)。 问题答案: 似乎这里有两个问题: 在

  • 我创建了一个Java应用程序,它使用运行库执行Python脚本。我想知道是否有一种方法可以将Python.exe和必需的库包含在Jar文件中?

  • 我制作了一个javafx应用程序表单,我得到了一个可执行的jar作为输出。现在,我的javafx应用程序依赖于两个第三方JAR,比如commons。伊奥。2.4.罐子 目前,为了运行我的应用程序,我必须像这样将这些依赖jar保存在可执行jar的类路径中 但我希望所有依赖的jar都捆绑在我的可执行jar中。 因为javafx使用ant构建,所以我尝试使用 但是在捆绑了所有依赖的jar之后,我没有得到

  • 目前,我在启动我的程序时使用JVM参数来查找JavaFX库,如下所示: 我的POM。xml的插件部分非常简单。除了Docker和Launch4j插件之外,我只有: 有没有办法告诉Maven将整个lib目录(其中包含JavaFX库和aspectJ/Spring仪器java代理)捆绑在jar中?这样做可以解决在我部署应用程序的任何地方都必须携带该lib文件夹的问题!谢谢! ******编辑******