背景:有一个 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 里面打包