Maven Plugin构建模板方案

1.常见的maven Plugin:

编译:

maven-compiler-plugin:编绎阶段指定jdk版本。

资源/文件等拷贝:

maven-resources-plugin:拷贝配置等资源文件
maven-dependency-plugin:拷贝代码所需的jar包,放到classes的lib下

测试阶段:

maven-surefire-plugin:用于测试阶段的插件
maven-failsafe-plugin:用作集成测试的配置。

打包:

maven-jar-plugin:只会把项目的java文件打包成一个jar,比较小,没有把依赖的lib一起打包进去。
spring-boot-maven-plugin:在maven-jar-plugin的基础上会生成一个用与启动的文件,并且把依赖的lib一起打包进去项目的jar,这样支持java -jar直接启动。

打包增强/定制:

maven-assembly-plugin: 这个插件能在上面打包插件的基础上,更加定制化打包,比如单独放某些文件到classes里面,或者将classes里面的配置放到jar包同层之类的。这样能更加灵活的支持不同场景。
maven-shade-plugin:不用它,这个功能没maven-assembly-plugin全面,使用maven-assembly-plugin即可。

部署:

maven-deploy-plugin: 一般用于将项目发布到远程仓库

其他:

maven-checkstyle-plugin:可以帮助开发检测代码中不合规范的地方。
jacoco-maven-plugin:生成单元测试覆盖率报告。
sonar-maven-plugin:使用该插件执行sonar扫描。

2.不同场景构建模板

1.只需考虑一个jar包运行即可

1.使用maven-compiler-pluginmaven-jar-plugin能构建出一个项目的jar,但是里面没有项目依赖的jar包。所以这种适用于在服务器上已经有依赖的jar包了,只是改动一下项目的代码。

如果要把lib打包进去需要再使用maven-dependency-plugin,把依赖的jar打包到lib里面。

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    executions>
</plugin>

但是这种方式打包,如果任何代码里面的配置文件修改了,都需要打包,因为配置文件已经打包到jar包里面的class目录了,没法直接修改。

2.使用maven-compiler-pluginspring-boot-maven-plugin也能构建出一个项目的jar,这种和上面方案的区别就是会把依赖的jar一并打入到项目的jar里面,直接java -jar即可运行,不依赖环境

模板:

<build>
        <finalName>xxx-xxx-activity-core</finalName>
   
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>${file_encoding}</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <compilerArgument>-parameters</compilerArgument>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.2.RELEASE</version>
                <configuration>
                    <mainClass>com.xx.activity.core.ActivityApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

分析:
1.maven-resources-plugin 通过<resources>的配置来拷贝资源文件,默认是src/main/resource
2.maven-compiler-plugin 编译代码变成.class文件。
3.spring-boot-maven-plugin 将文件的所有依赖的jar都打包一个jar文件里面,并且可以指定启动类,这样这个jar直接通过 java -jar xxxx.jar即可启动。

2.jar包和配置文件分离

2.1 挂载方式

现在很多服务都是用k8s了,很多配置项是会单独挂载出来方便修改的,比如项目里面的application.propertieslog4j.xml等文件。如果还是按照之前的方式配置文件是会一并打包到项目的jar里面的,这种情况我们就没法绕开每次改配置都要打包的情况。所以就需要把配置分离开到不同的目录,支持灵活的再不重新打包项目的情况下修改配置文件。

2.2 springboot读取配置文件

如果是spring-boot的jar的话,它支持读jar包外面的文件,同时读取配置文件会有一定的顺序。

Spring boot 配置文件优先级:

 1.打包后的 Jar 包以外的 application-.properties;
 2.打包后的 Jar 包以外的 application.properties;
 3.Jar 包内部的 application-.properties;
 4.Jar 包内部的 application.properties。

Jar 包外部的文件比内部的优先级高,特定 Profile 的文件比公共的文件优先级高

指定 profile + 读取外部配置文件:

1.当前目录的 /config 子目录;
2.当前目录;
3.CLASSPATH 中的 /config 目录;
4.CLASSPATH 根目录。

也就是说,如果要读取任何外部文件,不需要额外加任何参数,只需要在jar同级目录下,新建一个config目录,然后把配置文件放进去即可,这样spring boot读取到后,会自动将其中的内容添加到 Spring 的 Environment 中

2.3 maven-assembly-plugin作用

就可以使用maven-assembly-plugin来定义好配置文件目录,然后通过挂载来覆盖配置文件,起到不用重新打包也可以修改配置的文件的功能。

模板:

<build>
        <finalName>xxx-xxx-activity-core</finalName>
   
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <directory>src/main/resources/profiles/${spring.profiles.active}/config</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>${file_encoding}</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <compilerArgument>-parameters</compilerArgument>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.2.RELEASE</version>
                <configuration>
                    <mainClass>com.xx.activity.core.ActivityApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>
                    <finalName>${project.artifactId}</finalName>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

assembly.xml文件:

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>distribution</id>
<formats>
    <format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
    <fileSet>
        <directory>${project.build.directory}</directory>
        <outputDirectory></outputDirectory>
        <includes>
            <!-- 项目的jar包 -->
            <include>*.jar</include>
        </includes>
    </fileSet>
    <fileSet>
        <directory>${project.build.directory}/classes</directory>
        <outputDirectory>config</outputDirectory>
        <includes>
            <!-- 项目配置文件 -->
            <include>*.properties</include>
            <include>*.xml</include>
            <include>*.json</include>
        </includes>
    </fileSet>
</fileSets>
</assembly>

分析:
1.maven-resources-plugin 通过<resources>的配置来拷贝资源文件,默认是src/main/resource
2.maven-compiler-plugin 编译代码变成.class文件。
3.spring-boot-maven-plugin 将文件的所有依赖的jar都打包一个jar文件里面,并且可以指定启动类,这样这个jar直接通过 java -jar xxxx.jar即可启动。
4.maven-assembly-plugin 比如定义好配置文件目录,然后通过挂载来覆盖配置文件,起到不用重新打包也可以修改配置的文件的功能。
assembly.xml这个文件将 spring-boot-maven-plugin打包出来的jar拷贝到当前目录,重点是:将classes文件下的配置文件拷贝到config目录,这个config是spring-boot会去加载配置文件的目录,这样就能挂载来覆盖配置文件

工作目录:

image.png

config目录的文件:

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容