背景:有一个 JavaWeb 的老项目,即是非 Maven 的老项目希望通过流程化的方式使用 Docker 运行。
文章目录
- 涉及的问题
- javac 编译项目并打包
- 最后
涉及的问题
接到一个任务,肯定首先是要先明白需要完成什么样功能。再次是思考完成功能具体的步骤。下面是我的想法
- 使用原生的 javac 命令编译项目,并打包成 .war 文件
- 将 war 配合 tomcat 使用 Docker 方式运行
完成上面的两大步骤就可完成任务,不过继续细分就有很多的细节可以做,毕竟原生 javac 编译项目不太会,Docker 也不是很熟练。
javac 编译项目并打包
可能很多人想用 IDEA 配置方式,帮助我们打包,然后将 war 包直接在 Docker 中使用,这样是能完成任务:可以跑起来,但是整个发布过程并不能流程化,需要自己先去 IDEA 打包,然后再手动打镜像。
所以只能选择命令行的方式直接通过项目打包。
「涉及到 war 包的目录结构,建议先根据 IDEA 打的 war 包在 tomcat/webapps/ 下能够成功运行,此时可以进去查看你 war 解压后的目录结构」。
我这里 tomcat 自动解压后的目录:
yourProject
META-INF (我这里这个文件没啥用)
WEB-INF
classes
com/--/*.java
.properties 等项目配置文件
lib
web.xml 等系统配置文件
所有的项目 war 包都包括:
- 编译后的 classes 文件
- 所有的 .Java 文件
- .Java 文件需要的依赖 jar 包
- 项目里面的配置文件
- web.xml 、dispatcher.xml
- .properties
# find + > 将 src 下所有的 .java 文件 写到一个文件当中
find ../src/ -name *.java > ./sources.list
# 将原来的 .class 文件删除
rm -rf ./WEB-INF/classes/com/*
# -d:编译后的 .class 文件存放位置 -encoding 指定字符编码 -cp:指定要搜索类的路径 -extdirs:引用外部的依赖包(这里需要注意,引用依赖包的时候不用在 / 后面加 *.jar @:@加上文件名,就是对这个文件里的内容全部编译)
javac -d ./WEB-INF/classes -encoding utf-8 -cp ../lib/ -extdirs ./WEB-INF/lib/ @sources.list
# 最后使用 jar 命令 将所有准备好的东西全部打包(需要准备的内容:参考自己项目 tomcat 中解压后的结构,然后将对应文件放到对应位置即可) 这一步执行只是将文件打包而已,所以需要自己提前将文件准备好
jar -cvf CBHbase.war ./WEB-INF/*
# 最后就能使用了
最后
本文主要记录 javac 原生编译打包项目,所以 Docker 部分就跳过了
最后将 Dockerfile 写好即可。
现在有了脚本,就可以实现流程化发布应用,而不用每次去 IDEA 里面打包