POM(Project Object Model,專案物件模型)是 Maven 專案的核心配置檔,以 pom.xml 形式存在。它完整描述專案的座標、依賴關係、建置設定、報表、版本庫、部署資訊等所有專案相關因素。
<project>
<modelVersion>4.0.0</modelVersion>
<!-- 基本座標 -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- 建置設定 -->
<build>...</build>
<reporting>...</reporting>
<!-- 專案資訊 -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- 環境設定 -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
org.codehaus.mojo → /org/codehaus/mojo)。<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
</dependencies>
scope(依賴範圍):
compile(預設):編譯、測試、執行皆需。provided:編譯、測試需,執行時由容器/JDK 提供(如 Servlet API)。runtime:僅執行與測試需(如 JDBC 驅動)。test:僅測試階段需(如 JUnit)。system:類似 provided,但需指定 systemPath(不建議使用)。<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
</exclusion>
</exclusions>
</dependency>
解決版本衝突的關鍵手段。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<packaging>pom</packaging>
</project>
<project>
<parent>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent>
<artifactId>my-project</artifactId>
</project>
dependencyManagement 可在父專案統一管控依賴版本與範圍,子專案引用時可省略版本號。
<modules>
<module>my-project1</module>
<module>my-project2</module>
</modules>
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
</build>
<resources>
<resource>
<targetPath>META-INF/plexus</targetPath>
<filtering>false</filtering>
<directory>${basedir}/src/main/plexus</directory>
<includes><include>configuration.xml</include></includes>
<excludes><exclude>**/*.properties</exclude></excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.0</version>
<configuration>
<classifier>test</classifier>
</configuration>
<executions>
<execution>
<id>echodir</id>
<goals><goal>run</goal></goals>
<phase>verify</phase>
<configuration>
<tasks><echo>Build Dir: ${project.build.directory}</echo></tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
關鍵屬性:extensions(是否載入擴充)、inherited(是否繼承給子專案)、executions(綁定生命週期階段與目標)。
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-3</version>
</extension>
</extensions>
<reporting>
<plugins>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<reportSets>
<reportSet>
<id>sunlink</id>
<reports><report>javadoc</report></reports>
<configuration>
<links><link>https://java.sun.com/j2se/1.5.0/docs/api/</link></links>
</configuration>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
distributionManagement 定義成品發布位置,支援檔案系統、SCP、SFTP、FTP 等協定,需搭配 settings.xml 的 server 認證。
<distributionManagement>
<repository>
<id>proficio-repository</id>
<url>scp://sshserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
POM 中的 profiles 可根據環境(JDK 版本、OS、屬性、檔案存在與否)自動啟動,支援覆蓋大部分建置設定。