Maven 工程实践

xingpingz

前言

虽然 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>

总结

阅读 1.5k

signal
随笔

博学,审问,慎思,明辨,力行

119 声望
62 粉丝
0 条评论
你知道吗?

博学,审问,慎思,明辨,力行

119 声望
62 粉丝
宣传栏