当前位置: 首页 > 知识库问答 >
问题:

Java,在类路径中加载本机库

戚祺
2023-03-14

我有以下分布

.__bin
|   |__start.sh
|
|__lib
    |__Main.jar
    |__Utility.jar
    |__lib.so

主要的jar包含main方法,我想在其中访问lib提供的本机函数。所以被捆绑在发行版中。开始sh只需设置java的类路径和引导。

加载库的最佳方法是什么。那么应用程序内部的库呢?我知道两种方法:

  • 系统。加载(绝对路径)
  • 系统。loadLibrary(名称)

前者需要库在文件系统中的绝对路径,后者需要设置特定于应用程序的java。图书馆路径JVM参数。在这种情况下,哪种解决方案更好?将在开始时设置库路径。你可能弄坏了什么东西?对于前一个解决方案,如何获取库的绝对文件系统路径?

共有2个答案

单耘豪
2023-03-14

load()方法需要库的完整路径名作为参数。例如,在Solaris系统上,您可能会编写:

System.load("/home/me/libs/libmylib.so");

加载libmylib。所以库位于/home/me/libs目录中。

使用load()方法依赖于系统,因为它使用路径名来加载库,并且路径名通常依赖于系统。因此,loadLibrary()有时是更好的选择。然而,动态可加载库本质上依赖于系统,因此使用load()可能不会像加载库本身那样损害系统独立性。

loadLibrary()方法只需要加载的名称:

System.loadLibrary("mylib");

loadLibrary()方法搜索库。loadLibrary()执行的搜索取决于您运行的系统,但通常会搜索为此目的设置的一个环境变量中列出的目录。

可以显式指定绝对路径。

除了系统独立性,在安全方面没有真正的区别。

参考文献:

1) https://security.stackexchange.com/questions/35724/security-implications-of-javas-system-load-vs-system-loadlibrary

2) https://www.chilkatsoft.com/java-loadLibrary-Linux.asp

百里雅珺
2023-03-14

假设我没有遗漏任何东西,这不是设置系统。加载最佳方法?你的自由。所以不会改变,因为你的结构中有它。如果您想让最终用户控制从其他地方加载本机/共享库,请在start中设置一个可选参数。否则就使用这个系统。加载()。只需确保检查操作系统的类型,因为文件路径的格式不同。

 类似资料:
  • 问题内容: 我有一个遵循标准目录布局的项目设置(虽然未使用Maven): 本机DLL位于资源文件夹中,而源位于Java文件夹中。resources文件夹是Java类路径的成员。 我现在想加载DLL,而不必设置JRE 选项或设置变量,以便可以通过简单的双击来启动生成的jar文件。 运行jar文件时是否可以将资源文件夹添加到库搜索路径而无需进行其他配置?例如,设置与清单中的相似? 问题答案: 直到今天

  • 在运行jar文件时,有没有可能将资源文件夹添加到库搜索路径中,而不必做额外的配置?例如。使用与清单中的类似的设置?

  • 如何使用类路径加载csv文件?在此之前,我尝试使用FileReader加载文件,这在本地运行时工作正常,但是当部署到外部服务器时会引发像FileNotFound这样的异常。下面的代码在本地工作,但是当部署在tomcat文件夹www/[jar]上的jar抛出这个异常不幸的是,我无法提供原始代码。这是要点:

  • 问题内容: 假设我已经使用Groovyc编译了Groovy脚本,该脚本已在文件系统中生成了一个或多个.class文件。如何从Java应用程序动态地将这些类添加到类路径中,以加载它们并调用它们的方法?目标是预编译Groovy脚本并将其存储到数据库中,以便可以从脚本的编译版本执行评估。 问题答案: 您可以创建URLClassLoader的实例以从目录加载新类: 第1 行将.class 创建到.clas

  • 是否有可能在运行时为本机库添加新路径?。(而不是使用Java.library.path属性启动Java),因此在尝试查找时,调用将包含该路径。这是可能的,还是一旦JVM启动,这些路径就被冻结了?

  • 问题内容: 是否可以在运行时为本机库添加新路径?(而不是使用属性java.library.path启动Java),因此在尝试查找时,对的调用将包含该路径。这是可能的,还是在JVM启动后冻结了这些路径? 问题答案: [此解决方案不适用于Java 10+] 没有一点黑客(即访问ClassLoader类的私有字段)似乎是不可能的 该博客提供了两种方法。 作为记录,这是简短版本。 选项1: 用新值完全替换