小架构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>
相关推荐
玩转数据库管理工具FOR DBLENS29 分钟前
企业数据架构选型指南:关系型与非关系型数据库的实战抉择
数据库·测试工具·mysql·oracle·架构·nosql
fuzamei8881 小时前
Chain33 Orderbook:去中心化订单簿的创新架构与实现
架构·去中心化·区块链
一水鉴天2 小时前
整体设计 定稿 之7 共享给定表格文档的分析(豆包助手)
人工智能·架构
Codebee2 小时前
A2UI vs OOD全栈方案:AI驱动UI的两种技术路径深度解析
前端·架构
狂炫冰美式3 小时前
当硅基神明撞上人类的“叹息之墙”:距离证明哥德巴赫猜想,AI还有多远?
前端·算法·架构
智算菩萨4 小时前
2025通用ChatGPT Agent架构综述:从工具调用、工作流编排到可观测与安全闭环
安全·chatgpt·架构
yenggd4 小时前
企业总部-分支-门点-数据中心使用骨干网SRv6 BE互联互通整体架构配置案例
运维·网络·计算机网络·华为·架构
敢敢のwings4 小时前
NVIDIA Nemotron 3 系列模型:从架构到部署的完整指南
架构
七夜zippoe4 小时前
轻量级大模型在RAG系统中的集成方案
架构·大模型·oom·轻量·语义感
自由生长20244 小时前
流式计算框架简单综述-第一篇
架构