Maven的配置文件pom.xml詳解(含常用plugin)
上一次,我們講解了Maven的安裝與配置,那么這次我們就講講pom.xml,在Maven中,pom.xml是必不可少的配置文件,它定義了項目的各種屬性和依賴關系。接下來,我們將全面解析pom.xml,了解其結(jié)構和屬性,以及如何使用它來管理項目
一、什么是pom.xml
pom.xml
是Maven項目的核心配置文件,它是 項目對象模型 - Project Object Model(POM)的縮寫。POM定義了項目的所有屬性,包括項目的名稱、版本、依賴關系、構建配置等。使用pom.xml,我們可以輕松地管理項目的構建和依賴關系,讓我們能夠更專注于業(yè)務邏輯的開發(fā)。
二、pom.xml的結(jié)構
我們先看一個簡單pom.xml的結(jié)構,首先<project>
和<modelVersion>
標簽主要針對的是本pom.xml文件的格式,如下:
<?xml version="1.0" encoding="UTF-8"?> <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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>example-proj</artifactId> <version>1.0.0</version> <name>Example Project</name> <description>This is an example Maven project.</description> <url>http://www.example.com/</url> <licenses> <!-- 許可證 --> <license> <name>The Apache Software License, Version 2.0</name> <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> <distribution>repo</distribution> </license> </licenses> <developers> <!-- 開發(fā)者信息 --> <developer> <id>developer1</id> <name>Developer One</name> <email>developer1@example.com</email> <organization>Example Organizations Inc.</organization> <organizationUrl>http://www.example-organizations.com/</organizationUrl> <roles> <role>developer</role> </roles> <timezone>-5</timezone> </developer> </developers> <dependencies> <!-- 依賴項 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.1.RELEASE</version> </dependency> </dependencies> <build> <!-- 項目構建 --> <plugins> <!-- 插件配置 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.example.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
其中<modelVersion>
指定了pom.xml文件使用的XML schema版本,目前,其最新的版本是4.0.0。其他部分我們會在下面進行詳解
三、項目的基本信息
與項目的基本信息相關的標簽有很多,以下算必填項
groupId
:項目的組名,通常是反轉(zhuǎn)的域名,比如com.example。artifactId
:項目的唯一標識符,通常是項目的名稱。version
:項目的版本號。packaging
:項目的打包方式,通常是jar、war或pom,如果沒有指定packaging,默認值是jar。
除了上面的幾個標簽,還有一些項目相關,但非必填的內(nèi)容:
name
:項目名,可選項,提供項目的簡短名稱description
:項目描述,可選項,提供項目的詳細描述。version
:項目主頁,可選項,提供項目的網(wǎng)址。licenses
: 許可證聲明,可選項,聲明項目所使用的一種或多種許可證developers
:開發(fā)者信息,可選項,列出項目的開發(fā)人員。url
:項目主頁,可選項,提供項目的網(wǎng)址
當然,還有一些在我們示例中沒有出現(xiàn)的標簽,比如說 modules 和 parent
1.modules
modules
標簽用于聲明當前 Maven 項目包含的模塊子項目,每個子項目都是一個獨立的 Maven 項目,具有自己的 pom.xml 文件,可以進行獨立構建和測試。在父項目的 pom.xml 文件中,使用 標簽來列出所有子項目的名稱,如下所示:
<project> <groupId>com.example.parent</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> <packaging>pom</packaging> <modules> <module>child1</module> <module>child2</module> <module>child3</module> </modules> </project>
上述代碼表示當前項目是一個 Maven 的多模塊項目:它包含了三個子項目 child1、child2 和 child3,這三個子項目與 parent-project 有相同的 groupId 和 version,但是 artifactId 不同,它們的 pom.xml 都位于 parent-project 的根目錄下。當使用 Maven 命令在 parent-project 下執(zhí)行構建時,Maven 會對每個子模塊執(zhí)行構建,最終生成子項目的構件并復制到 parent-project 的 target 目錄下
2.parent
parent
標簽用于聲明當前 Maven 項目的父項目,它可以將若干個 Maven 項目組織成一個整體,指定版本號,插件版本號等,便于管理和維護,在一個 Maven 項目中,使用標簽來引用父項目,如下所示:
<project> <groupId>com.example.child</groupId> <artifactId>child-project</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <parent> <groupId>com.example.parent</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> <relativePath>../parent-project/pom.xml</relativePath> </parent> </project>
上述代碼表示當前項目 child-project 是 parent-project 的子項目,它的 groupId 和 version 都繼承自 parent-project。元素是一個可選項,它的值是父項目 pom.xml 文件到子項目 pom.xml 文件的相對路徑,如果子項目 pom.xml 和父項目 pom.xml 在同一目錄下,則可以省略此元素。
3.scm
scm
又叫 Software Configuration Management,即軟件配置管理, 與我們以前提到過的版本控制
有關,是Maven中用于指定源代碼版本控制信息的標簽。它可以幫助Maven獲取源代碼并將構建生成的二進制文件提交到版本控制系統(tǒng)中。scm標簽通常用于指定源代碼管理系統(tǒng)的類型、URL、開發(fā)者連接等詳細信息。示例如下:
<scm> <connection>scm:git:git://github.com/username/repo.git</connection> <!-- 指定連接到SCM的URL,可以使用HTTP或者SSH協(xié)議 --> <developerConnection>scm:git:ssh://github.com/username/repo.git</developerConnection> <!-- 指定開發(fā)者連接到SCM的URL,通常使用SSH協(xié)議 --> <url>http://github.com/username/repo/tree/master</url> <!-- 指定SCM的web頁面URL,方便開發(fā)者查看SCM信息 --> <tag>1.0.0</tag> <!-- 當前Maven構件的版本在SCM中對應的標記 --> </scm>
developerConnection 與 connection 有些許不同,connection 可以指向一個本地文件系統(tǒng)路徑,也可以是一個遠程代碼倉庫的URL;developerConnection 則是開發(fā)者使用的版本控制系統(tǒng)的連接URL,例如connection
指向只讀代碼倉庫,而developerConnection
則指向可寫代碼倉庫。
通過在POM文件中添加scm標簽,Maven可以獲取源代碼并構建項目,同時還可以自動將構建生成的文件提交到版本控制系統(tǒng)中,方便管理代碼版本和協(xié)同開發(fā)
4.properties
properties
嚴格來說,并不一定是項目本身的信息,而是人為設置的屬性或者說宏,這個標簽用來定義和管理項目中所需要的屬性,其作用有以下幾個:
- 統(tǒng)一管理項目中的常用屬性,比如版本號、路徑、插件版本等,方便統(tǒng)一修改和管理。
- 可以在配置過程中使用 ${…}占位符引用這些屬性,使得配置更加靈活和便捷。
- 避免硬編碼,提高代碼的可維護性和可讀性
比如說我們可以這么配
<properties> <project.name>demo-project</project.name> <project.version>1.0.0</project.version> <jdk.version>1.8</jdk.version> </properties> ....省略其余部分 <dependency> <groupId>com.example.demo</groupId> <artifactId>${project.name}-api</artifactId> <version>${project.version}</version> </dependency>
四、項目的依賴列表
1.dependency
與項目的依賴列表相關的標簽最外層由 <dependencies>
來囊括,內(nèi)部包含了各種具體的依賴<dependency>
,該標簽用于指定一個依賴項,它包含以下幾個子標簽
<groupId>
:指定依賴項的groupId,項目的組名<artifactId>
:指定依賴項的artifactId,項目的唯一標識符<version>
:指定依賴項的版本號。<scope>
:指定依賴項在項目中的使用范圍。
其中的 <scope>
一般包含以下幾種范圍:常用的有compile、test、provided 和 runtime
- compile:依賴庫默認的 scope,表示該依賴庫在編譯、測試、運行時均需要使用。
- provided:表示該依賴庫只在編譯和測試時需要使用,而在運行時已經(jīng)被系統(tǒng)或者容器提供,所以不需要打包到最終的應用程序中。
- runtime:表示該依賴庫只在運行時需要使用,而在編譯和測試時則不需要。
- test:表示該依賴庫只在測試時需要使用,而在編譯和運行時則不需要。
比如說我們引入了 junit 包,但顯然這個包我們不需要在打包時包含,只是用于測試,那么我們就可以將 junit 的 scope 設置為 test。
2.repository
當然,我們還能在pom文件中支持指定Maven倉庫,即使用 <repositories>
和 <repository>
標簽,<repository>
用于指定一個Maven倉庫,它包含以下幾個子標簽:
<id>
:指定Maven倉庫的ID。<name>
:指定Maven倉庫的名稱。<url>
:指定Maven倉庫的URL
五、 項目的構建配置
項目的構建配置信息,包括編譯器版本、插件列表、源代碼目錄等,接下來我們慢慢來講
1.build
build
用于定義項目的構建配置,包括源代碼目錄、資源目錄、插件等,其中代碼部分的設置如下
<project> .... 省略其他部分 <build> <sourceDirectory>src/main/java</sourceDirectory> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
需要注意的是,像資源目錄這種路徑是沒有默認值的,但根據(jù)Maven的約定優(yōu)于配置原則(Convention over Configuration),Maven會使用默認的目錄結(jié)構去查找源代碼和測試代碼。默認的目錄結(jié)構如下
project |--src |--main |--java // Java主源代碼目錄 |--resources // 資源文件目錄 |--test |--java // 測試主代碼目錄 |--resources // 測試資源文件目錄
因此,在一個標準的Maven項目中,sourceDirectory默認值應該是src/main/java。如果有自定義的代碼目錄結(jié)構,需要顯式地設置sourceDirectory元素的值。例如,如果有一個名為“core”的子目錄作為項目的主源代碼目錄,可以按以下方式進行配置:
<build> <sourceDirectory>core</sourceDirectory> ... </build>
2.plugins
plugins
的作用是定義 Maven 插件, plugins 主要用于擴展 Maven 的功能,幫助開發(fā)人員更方便地構建、打包、發(fā)布項目。插件可以通過 Maven 的插件中心或者自己構建的私有倉庫來使用,能在構建過程中執(zhí)行特定的任務,比如編譯、打包、測試等。
- 插件的配置可以分為兩種方式:
全局配置
和項目配置
。 - 全局配置是在 Maven 安裝目錄下的 conf/settings.xml 文件中進行配置,可以被所有的項目使用。
- 項目配置則是在項目的 pom.xml 文件中進行配置,只對當前項目生效。
插件的使用主要分為以下幾個步驟:
在 pom.xml 中聲明插件依賴配置插件的參數(shù)運行插件命令
而常用的Maven Plugin有不少,我們一一來說一下:
maven-compiler-plugin
比方說,最常用的編譯功能,我們可以在pom里面這么寫
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <showWarnings>true</showWarnings> <compilerArgs> <arg>-Xlint:unchecked</arg> <arg>-Xlint:deprecation</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
各子標簽的作用如下:
<source>
:指定Java源代碼的版本,例如1.8表示Java 8。<target>
:指定編譯后的字節(jié)碼版本,例如1.8表示Java 8。<encoding>
:指定源代碼的編碼格式。<showWarnings>
:是否顯示編譯警告信息,true表示顯示,false表示不顯示。<compilerArgs>
:可選參數(shù),可以添加多個編譯器參數(shù),例如-Xlint選項用來啟用編譯器警告檢查。
如果我們按示例中配置,我們就指定了編譯器的源和目標版本為1.8,當我們使用 mvn compile
命令的時候,這個插件將會編譯我們的 Java 代碼,并將編譯后的 class 文件放置在 target 目錄下
maven-surefire-plugin
maven-surefire-plugin插件是Maven中的一個測試框架,用于執(zhí)行Java單元測試和集成測試。它的主要作用是在構建過程中運行測試,并生成測試報告,在pom.xml中的配置如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M4</version> <configuration> <skipTests>true</skipTests> <forkCount>2</forkCount> <useSystemClassLoader>false</useSystemClassLoader> <reuseForks>true</reuseForks> <includes> <include>**/*Test.java</include> <include>**/*Tests.java</include> </includes> <systemProperties> <property> <name>testProp1</name> <value>value1</value> </property> <property> <name>testProp2</name> <value>value2</value> </property> </systemProperties> </configuration> </plugin> </plugins> </build>
其中幾個子標簽的作用分別如下
<skipTests>
:設置是否跳過測試,默認值為false。<forkCount>
:設置并行運行測試的JVM進程數(shù)。<useSystemClassLoader>
:設置是否使用系統(tǒng)類加載器加載測試類。<reuseForks>
:設置是否重用已經(jīng)啟動的JVM進程。<includes>
:設置測試文件的過濾規(guī)則,支持通配符。<systemProperties>
:設置傳遞給測試環(huán)境的系統(tǒng)屬性,可以在測試代碼中通過System.getProperty()方法獲取 maven-jar-plugin
maven-jar-plugin 用于將項目打包為JAR文件,在這個例子中,我們告訴Maven將com.example.MyApp作為JAR文件的主類,那么在pom.xml中的配置如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.example.MyApp</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
<archive>
:JAR文件的歸檔配置信息<manifest>
:MANIFEST.MF文件的配置信息<addClasspath>
:是否將依賴項添加到Class-Path條目中<mainClass>
:定義可執(zhí)行JAR文件的入口類
maven-install-plugin
當執(zhí)行mvn instal
命令時,maven-install-plugin 用于將一個特定的文件安裝到本地Maven倉庫中,以便其他項目可以使用它,例如在pom.xml中的配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>3.0.0-M1</version> <configuration> <file>${project.build.directory}/example.jar</file> <groupId>com.example</groupId> <artifactId>example</artifactId> <version>1.0.0</version> <packaging>jar</packaging> </configuration> </plugin>
<file>
:用來指定要安裝到本地Maven倉庫中的文件的路徑。該標簽的值應該是一個文件的絕對或相對路徑。<groupId>
:通過該標簽設置所安裝文件的groupId,通常表示項目的組織或組織部門的標識符。<artifactId>
:同樣是通過該標簽設置所安裝文件的artifactId,通常是指該文件的名稱。<version>
:通過該標簽設置所安裝文件的版本號,通常采用三級版本號的格式,例如"1.0.0"。<packaging>
:通過該標簽來指定所安裝文件的打包類型,通常是jar或war。
需要注意的是,<file>
標簽必須與<groupId>
、<artifactId>
和<version>
標簽一起使用,才能正確將該文件安裝到本地Maven倉庫中,并在其他項目中使用,除了以上的配置,還有一些可選的配置項:
<classifier>
:通過該標簽指定所安裝文件的分類器,例如"sources"或"javadoc"等,默認為null。<localRepositoryPath>
:通過該標簽指定本地倉庫的路徑,默認為Maven默認的本地倉庫路徑。<createChecksum>
:是否在安裝文件時創(chuàng)建SHA-1校驗和,默認為true。<skip>
:是否跳過該插件的運行,默認為false,即不跳過。
maven-clean-plugin
maven-clean-plugin 用于清理Maven項目中的目標文件和構建臨時文件,以便重新構建項目。它通常被用于在構建之前清理項目,以確保在構建時使用最新的代碼和資源ar文件,在pom.xml中的配置如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>clean-all</id> <phase>clean</phase> <goals> <goal>clean</goal> </goals> <configuration> <excludeDefaultDirectories>true</excludeDefaultDirectories> <filesets> <fileset> <directory>target</directory> <includes> <include>**/*</include> </includes> </fileset> </filesets> </configuration> </execution> </executions> </plugin> </plugins> </build>
該配置中,maven-clean-plugin的版本號是3.1.0,它在clean階段(phase標簽指定)執(zhí)行,使用的目標是clean。下面是各個子標簽的作用:
<excludeDefaultDirectories>
:默認值為false,如果設置為true,則禁用清理操作中默認清理的目錄(如target、bin等)。<filesets>
:文件集合,可以指定多個文件或文件夾需要被清理。<fileset>
:單個的文件或文件夾。<directory>
:需要清理的文件夾路徑。<includes>
:需要包含的文件或文件夾,支持通配符。<excludes>
:需要排除的文件或文件夾,支持通配符
至于通配符,使用規(guī)則如下:
* 匹配零個或多個字符
** 匹配零個或多個目錄
需要注意的是,Maven的通配符僅支持*和**,不支持其他通配符,例如?。同時,通配符匹配的范圍是相對于構建目錄的,也就是默認情況下是相對于pom.xml文件的目錄
maven-release-plugin
maven-release-plugin 可以幫助我們在代碼庫中創(chuàng)建一個穩(wěn)定的發(fā)布版本,并將其發(fā)布到Maven倉庫中,同時更新開發(fā)版本號,以便于下次開發(fā)版本的迭代,它可以做如下配置
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.5.2</version> <configuration> <tagNameFormat>v@{project.version}</tagNameFormat> <tagBase>http://svn.example.com/tags</tagBase> <autoVersionSubmodules>true</autoVersionSubmodules> <releaseProfiles>release</releaseProfiles> <branchBase>http://svn.example.com/branches</branchBase> </configuration> </plugin> </plugins> </build>
<tagNameFormat>
: 指定發(fā)布版本的標簽格式,@{project.version}會被替換為項目的版本號。在上面的配置中,標簽格式為v@{project.version}。<tagBase>
: 用于指定打標簽的位置,默認值為 ${project.scm.url},即和項目的 SCM 地址相同。<autoVersionSubmodules>
: 是否自動更新子模塊的版本號。如果設置為true,則子模塊的版本號會自動更新為父模塊的版本號。<releaseProfiles>
: 指定觸發(fā)發(fā)布的Maven profile。只有在激活該profile后才會觸發(fā)發(fā)布操作。在上面的配置中,只有當profile名稱為release時,才會觸發(fā)發(fā)布操作,關于profile,我們下面會講<branchBase>
:用于指定創(chuàng)建分支的位置,默認值同 tagBase,即和項目的 SCM 地址相同。
3.profiles
profiles
用于定義 Maven 運行時的不同配置環(huán)境,比如開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境等,可以在不同的環(huán)境中使用不同的配置,比如我們做了如下配置
<profiles> <profile> <id>prod</id> <activation> <activeByDefault>true</activeByDefault> </activation> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>11</release> </configuration> </plugin> </plugins> </build> </profile> </profiles>
<id>
標簽指定profile的唯一標識符。<activation>
標簽指定何時使用該profile。在示例中,activeByDefault設置為true表示默認啟用該profile。<build>
標簽包含一組構建配置,這些配置將在激活profile時覆蓋默認配置。在示例中,它定義了maven-compiler-plugin插件的版本和為Java 11設置編譯器版本。
在Maven中,使用以下命令激活特定的profile:
mvn clean install -Pprod
這將激活prod profile,覆蓋默認構建配置。
六、pom.xml的使用
經(jīng)過了上面的學習,不難發(fā)現(xiàn),使用pom.xml可以輕松地管理項目的構建和依賴關系,其主要用法其實有三種:
- 添加依賴:在dependencies標簽下添加依賴,包括groupId、artifactId、version、scope等信息。
- 修改打包方式:在packaging標簽下修改項目的打包方式,通常是jar、war或pom。
- 配置插件:在build標簽下配置插件,包括groupId、artifactId、version等信息。插件可以幫助我們處理各種構建任務,比如編譯代碼、生成文檔、打包文件等。
到此這篇關于全面詳解Maven的配置文件pom.xml(含常用plugin)的文章就介紹到這了,更多相關Maven 配置文件pom.xml內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
RocketMQ消息隊列實現(xiàn)隨機消息發(fā)送當做七夕禮物
這篇文章主要為大家介紹了RocketMQ消息隊列實現(xiàn)隨機消息發(fā)送當做七夕禮物,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08SpringBoot使用Prometheus實現(xiàn)監(jiān)控
在當今的軟件開發(fā)世界中,監(jiān)控是至關重要的一部分,本文主要介紹了如何在Spring Boot應用程序中使用Prometheus進行監(jiān)控,以幫助大家更好地理解和管理您的應用程序,有需要的可以參考下2023-10-10