Java加载资源

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
分别从不同的地方调用该函数

  1. 从本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
  1. 从其他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
  1. 在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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值