Geotools OGR插件UnsatisfiedLinkError问题:缺失ogrjni或gdalalljni
Geotools OGR插件GDAL配置失败问题
问题描述
使用Geotools的OGR插件时,无法正确配置GDAL。根据官方文档要求,需使用GDAL 3.2或更低版本,但使用第三方提供的GDAL二进制包时遇到以下矛盾问题:
- 采用GDAL 2.2.3版本:触发
gdalalljni的UnsatisfiedLinkError,确认该版本确实缺失gdalalljni.dll文件 - 采用GDAL 3.1.4版本:触发
ogrjni的UnsatisfiedLinkError,该版本同样缺失ogrjni.dll文件
可见2.2.3版本缺少gdalalljni.dll,后续版本虽补上该文件却移除了ogrjni.dll,导致两种版本都无法满足Geotools OGR插件的依赖要求。
3.1.4版本堆栈跟踪示例
Native library load failed. java.lang.UnsatisfiedLinkError: no ogrjni in java.library.path: [C:\Program Files\Java\jdk-11\bin, C:\WINDOWS\Sun\Java\bin, C:\WINDOWS\system32, C:\WINDOWS, C:\Program Files\Microsoft SDKs\Azure\CLI2\wbin, C:\Program Files (x86)\Common Files\Oracle\Java\javapath, C:\WINDOWS\system32, C:\WINDOWS, C:\WINDOWS\System32\Wbem, C:\WINDOWS\System32\WindowsPowerShell\v1.0\, C:\WINDOWS\System32\OpenSSH\, C:\Program Files\dotnet\, C:\Program Files\nodejs\, C:\Program Files\Microsoft SQL Server\150\Tools\Binn\, C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\, C:\Program Files\PowerShell\7\, C:\Program Files\PuTTY\, C:\Program Files\RedHat\Podman\, C:\gdal-314\bin\gdal\java, C:\gdal-314\bin, C:\gdal-314\bin\gdal\apps, C:\aliases, C:\Users\sehe\AppData\Local\Programs\Git\cmd, C:\Users\sehe\AppData\Local\Programs\oh-my-posh\bin, C:\Users\sehe\AppData\Roaming\pypoetry\venv\Scripts, C:\Users\sehe\AppData\Local\Programs\Microsoft VS Code\bin, C:\Users\sehe\AppData\Roaming\npm, C:\Program Files\Azure Data Studio\bin, C:\Users\sehe\AppData\Local\Microsoft\WindowsApps, C:\Users\sehe\AppData\Local\Programs\EmEditor, C:\Users\sehe\AppData\Local\Pandoc\, C:\Users\sehe\AppData\Local\Programs\Gpg4win\..\GnuPG\bin, C:\Users\sehe\AppData\Roaming\Programs\Zero Install, C:\Users\sehe\.dotnet\tools, C:\grails-4.1.4\bin, ., .] Caught: java.lang.UnsatisfiedLinkError: org.gdal.ogr.ogrJNI.GetDriverCount()I java.lang.UnsatisfiedLinkError: org.gdal.ogr.ogrJNI.GetDriverCount()I at org.gdal.ogr.ogrJNI.GetDriverCount(Native Method) at org.gdal.ogr.ogr.GetDriverCount(ogr.java:114) at org.geotools.data.ogr.jni.JniOGR.<clinit>(JniOGR.java:88) at org.geotools.data.ogr.jni.JniOGRDataStoreFactory.createOGR(JniOGRDataStoreFactory.java:32) at org.geotools.data.ogr.OGRDataStoreFactory.getAvailableDrivers(OGRDataStoreFactory.java:285) at GeotoolsTest.run(GeotoolsTest.groovy:12)
测试代码(Groovy)
import org.geotools.data.ogr.OGRDataStoreFactory import org.geotools.data.ogr.jni.JniOGRDataStoreFactory OGRDataStoreFactory factory = new JniOGRDataStoreFactory() for (String driver : factory.getAvailableDrivers()) { System.out.println(driver); }
Gradle构建文件
plugins { id 'groovy' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCentral() maven { url "https://repo.osgeo.org/repository/geotools-releases/" } maven { url "https://packages.atlassian.com/maven-3rdparty/" } } dependencies { implementation 'org.apache.groovy:groovy-all:4.0.14' implementation group: 'org.geotools', name: 'gt-main', version: '32.1' implementation group: 'org.geotools', name: 'gt-ogr-core', version: '32.1' implementation group: 'org.geotools', name: 'gt-ogr-jni', version: '32.1' } test { useJUnitPlatform() } configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == 'javax.media') { if (details.requested.name == 'jai_core') { details.useTarget group: 'javax.media', name: 'jai-core', version: details.requested.version } } } }
当前环境变量配置
GDAL_SDK_ROOT = C:\gdal-314GDAL_DATA = %GDAL_SDK_ROOT%\bin\gdal-dataPATH = %GDAL_SDK_ROOT%\bin\gdal\java;%GDAL_SDK_ROOT%\bin;%GDAL_SDK_ROOT%\bin\gdal\apps
已确认PATH配置正确,问题根源是GDAL二进制包中缺失对应的依赖DLL,恳请提供解决方案。
内容的提问来源于stack exchange,提问作者Zorobay
相关产品推荐
相关产品推荐

