溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

pom.xml的配置和管理

發(fā)布時(shí)間:2020-06-16 16:38:01 來源:億速云 閱讀:219 作者:元一 欄目:編程語言

1.pom.xml概念

POM是項(xiàng)目對象模型(Project Object Model)的簡稱,它是Maven項(xiàng)目中的文件,使用XML表示,名稱叫做pom.xml。作用類似ant的build.xml文件,功能更強(qiáng)大。該文件用于管理:源代碼、配置文件、開發(fā)者的信息和角色、問題追蹤系統(tǒng)、組織信息、項(xiàng)目授權(quán)、項(xiàng)目的url、項(xiàng)目的依賴關(guān)系等等。事實(shí)上,在Maven世界中,project可以什么都沒有,甚至沒有代碼,但是必須包含pom.xml文件。

2.基本配置

(1)<project>

<project>是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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
</project>

(2) <modelVersion>

<modelVersion>4.0.0</modelVersion>

pom的版本,這是Maven 2&3唯一支持的pom版本,而且不能忽略.

(3)Maven坐標(biāo)

<groupId>,<artifactId>與<version>標(biāo)識了倉庫中的一個(gè)特定位置,叫項(xiàng)目坐標(biāo).三個(gè)屬性告訴了Maven項(xiàng)目中的一個(gè)特定版本,讓Maven知道如何處理它們以及在生命周期內(nèi)的哪一階段需要它們.

A.<groupId>

<groupId>表示項(xiàng)目所屬的組,通常是一個(gè)公司或者組織的名稱,如org.springframework.

B. <artifactId>

<artifactId>表示項(xiàng)目的唯一標(biāo)識.

C. <version>

<version>表示項(xiàng)目的版本號,通常來說項(xiàng)目的版本號分成三段:
主版本號.次版本號.修訂版本號

  • 主版本號:代表架構(gòu)變動或者不兼容的實(shí)現(xiàn).
  • 次版本號:兼容性修改,功能增強(qiáng).
  • 修訂版本號:bug修復(fù).

版本號的后綴意味著項(xiàng)目的不同階段:

  • SNAPSHOT:開發(fā)中的版本
  • RELEASE:正式發(fā)布版
  • M1,M2:M指里程碑,表示即將發(fā)布
  • RC:Release Candidate,發(fā)布候選
  • GA:General Availablity,基本可用版本

(4)<packaging>

打包類型,沒有提供的話默認(rèn)值為jar,常見的有jar與war,也可以取值:

  • maven-plugin
  • pom
  • ejb
  • ear
  • rar

(5)POM 關(guān)系

Maven的一個(gè)強(qiáng)大之處是處理項(xiàng)目關(guān)系的方式,可以通過一個(gè)公共的本地倉庫去解決問題.

A.依賴

POM的基礎(chǔ)就是依賴列表,Maven下載與在編譯時(shí)鏈接依賴與其他所需要的目標(biāo),而且可以處理傳遞性依賴,使列表可以專注于項(xiàng)目所需的依賴.依賴放在<dependencies>里面,包含若干個(gè)<dependency>.

<dependencies>
    <dependency>
        ....
    </dependency>
    <dependency>
        ....
    </dependency>
</dependencies>

一個(gè)<dependency>通常包含:

a.<groupId>與<artifactId>

對應(yīng)項(xiàng)目坐標(biāo)

b.<version>

版本

c.<classifier>

可用于配置不同jdk的<depenency>,比如讓一個(gè)<dependency>同時(shí)支持jdk8與jdk11,可以選擇使用哪一個(gè)<classifier>,方便在不同jdk中使用.

d.<type>

對應(yīng)的依賴類型,默認(rèn)為jar,通常對應(yīng)與<packaging>.

e.<scope>

