虽然 Gradle 势头很猛,可是 Maven 依然是 Java 项目构建的优先选择,本文简要介绍一些 Maven 工程实践前端
若是工程比较复杂,或者预期后续会变的比较复杂,能够将工程分红多个模块,经常使用的分模块的方法:java
core,核心代码)web
util/common,工具shell
service,服务apache
web/front,web 前端json
在 root(顶层)pom 文件中声明工程包含的各个模块maven
<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 标签中ui
将 build 标签声明在 root pom 中
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 用来排除一些你不想在持续集成中运行 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>
一般一个 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 用于管理依赖,一个应用场景是将依赖的 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>