编译与系统GDAL版本一致的Java绑定库。 系统使用Debian12(其他版本以及其他发行版可参考),JDK版本选择了17,1.8以上都是支持的。最终只需要`libgdalalljni.so`这个文件,其他的依赖全部使用包管理器和Maven中央仓库。 ## 安装编译工具链 这里使用Docker创建一个环境进行编译。 ```shell sudo docker run --name gdal -it Debian:bookworm bash sudo apt-get install dpkg-dev cmake libproj-dev swig defualt-jdk ant ``` ## 使用包管理器安装GDAL源码 ```shell sudo apt-get source gdal ``` > 如果无法下载源码,需要在apt-get源中添加deb-src源。 > Debian12的容器镜像开始使用DEB822格式,对应需要修改的文件为`/etc/apt/sources.list.d/debian.sources`。 > ```text > 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。 ```shell cd gdal-3.6.2+dfsg mkdir build cd build ``` 配置CMake,为了节约编译时间,采用最小化编译配置,添加`-DGDAL_BUILD_OPTIONAL_DRIVERS=OFF`和`-DOGR_BUILD_OPTIONAL_DRIVERS=OFF`。 ```shell 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) > 检查输出文件中是否有以下内容: > ```text > -- The following features have been enabled: > * JNI > SWIG_JAVA: Java binding > * Java > ``` 开始编译 ```shell cmake --build . -j $(nproc) ``` 最终生成的Java绑定库位于build/swig/java目录下,`gdal.jar`和`libgdalalljni.so`,将这个两个文件拷贝保存。 ```shell 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依赖。 ```shell 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包。 ```xml org.gdal gdal 3.6.0 ``` 如果中央仓库的jar包存在调用异常,则使用我们自己编译的版本。 ```xml org.gdal gdal 3.6.0 ${main.basedir}/lib/gdal.jar system ``` > 在使用SpringBoot打包时,system包不会被包含,需要添加配置: > ```xml > > org.springframework.boot > spring-boot-maven-plugin > > true > > > ``` ## 测试代码 https://github.com/OSGeo/gdal/tree/master/swig/java/apps/gdalinfo.java ```shell java -cp "/usr/share/java/gdal.jar" gdalinfo.java ``` Loading... 编译与系统GDAL版本一致的Java绑定库。 系统使用Debian12(其他版本以及其他发行版可参考),JDK版本选择了17,1.8以上都是支持的。最终只需要`libgdalalljni.so`这个文件,其他的依赖全部使用包管理器和Maven中央仓库。 ## 安装编译工具链 这里使用Docker创建一个环境进行编译。 ```shell sudo docker run --name gdal -it Debian:bookworm bash sudo apt-get install dpkg-dev cmake libproj-dev swig defualt-jdk ant ``` ## 使用包管理器安装GDAL源码 ```shell sudo apt-get source gdal ``` > 如果无法下载源码,需要在apt-get源中添加deb-src源。 > Debian12的容器镜像开始使用DEB822格式,对应需要修改的文件为`/etc/apt/sources.list.d/debian.sources`。 > ```text > 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。 ```shell cd gdal-3.6.2+dfsg mkdir build cd build ``` 配置CMake,为了节约编译时间,采用最小化编译配置,添加`-DGDAL_BUILD_OPTIONAL_DRIVERS=OFF`和`-DOGR_BUILD_OPTIONAL_DRIVERS=OFF`。 ```shell 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) > 检查输出文件中是否有以下内容: > ```text > -- The following features have been enabled: > * JNI > SWIG_JAVA: Java binding > * Java > ``` 开始编译 ```shell cmake --build . -j $(nproc) ``` 最终生成的Java绑定库位于build/swig/java目录下,`gdal.jar`和`libgdalalljni.so`,将这个两个文件拷贝保存。 ```shell 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依赖。 ```shell 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包。 ```xml <dependency> <groupId>org.gdal</groupId> <artifactId>gdal</artifactId> <version>3.6.0</version> </dependency> ``` 如果中央仓库的jar包存在调用异常,则使用我们自己编译的版本。 ```xml <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包不会被包含,需要添加配置: > ```xml > <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 ```shell java -cp "/usr/share/java/gdal.jar" gdalinfo.java ``` 最后修改:2024 年 02 月 28 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