scope表示類庫與項(xiàng)目的關(guān)系,可以取以下5個(gè)值:

  • compile:默認(rèn)值,編譯依賴使其在所有類路徑中可用,而且這些依賴項(xiàng)會傳遞到其他依賴項(xiàng)目,在編譯和打包時(shí)都需要此類庫.
  • provided:類似compile,但是期望JDK或一個(gè)容器會在運(yùn)行時(shí)提供,僅在編譯和測試類路徑上可用,不可傳遞.
  • runtime:在運(yùn)行時(shí)與測試類路徑中可用,在編譯類路徑中不可用.
  • test:測試編譯與執(zhí)行階段可用,不可傳遞.
  • system:類似于provided,但必須顯式提供jar包.
f.<systemPath>

當(dāng)<scope>為system才需要這個(gè),否則(當(dāng)<scope>不為system時(shí))會構(gòu)建失敗.路徑必須為絕對路徑.

g.<optional>

標(biāo)記依賴的可選狀態(tài).

h.<exclusions>

排除不需要的依賴,包含子元素<exclusion>,每個(gè)<exclusion>都包含<groupId>與<artifactId>.

B.繼承

使用<parent>指定需要繼承的pom.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
</parent>

子pom會繼承父pom的<groupId>,<version>,<build>等眾多屬性,具體包括:

  • groupId
  • version
  • description
  • url
  • inceptionYear
  • organization
  • licenses
  • developers
  • contributors
  • mailingLists
  • scm
  • issueManagement
  • ciManagement
  • properties
  • dependencyManagement
  • dependencies
  • repositories
  • pluginRepositories
  • build
  • reporting
  • profiles

但不能繼承:

  • artifactId
  • name
  • prerequisites

另外,就像java中所有類都繼承于java.lang.Object一樣,所有POM都有一個(gè)"Super POM",pom都從它繼承而來,下面是Maven3.5.4的"Super pom":

<project>
  <modelVersion>4.0.0</modelVersion>

  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

  <build>
    <directory>${project.basedir}/target</directory>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
    <pluginManagement>
      <!-- NOTE: These plugins will be removed from future versions of the super POM -->
      <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.5.3</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <reporting>
    <outputDirectory>${project.build.directory}/site</outputDirectory>
  </reporting>

  <profiles>
    <!-- NOTE: The release profile will be removed from future versions of the super POM -->
    <profile>
      <id>release-profile</id>

      <activation>
        <property>
          <name>performRelease</name>
          <value>true</value>
        </property>
      </activation>

      <build>
        <plugins>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar-no-fork</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
              <updateReleaseInfo>true</updateReleaseInfo>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>

C.聚合(或多模塊)

模塊是pom列出的項(xiàng)目,并作為一個(gè)組執(zhí)行,每個(gè)模塊通過pom文件或項(xiàng)目的相對路徑進(jìn)行列出.

<modules>
    <module>my-project</module>
    <module>another-project</module>
    <module>third-project/pom-example.xml</module>
</modules>

不需要考慮模塊間的依賴關(guān)系,Maven會對其進(jìn)行拓?fù)渑判蛞员阍谝蕾嚹K之前構(gòu)建依賴關(guān)系.

(6)屬性

屬性是Maven中的值占位符,像Ant一樣,可以以

${x}

這樣的形式在pom.xml的任何位置訪問一個(gè)值,也可以被用作默認(rèn)值使用.
有5種形式使用值:

①env.x

env會使用當(dāng)前shell的環(huán)境變量的值.
例如

${env.PATH}

②project.x

<project>下的x元素的值,如

${project.version}

③settings.x

使用settings.xml中的元素的值

${settings.offline}

④java.x

java系統(tǒng)屬性值,通過java.lang.System.getProperties()獲取,如

${java.home}

⑤x

直接使用x,用的是<properties>下的屬性,比如

<properties>
    <aaa>AAAAA</aaa>
</properties>
${aaa}

3.構(gòu)建配置

<build>,聲明項(xiàng)目結(jié)構(gòu),管理插件等.

(1)BaseBuild元素

A. <defaultGoal>

目標(biāo)的默認(rèn)值,可以取值install,copile

B. <directory>

構(gòu)建產(chǎn)生的文件存放目錄

C. <finalName>

