编译与系统GDAL版本一致的Java绑定库。
系统使用Debian12(其他版本以及其他发行版可参考),JDK版本选择了17,1.8以上都是支持的。最终只需要libgdalalljni.so
这个文件,其他的依赖全部使用包管理器和Maven中央仓库。
安装编译工具链
这里使用Docker创建一个环境进行编译。
sudo docker run --name gdal -it Debian:bookworm bash
sudo apt-get install dpkg-dev cmake libproj-dev swig defualt-jdk ant
使用包管理器安装GDAL源码
sudo apt-get source gdal
如果无法下载源码,需要在apt-get源中添加deb-src源。
Debian12的容器镜像开始使用DEB822格式,对应需要修改的文件为/etc/apt/sources.list.d/debian.sources
。types: deb deb-src URIs: http://deb.debian.org/debian # snip...
参考:https://repolib.readthedocs.io/en/latest/deb822-format.html
编译GDAL和Java绑定库
cmake是3.6.0之后唯一支持的编译系统,参考配置文档:https://gdal.org/development/building_from_source.html
进入源码目录,当前编写文档时的版本为3.6.2。
cd gdal-3.6.2+dfsg
mkdir build
cd build
配置CMake,为了节约编译时间,采用最小化编译配置,添加-DGDAL_BUILD_OPTIONAL_DRIVERS=OFF
和-DOGR_BUILD_OPTIONAL_DRIVERS=OFF
。
cmake -DGDAL_BUILD_OPTIONAL_DRIVERS=OFF -DOGR_BUILD_OPTIONAL_DRIVERS=OFF -DBUILD_JAVA_BINDINGS=ON -DBUILD_PYTHON_BINDINGS=OFF ..
检查是否生成Java绑定包,如果没有,可能因为JNI和Java配置不正确,根据文档进行排查。(https://cmake.org/cmake/help/latest/module/FindJava.html,https://cmake.org/cmake/help/latest/module/FindJNI.html)
检查输出文件中是否有以下内容:-- The following features have been enabled: * JNI SWIG_JAVA: Java binding * Java
开始编译
cmake --build . -j $(nproc)
最终生成的Java绑定库位于build/swig/java目录下,gdal.jar
和libgdalalljni.so
,将这个两个文件拷贝保存。
docker cp gdal:/root/gdal-3.6.2+dfsg/build/swig/java/gdal.jar /path/to/save
docker cp gdal:/root/gdal-3.6.2+dfsg/build/swig/java/libgdalalljni.so /path/to/save
使用方法
https://gdal.org/api/java/index.html
安装GDAL依赖。
sudo apt-get install libgdal32
将libgdalalljni.so放在java.library.path指定的目录或者系统默认的库目录,一般为/lib:/lib64/:/usr/lib:/usr/lib64
即可被程序自动加载。也可通过System.loadLibrary方法自行加载。
如果使用Maven管理依赖,gdal.jar
可使用中央仓库提供的版本,会更方便,需要保证主版本号和次版本号一致,对于当前3.6.2版本的GDAL,中央仓库提供了3.6.0的jar包。
<dependency>
<groupId>org.gdal</groupId>
<artifactId>gdal</artifactId>
<version>3.6.0</version>
</dependency>
如果中央仓库的jar包存在调用异常,则使用我们自己编译的版本。
<dependency>
<groupId>org.gdal</groupId>
<artifactId>gdal</artifactId>
<version>3.6.0</version>
<systemPath>${main.basedir}/lib/gdal.jar</systemPath>
<scope>system</scope>
</dependency>
在使用SpringBoot打包时,system包不会被包含,需要添加配置:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin>
测试代码
https://github.com/OSGeo/gdal/tree/master/swig/java/apps/gdalinfo.java
java -cp "/usr/share/java/gdal.jar" gdalinfo.java