pom.xml 是 Maven 項目的「身份證」與「施工藍圖」。本文提煉 600+ 行完整配置中的高頻核心元素,按功能域分類解析。
<groupId>com.example</groupId> <!-- 組織/項目唯一標識,通常反域名 -->
<artifactId>my-app</artifactId> <!-- 模塊名稱,構件 ID -->
<version>1.0.0-SNAPSHOT</version> <!-- 版本號:主.次.增量-限定符 -->
<packaging>jar</packaging> <!-- 產出類型:jar/war/pom/ear -->
<name>My Application</name> <!-- 顯示名稱,文檔生成用 -->
<description>項目描述</description> <!-- 詳細描述,支持 HTML -->
<url>https://example.com</url> <-- 項目主頁 -->
<!-- 父項目坐標(繼承) -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- 查找父 pom 路徑,空標簽禁用查找 -->
</parent>
<!-- 聚合:子模塊列表(多模塊項目) -->
<modules>
<module>core</module>
<module>web</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version>
<type>jar</type> <!-- 默認 jar -->
<classifier>sources</classifier> <!-- 附加構件:sources/javadoc/tests -->
<scope>compile</scope> <!-- 範圍:compile/test/provided/runtime/system -->
<optional>false</optional> <!-- 可選依賴,阻斷傳遞 -->
<exclusions> <!-- 排除傳遞依賴,解決版本衝突 -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 依賴版本統一管理(子模塊引用時可省略 version) -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>5.3.20</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
| Scope | 編譯類路徑 | 測試類路徑 | 運行類路徑 | 打包 | 典型場景 |
|---|---|---|---|---|---|
| compile | ✓ | ✓ | ✓ | ✓ | 默認,項目核心依賴 |
| provided | ✓ | ✓ | ✗ | ✗ | 容器提供:servlet-api, JPA API |
| runtime | ✗ | ✓ | ✓ | ✗ | JDBC 驅動、日誌實現 |
| test | ✗ | ✓ | ✗ | ✗ | JUnit, Mockito |
| system | ✓ | ✓ | ✗ | ✗ | 本地 JAR(需 systemPath),不推薦 |
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<finalName>${artifactId}-${version}</finalName> <!-- 輸出文件名 -->
<resources> <!-- 主資源過濾/包含/排除 -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 啟用 ${property} 替換 -->
<includes><include>**/*.xml</include></includes>
<excludes><exclude>**/*.properties</exclude></excludes>
</resource>
</resources>
<pluginManagement> <!-- 統一插件版本/配置,子模塊引用生效 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins> <!-- 實際生效的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>false</skipTests>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault> <!-- 默認激活 -->
<!-- 或:<jdk>1.8</jdk> <os><family>windows</family></os> <property><name>env</name><value>dev</value></property> -->
</activation>
<properties>
<db.url>jdbc:mysql://localhost:3306/dev</db.url>
</properties>
<build><!-- 覆蓋構建配置 --></build>
</profile>
<profile>
<id>prod</id>
<properties>
<db.url>jdbc:mysql://prod-db:3306/prod</db.url>
</properties>
</profile>
</profiles>
啟動:mvn package -Pprod 或 -Denv=prod(配合 property 激活)。
<repositories> <!-- 依賴下載倉庫 -->
<repository>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories> <!-- 插件下載倉庫 --> ... </pluginRepositories>
<distributionManagement> <-- 部署目標 -->
<repository> <-- Release 發布倉庫 -->
<id>releases</id>
<url>https://nexus:8081/repository/releases/</url>
</repository>
<snapshotRepository> <-- SNAPSHOT 發布倉庫 -->
<id>snapshots</id>
<url>https://nexus:8081/repository/snapshots/</url>
</snapshotRepository>
<site> <-- 站點部署 -->
<id>site</id>
<url>dav:https://nexus:8081/site/</url>
</site>
</distributionManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.3.20</spring.version> <!-- 自定義屬性,${spring.version} 引用 -->
</properties>
dependencyManagement + pluginManagement),子模塊零版本號。provided/runtime 範圍控制傳遞依賴,精簡 WAR 包體積。pluginManagement),避免插件升級導致構建不穩定。settings.xml 全局生效。mvn help:effective-pom 查看合併後的最終 POM,排查配置衝突神器。POM 不僅是配置文件,更是項目架構治理的契約。精通 POM,方能駕馭 Maven 的自動化構建之力。