Appearance
高级配置
8.1 属性配置(properties)
Maven 允许在 POM 文件中定义属性,这些属性可以在 POM 的其他部分引用。
内置属性
Maven 提供了一些内置属性:
| 属性 | 描述 |
|---|---|
| $ | 项目的 groupId |
| $ | 项目的 artifactId |
| $ | 项目的版本号 |
| $ | 项目的名称 |
| $ | 项目的描述 |
| $ | 项目的基础目录 |
| $ | 构建输出目录 |
| $ | 源代码目录 |
| $ | 测试源代码目录 |
| $ | 编译输出目录 |
| $ | 测试编译输出目录 |
| $ | Maven 的版本 |
| $ | Java 的版本 |
| $ | 用户的主目录 |
| $ | 项目的基础目录(与 ${project.basedir} 相同) |
自定义属性
可以在 POM 文件的 <properties> 元素中定义自定义属性:
xml
<properties>
<spring.version>5.3.20</spring.version>
<junit.version>4.13.2</junit.version>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>8.2 构建配置(build)
Maven 的构建配置在 POM 文件的 <build> 元素中定义。
基本构建配置
xml
<build>
<!-- 项目的最终名称 -->
<finalName>${project.artifactId}-${project.version}</finalName>
<!-- 源代码目录 -->
<sourceDirectory>src/main/java</sourceDirectory>
<!-- 测试源代码目录 -->
<testSourceDirectory>src/test/java</testSourceDirectory>
<!-- 资源目录 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<!-- 测试资源目录 -->
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
<!-- 插件配置 -->
<plugins>
<!-- 插件配置 -->
</plugins>
</build>插件管理
使用 <pluginManagement> 可以统一管理插件版本:
xml
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<!-- 其他插件 -->
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- 版本从 pluginManagement 继承 -->
</plugin>
<!-- 其他插件 -->
</plugins>
</build>8.3 资源过滤
Maven 可以在构建过程中过滤资源文件,替换其中的属性占位符。
配置资源过滤
xml
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>在资源文件中使用属性
在资源文件中,可以使用 ${property.name} 格式的占位符:
properties
# application.properties
app.name=${project.name}
app.version=${project.version}
app.description=${project.description}8.4 配置文件分离
对于不同环境(如开发、测试、生产),可以使用 Maven 的 profiles 功能来分离配置。
定义 profiles
xml
<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<env>dev</env>
<database.url>jdbc:mysql://localhost:3306/dev_db</database.url>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<env>prod</env>
<database.url>jdbc:mysql://prod-server:3306/prod_db</database.url>
</properties>
</profile>
</profiles>激活 profile
可以通过以下方式激活 profile:
- 默认激活:在 profile 中设置
<activeByDefault>true</activeByDefault> - 命令行激活:使用
-P选项,如mvn clean install -P production - 环境变量激活:在 profile 中设置
<activation><property><name>env</name><value>prod</value></property></activation> - 系统属性激活:在 profile 中设置
<activation><property><name>java.version</name><value>11</value></property></activation>
8.5 环境变量与 profiles
使用环境变量
可以在 POM 文件中引用环境变量:
xml
<properties>
<database.url>${env.DATABASE_URL}</database.url>
</properties>结合 profiles 和环境变量
xml
<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<database.url>jdbc:mysql://localhost:3306/dev_db</database.url>
</properties>
</profile>
<profile>
<id>production</id>
<activation>
<property>
<name>env</name>
<value>prod</value>
</property>
</activation>
<properties>
<database.url>${env.DATABASE_URL}</database.url>
</properties>
</profile>
</profiles>8.6 自定义插件开发
Maven 允许开发自定义插件来扩展其功能。
插件项目结构
maven-plugin-project/
├── pom.xml
└── src/
└── main/
├── java/
│ └── com/example/maven/plugin/
│ └── MyMojo.java
└── resources/
└── META-INF/
└── maven/
└── plugin.xml插件 POM 配置
xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-maven-plugin</artifactId>
<version>1.0.0</version>
<packaging>maven-plugin</packaging>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.8.5</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.6.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>插件实现
java
package com.example.maven.plugin;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
@Mojo(name = "hello")
public class MyMojo extends AbstractMojo {
@Parameter(property = "name", defaultValue = "World")
private String name;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Hello, " + name + "!");
}
}使用自定义插件
xml
<build>
<plugins>
<plugin>
<groupId>com.example</groupId>
<artifactId>my-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>hello</goal>
</goals>
<configuration>
<name>Maven</name>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>通过高级配置,可以定制 Maven 的构建行为,满足项目的特定需求。