Java JNI GDAL 本机库在重新部署为 Web 应用程序时出现类加载器错误
Java JNI GDAL native library error with ClassLoader when redeploying as web application
我正在使用GDAL本机库(C++,它安装在/usr/lib/java/gdal中(。我不久前发现了一个技巧,允许Tomcat可以加载Web应用程序和这个库(不能使用System.load((或System.loadLibrary((,因为所有这些都会返回错误(
Caused by: java.lang.UnsatisfiedLinkError: org.gdal.osr.osrJNI.new_SpatialReference__SWIG_1()J
然后,我需要使用一个技巧在应用程序启动时将库路径添加到JVM:
final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
usrPathsField.setAccessible(true);
// get array of paths
final String[] paths = (String[]) usrPathsField.get(null);
// check if the path to add is already present
for (String path : paths) {
if (path.equals(pathToAdd)) {
return;
}
}
//add the new path
final String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
newPaths[newPaths.length - 1] = pathToAdd;
usrPathsField.set(null, newPaths);
当Tomcat从应用程序启动时,这很有效,但是,如果我重新部署应用程序,它将返回错误:由:
java.lang.UnsatisfiedLinkError:Native Library/usr/lib/java/gdal/libgdaljni.so 已经加载到另一个类加载器中
我在StackOverflow中找不到任何解决方案,所以我在这里问是否有人可以提供一些信息。我也无法更改或添加环境变量或Tomcat文件夹的库路径,所有这些都应该只在Java代码中完成。
为了避免将库添加到 Tomcat/lib 文件夹,我将所有 GDAL 本机文件夹复制到带有时间戳的临时目录(例如:/tmp/gdal_native/date.time(,然后我正常使用上面的代码,除非它检查以前的路径,它将覆盖新的路径。
String tmpTargetNativeFolderPath = "/tmp/gdal_native" + "/" + current date time
int i = 0;
// check if the path to add is already present
for (String path : paths) {
String pathFolder = StringUtils.substringBeforeLast(path, "/");
if (pathFolder.equals("/tmp/gdal_native")) {
// Override the old path with the new one
paths[i] = tmpTargetNativeFolderPath;
usrPathsField.set(null, paths);
return;
}
i++;
}
然后,当重新部署 Web 应用程序时,类加载器将从另一个文件夹加载库而没有错误,并且 usrPathsField 仅包含一个指向/tmp/gdal_native/timestamp 的文件夹路径。
相关文章:
- C# DLL 从C++应用程序调用 SOAP Web 服务
- 我的web应用程序的用户需要在浏览器上手动启用本机客户端吗
- Java JNI GDAL 本机库在重新部署为 Web 应用程序时出现类加载器错误
- 用于管理 CATIA 文件的 Web 应用程序
- 我想将使用 VTK、C++ 和 QT 开发的桌面应用程序移植到 Web 应用程序
- 拥有用于QT应用程序的Web用户界面的最佳方法
- 将C 代码(本机客户端)移植到浏览器(Web应用程序)
- 如果您不编写 Web 应用程序,并且您的客户端不是浏览器,那么 Web 套接字相对于常规套接字的优势是什么?
- 将Web应用程序作为资源嵌入到Qt可执行文件C++
- Windows窗体应用程序无法播放视频[VLC ActiveX插件和IE Web插件v2]
- 如何在web服务器中使用c++应用程序
- HOWTO:C 应用程序作为Web服务提供商和Java应用程序作为Web服务客户端
- 想要在Web应用程序中使用本机C库,我的选择是什么
- 如何在C++服务器应用程序和django web应用程序之间进行通信
- 将我的简单winsock服务器/客户端应用程序变形为简单的Web服务器
- 通过web界面远程控制c++应用程序
- 我可以通过使用 Wt 作为我的 Web 框架在 Web 应用程序中完全隐藏 "behind" C 代码吗?
- 在web应用程序中使用Zhu Ramanan代码
- 使用共享逻辑(MVC)将Qt桌面应用程序扩展到web服务
- Web 应用程序 - Web 应用程序和 C++