问题背景
开发一个Java程序,为了保证项目的完整性,都会使用成熟的 IDE 环境,并借助 Maven 这类项目管理工具来获取依赖、打包、发布等,有一定的操作门槛。
本文利用POD内现成的环境,省去调整java环境、获取大量依赖包的步骤,适用于开发小规模 udf jar 开发方案。大规模 udf 开发建议依旧按照完整的项目开发流程。
开发测试环境为 ArgoDB-5.2 ,后文不再进行额外标注,Inceptor 环境替换相关 pod 名与目录名即可。
操作步骤
获取任意 quark server 的 pod 名并进入 pod 环境
kubectl get pods -owide | grep quark | grep server
kubectl exec -it XXXXXX bash
进入依赖包目录
cd /usr/lib/inceptor/lib
确认目录中是否有 udf 必要的依赖包,例如 java 代码中用到了 jackson.databind 相关的类
import com.fasterxml.jackson.databind.JsonNode;
在当前目录搜索
ls | grep jackson
可以看到 ArgoDB 自带的环境满足依赖包需求,继续下一步
如果此处不满足依赖包需求,建议放弃此教程,使用完整的项目开发软件,或者在pod环境内引入必要的依赖 jar 包后,继续下一步
按照需求编写 java 代码文件,文件名以 FlattenJsonUDF.java 为例,内容略
vi FlattenJsonUDF.java
从当前目录中获取所有需要的依赖,并编译为 class 文件
javac -cp ".:/usr/lib/inceptor/lib/*" FlattenJsonUDF.java
将 class 文件打成 jar 包
jav -cvf FlattenJsonUDF.jar FlattenJsonUDF.class
移动至持久化目录,方便从主机中取出
mv FlattenJsonUDF.jar /var/log/quark1/
退出容器
exit
前往 quark server 所在节点,取出 jar 包,备份并持久化到镜像
如果 javac 编译时引入了 pod 内原本不存在的 jar 包,则此处同样要持久化到镜像中
mv /var/log/quark1/FlattenJsonUDF.jar /root/jar/
vi dockerfile
docker tag XXXXXX
docker build -f dockerfile -t XXXXXX ./
docker push XXXXXX
重启 quark,并测试 function 是否正常工作
CREATE PERMANENT FUNCTION XXXXXX AS 'XXXXXX';
兼容性
此开发方式理论上适用于所有容器化后的 Inceptor/ArgoDB 环境。
编译后的 jar 包在依赖包不发生变更的前提下,无需重新编译。例如本文用到的 jackson.databind 包,如果没有进行大版本变更,一般不会出现兼容性问题。
常见报错
javac 编译时出现 does not exist
引用的依赖包不存在,检查包名是否正确,在pod环境内引入必要的依赖 jar 包,或者放弃本教程,使用完整的项目开发软件