小架构step系列06:编译配置

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里提供的:

https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/2.7.18/spring-boot-dependencies-2.7.18.pom

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的依赖去找:

https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/2.7.18/spring-boot-dependencies-2.7.18.pom

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>
相关推荐
ai小鬼头31 分钟前
AIStarter如何助力用户与创作者?Stable Diffusion一键管理教程!
后端·架构·github
掘金-我是哪吒3 小时前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
国服第二切图仔3 小时前
文心开源大模型ERNIE-4.5-0.3B-Paddle私有化部署保姆级教程及技术架构探索
百度·架构·开源·文心大模型·paddle·gitcode
SelectDB4 小时前
SelectDB 在 AWS Graviton ARM 架构下相比 x86 实现 36% 性价比提升
大数据·架构·aws
weixin_437398215 小时前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang
liulilittle6 小时前
SNIProxy 轻量级匿名CDN代理架构与实现
开发语言·网络·c++·网关·架构·cdn·通信
喷火龙8号6 小时前
深入理解MSC架构:现代前后端分离项目的最佳实践
后端·架构
Codebee6 小时前
“自举开发“范式:OneCode如何用低代码重构自身工具链
java·人工智能·架构
掘金-我是哪吒7 小时前
分布式微服务系统架构第158集:JavaPlus技术文档平台日更-JVM基础知识
jvm·分布式·微服务·架构·系统架构
JohnYan7 小时前
模板+数据的文档生成技术方案设计和实现
javascript·后端·架构