引入.so,.dll
1. 在程序中引入
通过System.load()或System.loadLibrary()方法,手动加载共享库。
System.load("/path/to/your/library.so"); // linux
System.load("C:\\path\\to\\your\\library.dll"); // windows
//使用库名字引入(不含扩展名)
System.loadLibrary("your-library-name");
此外,部分三方sdk(如门禁厂商sdk)会基于sun公司的jna组件提供库文件,使用com.sun.jna.Native#loadLibrary(path, SDK.class)来加载动态链接库。此时以三方接入文档为准。
2. 使用环境变量(对静态引用较常见)
设置Linux下的LD_LIBRARY_PATH变量,或Windows下的PATH变量,在环境变量中定义库目录。
3. 使用Java虚拟机参数
可以在运行时,添加-Djava.library.path参数,指定共享库位置。
4. IDE中配置本地库路径
5. 使用三方包如Apache Commons IO包
如使用NativeUtils.loadLibraryFromJar()方法实现。
引入.jar
当你运行可执行JAR文件时,Java虚拟机除了从上述的路径(环境变量,java执行变量等)加载库之外,还会从JAR文件中的META-INF/MANIFEST.MF文件中获取Class-Path属性,该属性指定了依赖JAR文件的路径。这使得主JAR文件能够找到并加载其依赖的类库。
对jar依赖常见基于maven等构建工具来管理。使用maven管理时,通常会使用maven-assembly-plugin或maven-shade-plugin将依赖打包到可执行jar文件中。有时,jar文件在主JAR文件内部;另一些时候,jar会被打包到产品目录target下,以lib的路径引入。后者的示例如下:
your-project/
|-- target/
| |-- your-project-1.0-SNAPSHOT.jar (生成的主JAR文件)
| |-- lib/
| |-- dependency1.jar
| |-- dependency2.jar
| |-- ...
|-- src/
|-- main/
|-- java/
|-- com/
|-- example/
|-- YourMainClass.java
|-- pom.xml
在这个示例中,your-project-1.0-SNAPSHOT.jar 是主JAR文件,而lib目录包含所有依赖的JAR文件。当你运行your-project-1.0-SNAPSHOT.jar时,Java虚拟机会根据META-INF/MANIFEST.MF中的Class-Path属性找到并加载lib目录下的依赖。
确保在META-INF/MANIFEST.MF文件中有正确的Class-Path属性,并且依赖的JAR文件在lib目录下。这样,当用户运行主JAR文件时,Java虚拟机就能够正确地找到和加载所有的依赖。