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改变资源路径而导致加载不到资源文件的情况。
清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己
-- 共勉