構(gòu)建最終產(chǎn)生的項(xiàng)目名字,但有可能會被更改.

D.<filters>

定義一組<filter>,<filter>內(nèi)是.properties文件,項(xiàng)目中的占位符如xxx.xxx會被.properties中的xxx=xxx的具體值替換掉.

(2)資源

<resources>,項(xiàng)目相關(guān)的資源文件的位置.

A.<resource>

描述每個(gè)資源的根元素.

B.<targetPath>

構(gòu)建資源的位置,對于jar包放在META-INF里面.

C.<flitering>

取值true或false,表示是否開啟過濾

D.<directory>

資源位置.

E.<include>

指定要包含的資源,使用*作為通配符.

F.<excludes>

與include相反,要排除的資源列表.

(3)插件

<plugins>下包含了若干個(gè)<plugin>,表示插件,每個(gè)<plugin>有以下元素:

A.<groupId>與<artifactId>

與上面的<groupId>與<artifactId>一樣.

B.<version>

與上面的<version>一樣.

C.<extensions>

取值true或false,表示是否加載擴(kuò)展,默認(rèn)為false.

D.<inherited>

取值ture或false,是否應(yīng)用pom的繼承關(guān)系,默認(rèn)true.

E.<configuration>

插件項(xiàng)的相關(guān)配置,可以配置<finalName>,<appendAssemblyld>,<descriptor>等.

F.<dependencies>

引入插件的依賴,與前面的<dependencies>類似.

G.<executions>

插件可能有多個(gè)目標(biāo),<executions>配置每一個(gè)<execution>作為插件的目標(biāo),在<execution>中,用<id>指定執(zhí)行目標(biāo)的標(biāo)識符,用<goals>指定目標(biāo),<goals>包含一組<goal>,<phase>用于指定階段,<inherited>用于指定是否啟用繼承關(guān)系.另外<execution>也可以包含<configuration>,與上面類似,用于配置特定的目標(biāo),而不是插件的所有目標(biāo).

(4)插件管理

<pluginManagement>,包含一組<plugins>,繼承于此項(xiàng)目的子項(xiàng)目都可以使用,子項(xiàng)目可以覆蓋修改<pluginManagement>.

(5)目錄

可以為pom設(shè)置各種目錄,比如

A.項(xiàng)目源碼目錄

<sourceDirectory></sourceDirectory>

構(gòu)建項(xiàng)目時(shí)會編譯該目錄的源碼,是相對于pom.xml的相對路徑.

B.測試源碼目錄

<testSourceDirectory></testSourceDirectory>

測試時(shí)會編譯其中的源碼,也是相對于pom.xml的相對路徑.

C.class目錄

<outputDirectory></outputDirectory>

這里存放被編譯過的class文件.

D.測試class

<testOutputDirectory></testOutputDirectory>

存放測試文件編譯后的class文件.

(6)擴(kuò)展

<extensions>,將包含在運(yùn)行中的構(gòu)建的類路徑中,在構(gòu)建過程中可以激活擴(kuò)展.比如可以為,例如這是支持ftp的wagon-ftp插件:

<build>
    <extensions>
        <extension>
            <groupId>org.apache.maven.wagon</groudId>
            <artifactId>wagon-ftp</artifactId>
            <version>3.3.4</version>
        </extension>
    </extensions>
</build>

(7)報(bào)表

<reporting>,描述產(chǎn)生報(bào)表的規(guī)范等,執(zhí)行"mvn site"時(shí)報(bào)表就會運(yùn)行.

A.<excludeDefaults>

是否包含默認(rèn)報(bào)表.

B.<outputDirectory>

報(bào)表存放位置.

C.<plugins>

報(bào)表包含的插件以及配置.

D.<reportSets>

包含一組<reportSet>,與<execution>類似,配置多個(gè)目標(biāo),每個(gè)<reportSet>包含<id>,<configuration>,<inherited>,以及<reports>,<id>指定報(bào)表集合的標(biāo)識符,<configuration>表示使用的報(bào)表配置,<inherited>表示是否繼承到子pom,<reports>包含一組<report>,表示使用哪些報(bào)表.

