使用 Java 打包 GDAL
Packaging GDAL with Java
我有一个 Java 项目在 Win7 上使用 GDAL 绑定。问题是由于绑定的性质,它需要设置环境变量才能工作,特别是 PATH
、GDAL_DATA
、GDAL_DRIVER_PATH
和 PROJ_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 的路由,而是管理内部数据的位置。
这可能不是最好的解决方案,但过去对我来说效果很好。关键是创建一个脚本来更新启动应用程序所需的路径。
在脚本中,您需要...
- 获取脚本本身的目录,以便您可以从系统上的任何位置启动应用程序。
- 在适当的环境变量中添加库的路径。使用
SCRIPT_PATH
作为路径的基础。
- 更新
DYLD_LIBRARY_PATH
(Mac),LD_LIBRARY_PATH
(Linux),如果我记得的话,PATH
(Windows)。
- 启动应用程序,就像您使用 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
我有一个 Java 项目在 Win7 上使用 GDAL 绑定。问题是由于绑定的性质,它需要设置环境变量才能工作,特别是 PATH
、GDAL_DATA
、GDAL_DRIVER_PATH
和 PROJ_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 的路由,而是管理内部数据的位置。
这可能不是最好的解决方案,但过去对我来说效果很好。关键是创建一个脚本来更新启动应用程序所需的路径。
在脚本中,您需要...
- 获取脚本本身的目录,以便您可以从系统上的任何位置启动应用程序。
- 在适当的环境变量中添加库的路径。使用
SCRIPT_PATH
作为路径的基础。 - 更新
DYLD_LIBRARY_PATH
(Mac),LD_LIBRARY_PATH
(Linux),如果我记得的话,PATH
(Windows)。 - 启动应用程序,就像您使用 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