背景
有一个集中放so和dll文件的一个maven项目, 通过pom.xml进行引入到一个spring boot的项目中, 调用方法时报错URI is not hierarchical
, 但是再so所在的项目执行时没有报错的, 那么解决的思路就是把jar包解压出来, 放到临时目录后再调用native加载
![](https://img.haomeiwen.com/i18249296/85454bcce06e3ae4.png)
代码
public static <T> T load(Class<T> clazz, String relativePath) throws URISyntaxException, IOException {
//相对路径,如项目中resources/下的文件
URL url = Native.class.getClassLoader().getResource(relativePath);
URI uri = url.toURI();
String absPath = null;
//通过jar解压到临时目录后,再进行加载
if (uri.isOpaque()) {
File copyFile = copyFileFromJar(url, relativePath);
absPath = copyFile.getAbsolutePath();
} else {
absPath = new File(uri).getAbsolutePath();
}
return Native.loadLibrary(absPath, clazz);
}
private static File copyFileFromJar(URL url, String filePath) throws IOException {
JarURLConnection urlConnection = (JarURLConnection) url.openConnection();
JarFile jarFile = urlConnection.getJarFile();
InputStream is = jarFile.getInputStream(jarFile.getJarEntry(filePath));
String tempDirPath = System.getProperty("java.io.tmpdir");
File copyFile = new File(tempDirPath + File.separator + "snc_pre_process" + File.separator + filePath);
if (copyFile.exists()) {
copyFile.delete();
}
File parent = new File(copyFile.getParent());
if (!parent.exists()) {
parent.mkdirs();
}
FileOutputStream fos = new FileOutputStream(copyFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
fos.close();
is.close();
jarFile.close();
return copyFile;
}
网友评论