4.項(xiàng)目信息

(1)許可證

<licenses>,包含一組<license>,每個(gè)<license>包含<name>,<url>,<distribution>,<comments>.

A.<name>

名稱.

B.<url>

官方license頁面的url.

C.<distribution>

項(xiàng)目分發(fā)的方式,可以選擇

  • repo:從Maven倉庫下載.
  • manual:手動安裝.

D.<comments>

一些補(bǔ)充信息.

(2)組織

<organazation>,包含<name>,<url>,與<license>的類似.

(3)開發(fā)者

<developers>,包含一組<developer>,每個(gè)<developer>包含:

A.<id>

開發(fā)者id.

B.<name>

姓名.

C.<email>

郵箱.

D.<url>

主頁url.

E.<organization>

所屬組織.

F.<organizationUrl>

所屬組織的主頁url.

G.<roles>

角色,包含一組<role>,一個(gè)<role>描述一個(gè)角色.

H.<timeZone>

時(shí)區(qū),可以以America/New_York或Europe/Berlin這樣的形式,或者設(shè)置一個(gè)整數(shù),范圍[-11,12].

I.<properties>

開發(fā)者屬性,如如何處理即時(shí)消息等.

(4)貢獻(xiàn)者

<contributors>,包含一組<contributor>,類似于<developer>,包含<name>,<email>等元素.

5.環(huán)境配置

(1)問題管理

<issueManagement>,定義缺陷跟蹤系統(tǒng),如Bugzilla,TestTrack,ClearQuest等,包含<system>與<url>元素,<system>指定系統(tǒng)名字,<url>指定問題管理系統(tǒng)的url.

(2)持續(xù)集成管理

<ciManagement>,使用了觸發(fā)器,包含了:

A.<system>

持續(xù)集成系統(tǒng)的名稱.

B.<url>

持續(xù)集成系統(tǒng)的url.

C.<notifiers>

包含一組<notifier>,用來配置觸發(fā)器,每個(gè)<notifier>包含:

a.<type>

如何發(fā)送通知,比如可以取值mail.

b.<sendOnError>

取值true/false,錯(cuò)誤時(shí)發(fā)送.

c.<sendOnFailure>

取值true/false,失敗時(shí)發(fā)送.

d.<sendOnSuccess>

取值true/false,成功時(shí)發(fā)送.

e.<sendOnWarning>

取值true/false,發(fā)生警告時(shí)發(fā)送.

f.<configuration>

相關(guān)配置,例如可以添加<address>,發(fā)送的地址.

(3)郵件列表

<mailingLists>,包含一組<mailingList>,表示郵件信息,包括:

A.<name>

郵件名稱.

B.<subscribe>

訂閱郵件地址或鏈接.

C.<unsubscribe>

取消訂閱郵件或鏈接.

D.<post>

要發(fā)送的郵件地址.

E.<archive>

查看舊的郵件的url.

(4)軟件配置管理(SCM)

<scm>,也叫Source Code/Control Management,允許配置代碼庫供web站點(diǎn)和其他插件使用.包含:

A.<connection>與<developConnection>

描述如何通過Maven連接到版本控制系統(tǒng),其中connection需要讀權(quán)限,developConnection需要寫權(quán)限.

B.<tag>

代碼標(biāo)簽,默認(rèn)為HEAD.

C.<url>

公開的可瀏覽的倉庫,例如ViewVC或Fisheye.

(5)前提條件

<prerequisites>,這是Maven2中的元素,只有一個(gè)子元素<maven>,指定maven的版本,且規(guī)定是2.x版本.Maven3中不需要<prerequisites>了,可以用:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>3.0.0-M3</version>
            <executions>
                <execution>
                <id>enforce-maven</id>
                <goals>
                    <goal>enforce</goal>
                </goals>
                <configuration>
                <rules>
                    <requireMavenVersion>
                        <version>3.0</version>
                    </requireMavenVersion>
                </rules>    
            </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

