使用 Java 打包 GDAL

Packaging GDAL with Java

我有一个 Java 项目在 Win7 上使用 GDAL 绑定。问题是由于绑定的性质,它需要设置环境变量才能工作,特别是 PATHGDAL_DATAGDAL_DRIVER_PATHPROJ_LIB。我的意思是它们很容易让我创建并指向 GDAL 目录。但是,如果我想分发它,这对普通用户来说将是一个笨拙的步骤。

我需要一些方法来配置 GDAL 绑定,用户可以将程序复制到任何他们喜欢的地方,其中包含 jar 和 GDAL 库,bootstrap 代码将自动设置 GDAL 以查找这些变量相对于它的当前位置。

现在我尝试了以下方法(它使用了一个非常相似的问题中提出的部分解决方案:package GDAL JAVA Binding and native library in a SWT plugin):

// define `root` before to grab the path of the where the JAR is located
// bit of a hack-y way to set the classpath
System.setProperty("java.library.path", root+"gdal");
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
fieldSysPath.setAccessible(true);
fieldSysPath.set(null, null);
// set these gdal config variables programatically
gdal.SetConfigOption("GDAL", root + "gdal");
gdal.SetConfigOption("GDAL_DATA", root + "gdal\gdal_data");
gdal.SetConfigOption("GDAL_DRIVER_PATH", root + "gdal\gdalplugins");
gdal.SetConfigOption("PROJ_LIB", root + "gdal\proj_lib");

但它在第一个 SetConfigOption() 中失败并出现以下错误:

Native library load failed.
java.lang.UnsatisfiedLinkError: C:\...\gdal\gdaljni.dll: Can't find dependent libraries

这意味着至少第一部分在工作,因为它正确定位了 gdaljni.dll,但似乎在 SetConfigOption() 可以做它的事情之前,它已经在尝试查看这些路径只是为了初始化失败了。

现在,如果我手动设置环境变量,显然,它运行良好。

GDAL 绑定来自:http://www.gisinternals.com/

对于没有提供 Windows 特定的答案,我深表歉意,但是类 Unix 系统和 Windows 系统之间的概念基本上是相同的。您遇到的错误是由于库路径(在 Windows 中,仍然是二进制 dll)不是所需路径的一部分。 GDAL 配置设置不管理到 DLL 的路由,而是管理内部数据的位置。

这可能不是最好的解决方案,但过去对我来说效果很好。关键是创建一个脚本来更新启动应用程序所需的路径。

在脚本中,您需要...

  1. 获取脚本本身的目录,以便您可以从系统上的任何位置启动应用程序。
  2. 在适当的环境变量中添加库的路径。使用 SCRIPT_PATH 作为路径的基础。
  3. 更新DYLD_LIBRARY_PATH(Mac),LD_LIBRARY_PATH(Linux),如果我记得的话,PATH(Windows)。
  4. 启动应用程序,就像您使用 SCRIPT_PATH 变量作为基础导出库路径一样。

这是一个示例,其中我没有在 Mac 上的 clang 中设置 rpath。

  • 套餐

    • bin/foo
    • lib/libtest.dylib
    • run.sh

运行 脚本

#!/bin/sh

#  Get the directory of this script being run
SCRIPT_PATH="`dirname ${BASH_SOURCE[0]}`"

# Export the Path
export DYLD_LIBRARY_PATH=$SCRIPT_PATH/lib:$DYLD_LIBRARY_PATH

#  Run the executable
$SCRIPT_PATH/bin/foo