Java加载资源
最近要从Jar中加载DLL,出现了好多问题。问题处理完,记录一下。
参考下面两篇文章:
http://swiftlet.net/archives/868
https://www.cnblogs.com/yejg1212/p/3270152.html
验证记录如下:
下面的代码用于读取资源路径
package com.example.test;
import java.net.URL;
public class CheckResourcePath {
public void disRsPath() {
URL urlEmp = CheckResourcePath.class.getResource("");
URL urlDot = CheckResourcePath.class.getResource(".");
URL urlRot = CheckResourcePath.class.getResource("/");
URL urlRes = CheckResourcePath.class.getResource("/libs/win/libfreexl-1.dll");
System.out.printf("class.getResource(\"\") : %s\n", urlEmp);
System.out.printf("class.getResource(\".\"): %s\n", urlDot);
System.out.printf("class.getResource(\"/\"): %s\n", urlRot);
System.out.printf("class.getResource(\"/libs/win/libfreexl-1.dll\") : %s\n", urlRes);
System.out.printf("\n");
urlEmp = CheckResourcePath.class.getClassLoader().getResource("");
urlDot = CheckResourcePath.class.getClassLoader().getResource(".");
urlRot = CheckResourcePath.class.getClassLoader().getResource("/");
urlRes = CheckResourcePath.class.getClassLoader().getResource("/libs/win/libfreexl-1.dll");
System.out.printf("loader.getResource(\"\") : %s\n", urlEmp);
System.out.printf("loader.getResource(\".\"): %s\n", urlDot);
System.out.printf("loader.getResource(\"/\"): %s\n", urlRot);
System.out.printf("loader.getResource(\"/libs/win/libfreexl-1.dll\") : %s\n", urlRes);
System.out.printf("\n");
}
}
Project目录结构如下:
├─src
│ └─com
│ └─example
│ └─test
│ CheckResourcePath.java
│ TestMain.java
│
│─testsrc
│ └─unitest
│ TestResource.java
│
├─libs
│ └─win
│ libfreexl-1.dll
│
├─bin
│
├─testbin
分别从不同的地方调用该函数
- 从本Project的Main函数调用:
Test in Current projectˉs main
class.getResource("") : file:/C:/Users/username/Workspaces/MyEclipse CI/VerifyJavaResourcePath/bin/com/example/test/
class.getResource("."): file:/C:/Users/username/Workspaces/MyEclipse CI/VerifyJavaResourcePath/bin/com/example/test/
class.getResource("/"): file:/C:/Users/username/Workspaces/MyEclipse CI/VerifyJavaResourcePath/bin/
class.getResource("/libs/win/libfreexl-1.dll") : null
loader.getResource("") : file:/C:/Users/username/Workspaces/MyEclipse CI/VerifyJavaResourcePath/bin/
loader.getResource("."): file:/C:/Users/username/Workspaces/MyEclipse CI/VerifyJavaResourcePath/bin/
loader.getResource("/"): null
loader.getResource("/libs/win/libfreexl-1.dll") : null
- 从其他Project调用
Test in current project's Junit
class.getResource("") : file:/C:/Users/username/Workspaces/MyEclipse CI/VerifyJavaResourcePath/bin/com/example/test/
class.getResource("."): file:/C:/Users/username/Workspaces/MyEclipse CI/VerifyJavaResourcePath/bin/com/example/test/
class.getResource("/"): file:/C:/Users/username/Workspaces/MyEclipse CI/VerifyJavaResourcePath/testbin/
class.getResource("/libs/win/libfreexl-1.dll") : null
loader.getResource("") : file:/C:/Users/username/Workspaces/MyEclipse CI/VerifyJavaResourcePath/testbin/
loader.getResource("."): file:/C:/Users/username/Workspaces/MyEclipse CI/VerifyJavaResourcePath/testbin/
loader.getResource("/"): null
loader.getResource("/libs/win/libfreexl-1.dll") : null
- 在Jar中调用
Test in other projectˇs main: call this project's jar
class.getResource("") : null
class.getResource("."): null
class.getResource("/"): file:/C:/Users/username/Workspaces/MyEclipse CI/CallVJRP/bin/
class.getResource("/libs/win/libfreexl-1.dll") : jar:file:/C:/Users/username/Workspaces/MyEclipse CI/verifyJavaResourcePath.jar!/libs/win/libfreexl-1.dll
loader.getResource("") : file:/C:/Users/username/Workspaces/MyEclipse CI/CallVJRP/bin/
loader.getResource("."): file:/C:/Users/username/Workspaces/MyEclipse CI/CallVJRP/bin/
loader.getResource("/"): null
loader.getResource("/libs/win/libfreexl-1.dll") : null
读取Jar中的资源时,class.getResource("/ResourcePathtTJarProjectRoot");
ResourcePathtTJarProjectRoot为该资源相对于Jar的project的根目录。本例中就是“/libs/win/libfreexl-1.dll”。不管是Linux还是Windows,目录分割用“/”,我之前用File.separator分割的,结果是null。