1 概述
编写Java代码之后,需要经过编译、打包字节码、打包源码、生成文档之类的操作,这些操作里面的涉及到各种各样的工具和参数配置,这里仅介绍最基础的。
建议这块能够简单就尽量简单,平时开发大部分的时间都会聚焦在开发业务功能上,这些编译打包相关的配置其实很少人会去搞懂它,经过一段时间人员的变换,可能里面的知识很容易就丢失掉了。如果配置过于复杂,做很多特殊的事情,那么如果出了问题或者需要调整,由于没多少人懂,那么维护起来就比较困难。
所以总体的原则是简单到够用即可,能不用那些复杂的用法就尽量不用。
2 编译打包
2.1 maven插件编译
这里介绍的是maven工具,如果用gradle的则可以出门找找gradle的说明。
先看看maven提供的编译插件:
XML
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
Maven提供的插件是maven-compiler-plugin,在<configuration>里可以做比较复杂的配置,这里只是指定了jdk的版本,用此版本的jdk进行编译。上面配置同样没有提供版本号,有了以前的经验,可以猜测应该也是在spring-boot-starter-parent里提供的:
XML
<properties>
<maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>
</properties>
<build>
<pluginManagement>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
</plugin>
</pluginManagement>
</build>
注意:这个依赖是在<pluginManagement>节点里管理的,并不是在<dependencyManagement>节点里,说明的<plugin>依赖和<dependency>依赖是分开的,不能共用。
用这个插件打出的包里面的结构大致是:
java
srvpro-1.0.0-SNAPSHOT.jar
- com/qqian/stepfmk // 代码的包目录
- META-INF
- maven/com/qqian/stepfmk // 里面放的是pom.xml相关文件
- pom.properties
- pom.xml
MANIFEST.MF
- application.properties // resources目录下的配置文件
- logback.xml // resources目录下的配置文件
从上面看出,这是一个普通的jar包,插件主要是把代码编译后放到根目录下,resources目录下的配置文件也放到根目录下,还生成了一个META-INF目录,里面放MANIFEST.MF说明文件和工程的pom.xml相关文件。这种jar是不能通过java -jar来启动的。
2.2 springboot插件编译
Springboot也提供了相关的插件:
XML
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
插件spring-boot-maven-plugin是带spring-boot前缀的,同样没有提供版本,还得到spring-boot-starter-parent的依赖去找:
XML
<build>
<pluginManagement>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.18</version>
</plugin>
</pluginManagement>
</build>
从上面看出,版本是硬编码的,和springboot保持同样的版本。如果同时配置了maven-compiler-plugin和spring-boot-maven-plugin插件,以spring-boot-maven-plugin为优先。
用这个插件打出的包里面的结构大致是:
java
srvpro-1.0.0-SNAPSHOT.jar
- BOOT-INF // 如果是war包则名称变为WEB-INF
- classes
- com/qqian/stepfmk // 代码的包目录
- application.properties // resources目录下的配置文件
- logback.xml // resources目录下的配置文件
- lib // 所有依赖的jar
- classpath.idx // jar加入到classpath的顺序
- layers.idx // 用于帮助构建docker镜像
- META-INF
- maven/com/qqian/stepfmk // 里面放的是pom.xml相关文件
- pom.properties
- pom.xml
- MANIFEST.MF
- org/springframework/boot/loader // springboot加载器
从上面看出,这是一个把所有依赖包都打包在一起的包,还有loader,专门是为了执行jar/war包服务的。目前前后端分离是主流,就基本没有jsp和静态文件了,所以一般使用jar即可,如果有jsp和静态文件则只能选用war包。不管是jar包还是war包,都不需要变插件的配置。
2.3 源码包和文档
在某些情况下,还需要打源码包和文档,则可以加上下面配置:
XML
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<phase>deploy</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<phase>deploy</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
其中,maven-source-plugin插件会多打出一个xxx-sources.jar的包,里面包含源码和配置文件;
maven-javadoc-plugin则会多打出一个xxx-javadoc.jar的包,里面包含把所有类里用/** */注释的内容生成html文档。
里面配置的,如果是希望在编译的时候就打包,则phase是install,如果是在发布之后打包,则phase是deploy,也可以换成maven的其它phase。
3 架构一小步
采用jar的方式,利用springboot的插件,使得配置简单;把字节码和源码都打包,这样源码包和字节码包可以保持同版本,一起备份起来,后面特殊情况下可以用源码重新打包,有客户需要源码的时候,则可以直接提供:
XML
<groupId>com.qqian.stepfmk</groupId>
<artifactId>srvpro</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<phase>deploy</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>