之前打包GDAL代码在docker中运行以后报错,报错信息如下:
之后查找各方资料发现是GDAL运行需要的so文件(linux环境,windows是dll文件)没有被找到,
搜寻了多方资料总算解决了,下面贴出我的解决步骤。
1. 配置POM
1. 引入依赖
<dependency> <groupId>org.gdal</groupId> <artifactId>gdal</artifactId> <version>3.2.0</version> </dependency>
2. 配置resource
由于gdal.jar被放置到了resource/lib目录下,故需要在新增一下配置,不然打包的时候识别不到
(不知道为啥jdal.jar放这里的可以去看我的另外一篇文章:Springboot+GDAL3.x在windows上配置开发环境-CSDN博客)
<resource> <directory>${project.basedir}\src\main\resources\jar</directory> <targetPath>BOOT-INF/lib/</targetPath> <includes> <include>**/*.jar</include> </includes> </resource>
2. 新增GDAL环境配置类
/**
* @author : chenss
* @date : 2023/11/25
*/
@Component
@Slf4j
public class GdalLoaderEngine {
private static final String DefaultOsPath = "gdal.os.path";
/**
* gdal环境初始化
*/
@PostConstruct
public void init() {
//1.尝试从变量中获取gdal.os.path
String property = System.getProperty(DefaultOsPath);
System.out.println("*********"+property+"****************");
boolean isOk = false;
boolean isWin = false;
if (StringUtils.isNotBlank(property)) {
log.info("-------GdalLoaderEngine1-------尝试从[{}]中获取gdal配置文件", property);
isOk = loadGdal(property);
}
//4.如果是Linux环境最后还没有则从/usr/lib 中加载
if (!isOk && !System.getProperty("os.name").toLowerCase().contains("win")) {
String filePath = "/usr/lib"+ "/libgdaljni.so";
log.info("-------GdalLoaderEngine4.1-------尝试从[{}]中获取gdal配置文件", filePath);
isOk = loadGdal(filePath);
if(!isOk){
filePath="/usr/lib"+ "/libgdalalljni.so";
log.info("-------GdalLoaderEngine4.2-------尝试从[{}]中获取gdal配置文件", filePath);
isOk = loadGdal(filePath);
}
}
//如果还没获取到配置文件 则打印错误日志
if (!isOk) {
log.error("-------GdalLoaderEngine-------获取gdal环境失败!!,请检查配置文件!!");
} else {
//注册gdal驱动
gdal.AllRegister();
log.info("-------GdalLoaderEngine------- 加载配置成功");
}
}
private static boolean loadGdal(String gdalPath) {
File file = new File(gdalPath);
if (!file.exists()) {
return false;
}
try {
//加载驱动
System.load(file.getAbsolutePath());
} catch (Exception e) {
return false;
}
return true;
}
}
3.镜像拉取及Dockerfile编写
在Linux上,gdal官网上没有编译好的包,要自己去下gdal的源码包,然后自己编译,后面会生成.so文件和jar包。我用的方法是拉去了gdal3.2的镜像,把jar包丢进去直接运行,下面贴出我的Dockerfile。
FROM osgeo/gdal:3.2.0
ENV work_dir /home
ENV LANG C.UTF-8
WORKDIR ${work_dir}
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY simsun.ttc /usr/share/fonts/ttf-dejavu/simsun.ttc
COPY simsun.ttf /usr/share/fonts/ttf-dejavu/simsun.ttf
COPY ./xx.jar /tmp/xx.jar
ENTRYPOINT java -jar -Xmx1536m /tmp/km-raster-core-1.0-SNAPSHOT.jar -D java.awt.headless=true
基于Dockerfile构造镜像,运行容器后可以看到日志中提示GDAL环境配置成功。
下面贴出我的参考连接: