Java-CLI构建web程序
本文将介绍如何使用Java原生命令打包构建一个java web项目。
虽说现在有ant、maven、gradle等打包构建工具,可以很方便的完成打包构建目标,但是不妨看看他们是如何封装jdk命令完成打包构建的。
另一方面,古老的项目,没有使用高级的打包构建工具也没有IDE的情况下,也只能自己通过脚本来完成原生的打包任务了。
再者,java9来了,jdk更新了许多新的命令,重新回忆下传统命令也是好的。
一、项目结构
1 | project |
二、编译源文件
1 | cd project |
javac为源文件的编译命令,其使用格式为:javac <options> <source files>
-g
默认情况下 javac
只生成行号和源文件信息,添加g
参数将生成所有的debug信息,其中包括本地变量(spring参数注解等)。
-cp
全拼是-classpath,可以指定源文件依赖的jar包或字节码文件
-d
可以指定字节码文件的输出目录
$(find ./src -name "*.java")
指定的是待编译的源文件,这里使用了系统的find命令来进行通配src目录下的所有java文件
更多javac命令细节参考java8 javac docs
三、按J2EE规范组织资源
J2EE规范规定了web资源文件、jar包文件、字节码文件等的组织结构如下,这也是最终war内部的目录结构
1 | project/out |
开始按这个结构调整目录
1 | cd project |
四、打war包
1 | cd project/out |
更多jar命令细节,参考java8 jar docs
五、FAQ
字节码文件目录中的文件找不到
原因
war包部署到web服务器启动时报文件(字节码文件目录中)找不到,这常常是由于源码目录中存放了非java文件,而我们上面说的步骤只是对源码目录进行了编译,没有处理这些非java文件,而这些文件确实被依赖,所以项目自然无法启动。
场景
举个实际场景如:使用mybatis时常会把ORM映射关系文件(xml)放在源码目录,如果不将映射文件移动到打包目录,打出来的war包就无法正常部署。
1 | project/src |
解决方案
将非java文件从源码目录移至WEB-INF/classes对应位置即可
1 | mv project/src/package1/* project/out/WEB-INF/classes/package1/ |
spring注解的参数无法解析
原因
javac
命令编译源文件的时候没有启了g
参数,如果没有开启,spring的注解将被忽略
参考Spring annotations and Javac debug mode
解决方案
开启g
参数来编译源文件
1 | javac -g ... |