Maven插件配置打jar包、自定义部署包

用Spring Boot做项目时间长了,之前maven打jar包和自定义package的方式都丢了(Spring Boot Maven plugin默认做了很多。。)

开发简单的工具自动生成客户端Feign Client,使用纯maven项目,maven-jar-plugin和maven-assembly-plugin插件分别完成打jar包和自定义部署包的功能。

自定义部署包结构如下:

配置文件以及freemaker模板置于conf下,第三方jar包置于lib下。为了让应用jar读取conf下的配置文件,两种方式:

1. 代码结构中,在项目根目录下创建conf并放置配置文件;代码中使用类似 new File("a.properties")读取配置文件。

 这样做在maven compile/package时,行为一致(compile后,conf同classes同级目录;package后,conf同jar包同级目录)

2. 代码结构中,一般将配置文件置于src/main/resources路径下(maven默认将该路径资源compile到classes下),这样使用如下代码会直接读取到资源

但是在自定义部署包时,会将配置文件外置,同时jar包中不再包含配置文件,此时以上代码找不到资源。这就需要用到maven-jar-plugin插件改变jar中的MANIFEST.MF

将conf置于Class-Path下。

完整的maven插件配置和assembly.xml配置如下:

1)maven插件配置

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <!-- 解决资源文件编码问题 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <!-- 设置编译版本 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <skip>true</skip>
                </configuration>
            </plugin>
            <!-- 打jar包 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <!-- 主程序入口main方法所在类 -->
                        <manifest>
                            <mainClass>com.ehl.drmp.ds.Application</mainClass>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                        <!-- 配置文件外置 -->
                        <manifestEntries>
                            <Class-Path>conf/</Class-Path>
                        </manifestEntries>
                    </archive>
                    <excludes>
                        <exclude>*.properties</exclude>
                        <exclude>*.xml</exclude>
                        <exclude>template/*</exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5.5</version>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <!-- 绑定到package生命周期 -->
                        <phase>package</phase>
                        <goals>
                            <!-- 只运行一次 -->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 配置描述符文件 -->
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
            </plugin>
        </plugins>
    </build>
<assembly>
    <id>${project.version}</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>src/main/bin</directory>
            <includes>
                <include>*.sh</include>
            </includes>
            <outputDirectory>bin</outputDirectory>
            <fileMode>0755</fileMode>
        </fileSet>
        <fileSet>
            <directory>src/main/conf</directory>
            <outputDirectory>conf</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>src/main/sql</directory>
            <includes>
                <include>*.sql</include>
            </includes>
            <outputDirectory>sql</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>src/main/resources</directory>
            <includes>
                <include>*.properties</include>
                <include>*.xml</include>
                <include>template/*</include>
            </includes>
            <outputDirectory>conf</outputDirectory>
        </fileSet>
    </fileSets>
    <files>
        <file>
            <source>target/${project.build.finalName}.jar</source>
            <outputDirectory>.</outputDirectory>
        </file>
    </files>
    <dependencySets>
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <scope>runtime</scope>
            <unpack>false</unpack>
        </dependencySet>
    </dependencySets>
</assembly>

 

建议:maven build配置中尽量不使用resources标签,避免开发调试时因为compile使用resource改变资源路径而导致加载不到资源文件的情况。

 

posted on 2022-11-10 11:26  -赶鸭子上架-  阅读(1486)  评论(0编辑  收藏  举报