前言
虽然 Gradle 势头很猛,但是 Maven 依然是 Java 项目构建的优先选择,本文简要介绍一些 Maven 工程实践
多模块(multiple module)
如果工程比较复杂,或者预期后续会变的比较复杂,可以将工程分成多个模块,常用的分模块的方法:
core,核心代码)
util/common,工具
service,服务
web/front,web 前端
在 root(顶层)pom 文件中声明工程包含的各个模块
<project>
...
<packaging>pom</packaging>
<modules>
<module>core</module>
<module>service</module>
<module>util</module>
<module>web</module>
</modules>
</project>
在子模块 pom 文件中声明 parent pom
<project>
...
<parent>
<groupId>com.aachuxing.gov.report</groupId>
<artifactId>...</artifactId>
<version>1.0</version>
</parent>
</project>
插件
使用 Maven 离不开各种各样的插件,简单介绍一下常用的插件,详细使用说明可以参考官方文档,或者直接 google/baidu,在声明插件的时候推荐:
将 属性值(jdk.version)定义在 properties 标签中
将 build 标签声明在 root pom 中
maven-compiler-plugin
maven-compiler-plugin 可以指定 jdk 版本,推荐设置 jdk8 以上版本
<project>
...
<properties>
<jdk.version>1.8</jdk.version>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<compilerVersion>${jdk.version}</compilerVersion>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
maven-surefire-plugin
maven-surefire-plugin 用来排除一些你不想在持续集成中运行 test case,它们可能仅仅是你用来测试你的代码,比如测试 dao 中 SQL 书写是否有问题
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<excludes>
<exclude>**/XXXTest.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
maven-assembly-plugin
通常一个 Java 工程除了 jar 包之外还有各种各样的文件:shell 脚本,properties(属性)文件,数据文件(json, xml),使用 maven-assembly-plugin 可以对工程打包部署做深度定制
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly1.xml</descriptor>
<descriptor>src/main/assembly/assembly2.xml</descriptor>
<descriptor>src/main/assembly/assembly3.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</build>
</project>
assembly.xml 配置文件用于配置具体的打包过程,在 descriptors 标签中可以指定多个配置文件,实现一套代码打出多个 “渠道包”
下面是一个 assembly.xml 文件示例:
<assembly>
<id>${id}</id>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>src/main/assembly/bin</directory>
<outputDirectory>bin</outputDirectory>
<includes>
<include>startup.sh</include>
<include>shutdown.sh</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
<fileSet>
<directory>${project.build.directory}/classes</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>config.properties</include>
<include>log4j2.xml</include>
</includes>
<fileMode>0644</fileMode>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
formats,通过后缀名指定打包文件格式,tar.gz, zip, war .etc
fileSets,指定哪些文件被打到包里头
maven-dependency-plugin
maven-dependency-plugin 用于管理依赖,一个应用场景是将依赖的 jar 包解开合并到工程中
<project>
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.compony.xxx</groupId>
<artifactId>yyy</artifactId>
</artifactItem>
</artifactItems>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>