代替.

(6)倉庫

<repositories>,包含一組<repository>,表示倉庫的位置,每個(gè)<repository>包含:

A.<releases>

如何處理遠(yuǎn)征倉庫的發(fā)布版本,包含:

  • <enabled>
    true/false,是否啟用.
  • <updatePolicy>
    更新頻率,Maven將本地pom的時(shí)間戳與遠(yuǎn)程進(jìn)行比較,可以選擇:always,daily(默認(rèn)),interval:X(X是一個(gè)整數(shù),表示X分鐘),never.
  • <checksumPolicy>
    校驗(yàn)錯(cuò)誤或校驗(yàn)失敗時(shí)的策略,可以選擇ignore,fail或warn.

B.<snapshots>

如何處理遠(yuǎn)程倉庫的快照版本,包含的元素與<releases>一樣.

C.<id>

遠(yuǎn)程倉庫的標(biāo)識符.

D.<name>

遠(yuǎn)程倉庫的名稱.

E.<url>

遠(yuǎn)程倉庫的url.

F.<layout>

倉庫布局類型,可以是default或legacy,Maven2.x為倉庫提供了默認(rèn)布局.

(7)插件倉庫

<pluginRepositories>,插件的遠(yuǎn)程倉庫列表,包含一組<pluginRepository>,與<repositories>中的<repository>類似.

(8)分發(fā)管理

<distributeManagement>,管理整個(gè)構(gòu)建過程中的分發(fā),可以把網(wǎng)站部署到遠(yuǎn)程服務(wù)器或者把構(gòu)件部署到遠(yuǎn)程倉庫.包含:

A.倉庫

<repository>,倉庫信息,包含:

  • <uniqueVersion>:唯一版本,取值true/false,表示是否生成一個(gè)唯一版本號或是使用部分地址作為版本號.
  • <name>:倉庫名字.
  • <id>:倉庫id.
  • <url>:指定倉庫位置.
  • <layout>:布局,取值default或legacy.

還有一個(gè)叫<snapshotRepository>的元素,與<repository>類似,表示快照倉庫.

B.站點(diǎn)部署

<site>,定義了如何部署項(xiàng)目的站點(diǎn)與文檔.包含:

  • <name>:站點(diǎn)名稱.
  • <id>:站點(diǎn)id.
  • <url>:站點(diǎn)url.

C.重定位

<relocation>,表示項(xiàng)目的新位置.包含:

  • <groupId>:新的<groupId>.
  • <artifactId>:新的<artifactId>.
  • <version>:新版本.
  • <message>:提示信息.

(9)配置文件

<profiles>,包含一組<profile>,每個(gè)<profile>可以定義不同的配置,包含的元素有:

  • <id>:配置文件的id,比如測試的可以叫test.
  • <build>:相關(guān)構(gòu)建信息.
  • <modules>:模塊信息.
  • <repositories>:遠(yuǎn)程倉庫信息.
  • <pluginRepositories>:插件倉庫信息.
  • <dependencies>:依賴信息.
  • <reporting>:報(bào)表信息.
  • <dependencyManagement>:依賴管理信息.
  • <distributeManagement>:分發(fā)管理
  • <activation>:activation是profile的關(guān)鍵,profile的強(qiáng)大之處是某些情況下才可以修改基本pom,這些情況通過activation指定.

<activation>包含以下元素:

A.<activeByDefault>

是否默認(rèn)激活,true或false.

B.<jdk>

指定jdk版本.

C.<os>

<os>可以定義一些特定的操作系統(tǒng)屬性,例如<name>,<family>,<arch>,<version>.

D.<property>

若Maven檢測到該屬性就會激活該屬性所在的配置文件,可以指定<name>與<value>.

E.<file>

有<exists>與<missing>兩個(gè)子元素,<exists>表示若存在<exists>元素中對應(yīng)的文件,則激活此配置文件.<miissing>表示若不存在<missing>元素中對應(yīng)的文件,則激活此配置文件.

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI