编译与系统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.htmlhttps://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.jarlibgdalalljni.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
最后修改:2024 年 02 月 28 日
如果觉得我的文章对你有用,请随意赞赏