【问题标题】:Cannot load Java GDAL native library in web application无法在 Web 应用程序中加载 Java GDAL 本机库
【发布时间】:2017-05-23 12:59:07
【问题描述】:

我在具有 Maven 依赖项的 Java Web 应用程序中使用 GDAL 库 java 作为依赖项:

    <dependency>
        <groupId>org.gdal</groupId>
        <artifactId>gdal</artifactId>
        <version>1.11.1</version>
    </dependency>

它包含一个 jar 文件并在 C++ 中运行本机代码,我必须从 Centos 中的软件包安装它。所有这些共享库都安装在

ls -l /usr/lib/java/gdal/
total 1380
-rwxr-xr-x 3 root root  23288 Feb 14  2016 libgdalconstjni.so
-rwxr-xr-x 3 root root  23288 Feb 14  2016 libgdalconstjni.so.1
-rwxr-xr-x 3 root root  23288 Feb 14  2016 libgdalconstjni.so.1.18.4
-rwxr-xr-x 3 root root 226696 Feb 14  2016 libgdaljni.so
-rwxr-xr-x 3 root root 226696 Feb 14  2016 libgdaljni.so.1
-rwxr-xr-x 3 root root 226696 Feb 14  2016 libgdaljni.so.1.18.4
-rwxr-xr-x 3 root root 136760 Feb 14  2016 libogrjni.so
-rwxr-xr-x 3 root root 136760 Feb 14  2016 libogrjni.so.1
-rwxr-xr-x 3 root root 136760 Feb 14  2016 libogrjni.so.1.18.4
-rwxr-xr-x 3 root root  73816 Feb 14  2016 libosrjni.so
-rwxr-xr-x 3 root root  73816 Feb 14  2016 libosrjni.so.1
-rwxr-xr-x 3 root root  73816 Feb 14  2016 libosrjni.so.1.18.4

但是,Web 应用程序无法链接,因为它在链接库时遇到问题,尽管我可以从 Java 的类加载器中看到:

System.out.println(System.getProperty("java.library.path"));
/opt/jdk1.8.0_25/jre/lib/amd64:/opt/jdk1.8.0_25/jre/lib/i386::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

其中包含 /usr/lib 文件夹。

当我调用GDAL API时GDAL java的错误(如果我不调用GDAL的方法没有错误,所以其他方法仍然有效,Web应用程序可以正常运行)是:

Caused by: java.lang.UnsatisfiedLinkError: org.gdal.osr.osrJNI.new_SpatialReference__SWIG_1()J
at org.gdal.osr.osrJNI.new_SpatialReference__SWIG_1(Native Method) ~[gdal-1.11.1.jar:na]
at org.gdal.osr.SpatialReference.<init>(SpatialReference.java:117) ~[gdal-1.11.1.jar:na]

我不知道如何解决这个问题,试图找到很多资源但没有帮助,因为我想将它部署为 Tomcat 服务器中的 Web 应用程序。在带有 JVM 选项的 NetBeans IDE 中设置时,我可以让它工作

-Djava.library.path="/usr/lib/java/gdal/"

但我知道这不是 Web 应用程序可以运行的。

【问题讨论】:

  • 如果我尝试手动加载共享对象: System.load("/usr/lib/java/gdal/libgdalconstjni.so");它不接受从头开始加载 原因:java.lang.UnsatisfiedLinkError: Native Library /usr/lib/java/gdal/libogrjni.so 已经在另一个类加载器中加载

标签: java c++ maven shared-libraries native


【解决方案1】:

在此博客 http://fahdshariff.blogspot.de/2011/08/changing-java-library-path-at-runtime.html 的大力帮助下,我可以做到这一点

Option 2: Add path to usr_paths
Instead of having to re-evaluate the entire java.library.path and sun.boot.library.path as in Option 1, you can instead append your path to the usr_paths array. This is shown in the following code:
/**
* Adds the specified path to the java library path
*
* @param pathToAdd the path to add
* @throws Exception
*/
public static void addLibraryPath(String pathToAdd) throws Exception{
    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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2012-09-13
    相关资源
    最近更新 更多