maven(三)配置文件

maven(一)安装与配置
maven(二)的生命周期与阶段
maven(三)配置文件
maven(四)的仓库
maven(五)的自动化构建
maven(六)的自动化部署
maven(七)的依赖管理

项目级别配置文件:pom.xml
用户级别的配置文件: %USER_HOME%/.m2/settings.xml
全局(Global)配置文件:%M2_HOME%/conf/settings.xml

3.1 项目级别的配置文件 pom

POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息。

执行任务或目标(goal)时,Maven会在当前目录中查找POM。它读取POM,获取所需的配置信息,然后执行目标。

POM 中可以指定以下配置

  • 项目的基本信息配置 groupId,artifactId,version
  • 项目的父项目配置 parent
  • 项目依赖配置 dependencies dependencyManagement
  • 项目仓库配置 repositories
  • 项目部署配置 distributionManagement
  • 项目scm配置 scm
  • 项目构建配置 bulid
  • 项目构建多文件配置 profiles
  • 项目开发者列表 developers
  • 相关邮件列表信息 mailingLists

3.1.1 pom中项目的基本信息配置

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example.demo</groupId>
    <artifactId>test-maven</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    
    <name>test-maven</name>
    <url>http://www.baidu.com/test-maven</url>
    <description>A maven project to test-maven.</description>
</project>    

解释:

  • <modelVersion>声明配置文件遵循哪一个POM模型版本。

  • <groupId>项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目,并且构建时生成的路径也是由此生成。

  • <artifactId>构件的标识符,它和groupID一起构成了项目构件的唯一标识

  • <packaging>项目产生的构件类型,例如jar、war、ear、pom。

  • <version>项目当前版本,格式为:主版本.次版本.增量版本-限定版本号

  • <name>项目的名称, Maven产生的文档用。

  • <url> 项目主页的URL, Maven产生的文档用 .

  • <description>项目的详细描述, 可以使用html格式描述, Maven 产生的文档用。

3.1.2 pom中父项目配置

<parent>
    <artifactId />
    <groupId />
    <version />
    <relativePath />
</parent>

解释:

  • <parent>父项目的坐标。如果子项目中没有规定某个元素的值,那么默认继承父项目中该元素的值。
  • <relativePath />父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。

超级父项目(Super POM)

Super POM是Maven默认的POM,所有的 POM 都继承自一个Super POM(无论是否显式定义了这个Super POM)。

Super POM包含了一些可以被继承的默认设置,比如默认的仓库,因此,当 Maven发现需要下载 POM 中的依赖时,会到Super POM中配置的默认仓库 http://repo1.maven.org/maven2 去下载。

可以使用以下命令来查看 Super POM 默认配置:

mvn help:effective-pom

3.1.3 pom中项目依赖配置

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-artifact</artifactId>
        <version>3.8.1</version>
        <type>jar</type>
        <classifier></classifier>
        <scope>test</scope>
        <systemPath></systemPath>
        <exclusions>
            <exclusion>
                <artifactId>spring-core</artifactId>
                <groupId>org.springframework</groupId>
            </exclusion>
        </exclusions>
        <optional>true</optional>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            ......
        </dependency>
    </dependencies>
</dependencyManagement>

解释:

  • <dependencies>描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节
  • <dependency>描述一个依赖
  • <groupId>依赖的groupId
  • <artifactId>依赖的artifact ID
  • <version>依赖的版本号
  • <type>依赖类型,默认类型是jar, 表示依赖的文件的扩展名。其他扩展名类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为 true,就可以在 plugin里定义新的类型。
  • <classifier> 依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。
  • <scope> 依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。
    • compile :默认范围,用于编译 。
    • provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath 。
    • runtime:在执行时需要使用 。
    • test:用于test任务时使用 。
    • system:需要外在提供相应的元素。通过systemPath来取得stemPath: 仅用于范围为system, 提供相应的路径 。
    • optional:当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用。
  • <systemPath>仅供system依赖范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}
  • <exclusions>当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。此元素主要用于解决版本冲突问题。
  • <optional>可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。
  • <dependencyManagement>声名依赖信息,如果项目依赖(dependencies)中使用了被声明的依赖,则通过group ID和artifact ID 匹配到声明的依赖,并使用声明的依赖信息(比如版本信息)。

3.1.4 pom中项目仓库配置

<repositories>
    <repository>
        <id>nexusmy</id>
        <name>Team Maven Repository</name>
        <url>http://localhost:8081/repository/maven-public/</url>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
        </releases>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
        </snapshots>
        <layout>default</layout>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>nexusmy</id>
        <name>Team Maven Repository</name>
        <url>http://localhost:8081/repository/maven-public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

解释:

  • <repositories>:配置远程仓库列表

  • <repositorie>:配置远程仓库

  • <pluginRepositories>: 配置插件的远程仓库列表

  • <pluginRepository>: 配置插件的远程仓库

  • <id>: 配置远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库

  • <name>: 配置远程仓库的名称

  • <url>:远程仓库URL,按protocol://hostname/path形式

  • <layout>: 用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)

  • <releases>:配置仓库中发布版的一些属性

  • <snapshots>:配置仓库中快照版的一些属性

  • <enabled>: 配置该仓库是否开启下载某种类型构件(发布版,快照版)

  • <updatePolicy> 配置更新发生的频率。

    Maven会比较本地POM和远程POM的时间戳,可选项如下:

    • always(一直)
    • daily(默认,每日)
    • interval:X(这里X是以分钟为单位的时间间隔)
    • never(从不)
  • <checksumPolicy /> : 配置Maven验证构件校验文件失败时的策略:ignore(忽略),fail(失败),或者warn(警告)。

  • <uniqueVersion>是分配给快照一个唯一的版本号(由时间戳和构建流水号)?还是每次都使用相同的版本号?

3.1.5 pom中项目部署配置

<distributionManagement>
    <repository>
        <uniqueVersion />
        <id>banseon-maven2</id>
        <name>banseon maven2</name>
        <url>file://${basedir}/target/deploy</url>
        <layout />
    </repository>
    <snapshotRepository>
        <uniqueVersion />
        <id>banseon-maven2</id>
        <name>Banseon-maven2 Snapshot Repository</name>
        <url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url>
        <layout />
    </snapshotRepository>
    <site>
        <id>banseon-site</id>
        <name>business api website</name>
        <url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web</url>
    </site>
    <downloadUrl />
    <relocation>
        <groupId />
        <artifactId />
        <version />
        <message />
    </relocation>
    <status />
</distributionManagement>

解释:

  • <distributionManagement>:项目分发信息,表示要发布的位置, 在执行mvn deploy后把网站部署到远程服务器或者把构件部署到远程仓库。

  • <repository> 构件的发布版部署到哪里

  • <snapshotRepository> 构件的快照版部署到哪里

  • <site>: 配置网站部署到哪里

  • <downloadUrl>: 项目下载页面的URL

  • <relocation>: 如果构件有了新的group ID和artifact ID(构件移到了新的位置),列出构件的重定位信息

  • <message>: 显示给用户的,关于移动的额外信息,例如原因

  • <status>: 给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。

有效的值有:

  • none(默认)
  • converted(仓库管理员从 Maven 1 POM转换过来)
  • partner(直接从伙伴Maven 2仓库同步过来)
  • deployed(从Maven 2实例部 署)
  • verified(被核实时正确的和最终的)。

3.1.6 pom中scm配置

<scm>
    <connection>
        scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
    </connection>
    <developerConnection>
        scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
    </developerConnection>
    <tag />
    <url>http://svn.baidu.com/banseon</url>
</scm>

解释:

  • <scm>: SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。
  • <connection>: 代码库的地址,连接只读
  • <developerConnection>: 给开发者使用的代码库的地址,该连接不仅仅只读
  • <tag>: 当前代码的标签,在开发阶段默认为HEAD
  • <url>:在浏览器上代码库的地址

3.1.7 pom中项目构建配置bulid

 <build>
     <sourceDirectory>D:\mycode\test-maven\src\main\java</sourceDirectory>
     <scriptSourceDirectory>D:\mycode\test-maven\src\main\scripts</scriptSourceDirectory>
     <testSourceDirectory>D:\mycode\test-maven\src\test\java</testSourceDirectory>
     <outputDirectory>D:\mycode\test-maven\target\classes</outputDirectory>
     <testOutputDirectory>D:\mycode\test-maven\target\test-classes</testOutputDirectory>
     <defaultGoal />
     <resources>
         <resource>
            <directory>D:\mycode\test-maven\src\main\resources</directory>
         </resource>
     </resources>
     <testResources>
         <testResource>
            <directory>D:\mycode\test-maven\src\test\resources</directory>
         </testResource>
     </testResources>
     <directory>D:\mycode\test-maven\target</directory>
     <finalName>test-maven-1.0-SNAPSHOT</finalName>
     <filters/> 
     <pluginManagement>
        <plugins>
          <plugin>
          ......
          </plugin>
        </plugins>
      </pluginManagement>
      <plugins>
          <plugin>
            ......
          </plugin>
      </plugins>
 </bulid>

解释:

  • <sourceDirectory>: 项目源码目录,当构建项目的时候,构建系统会编译目录里的源码(相对于pom.xml的相对路径)。
  • <scriptSourceDirectory>项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容会被拷贝到输出目录。
  • <testSourceDirectory>: 项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。
  • <outputDirectory>:被编译过的应用程序class文件存放的目录.
  • <testOutputDirectory>:被编译过的测试class文件存放的目录。
  • <defaultGoal>:当项目没有规定目标(Maven2 叫做阶段)时的默认值 。
  • <resources>: 项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。
  • <testResources>:单元测试相关的所有资源路径,例如和单元测试相关的属性文件。
  • <directory>: 构建产生的所有文件存放的目录。
  • <finalName>: 将调用所生成构件的文件名(不包括扩展名,并且没有路径信息)
  • <filters/>:启用筛选时使用的筛选属性文件列表。
  • <pluginManagement>: 在一组pom中使用的默认插件信息的管理部分
  • <plugins>配置使用的插件列表
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
            <execution>
                <id>antrun-pre-clean</id>
                <phase>pre-clean</phase>
                <configuration>
                    <target>
                        <echo message="run plugin"/>
                    </target>
                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
                <inherited>true</inherited>
            </execution>
        </executions>
        <inherited>true</inherited>
        <extensions>false</extensions>
        <dependencies>
            <dependency>
            ......
            </dependency>
        </dependencies>
    </plugin>
</plugins>

解释:

  • <executions>:在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。
  • <execution>:执行一个目标的配置
  • <id>: 执行目标的标识符,用于标识构建过程中的目标
  • <phase>: 绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段
  • <goals>: 配置的执行目标
  • <inherited>: 配置是否被传播到子POM
  • <configuration>: 作为DOM对象的配置
  • <extensions>: 是否从这里加载Maven扩展(例如打包和类型处理程序) 插件。 出于性能原因,应该只在必要时启用
  • <dependencies>: 项目引入插件所需要的额外依赖

3.1.8 pom中项目构建多文件配置 profiles

<profiles>可以定义在pom中,用户级配置setting中,全局配置setting中。

<profiles>
    <profile>
        <id>dev</id>
        <activation></activation>
        <build></build>
        <reporting></reporting>
        <modules></modules>
        <repositories></repositories>
        <pluginRepositories></pluginRepositories>
        <dependencyManagement></dependencyManagement>
        <dependencies></dependencies>
    </profile>
        <profile>
        <id>fat</id>
        <activation></activation>
        <build></build>
        <reporting></reporting>
        <modules></modules>
        <repositories></repositories>
        <pluginRepositories></pluginRepositories>
        <dependencyManagement></dependencyManagement>
        <dependencies></dependencies>
    </profile>
</profiles>

解释:

  • <profiles>:项目本地构建配置文件的列表,它将在激活时修改构建过程。

  • <profile>:项目本地某个构建配置文件。

  • <id>: profile的唯一标识符。即用于命令行激活,也用于在继承时合并具有相同标识符的profile。

  • <activation>: 配置自动激活profile的方式

  • <modules>:作为该项目的一部分构建的模块(有时称为子项目)。列出的每个模块都是包含该模块的目录的相对路径。

  • <reporting>:该元素包括使用报表插件产生报表的规范。当用户执行"mvn site",这些报表就会运行。 在页面导航栏能看到所有报表的链接。

<activation>激活方式配置

<activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.8</jdk>
    <os>
        <!--激活profile的操作系统的名字 -->
        <name>Windows XP</name>
        <!--激活profile的操作系统所属家族(如 'windows') -->
        <family>Windows</family>
        <!--激活profile的操作系统体系结构 -->
        <arch>x86</arch>
        <!--激活profile的操作系统版本 -->
        <version>5.1.2600</version>
    </os>
    <!--如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile就会被激活。如果值 字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段 -->
    <property>
        <!--激活profile的属性的名称 -->
        <name>mavenVersion</name>
        <!--激活profile的属性的值 -->
        <value>2.0.3</value>
    </property>
    <!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活 profile。另一方面,exists则会检查文件是否存在,如果存在则激活profile。 -->
    <file>
        <!--如果指定的文件存在,则激活profile。 -->
        <exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>
        <!--如果指定的文件不存在,则激活profile。 -->
        <missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>
    </file>
</activation>

解释:

  • <activation>:配置自动激活profile的方式。Activation是profile的激活的一种方式。
  • <activeByDefault>:配置是否默认激活profile
  • <jdk>:当匹配jdk版本时,profile被激活。
  • <os>:当匹配操作系统属性时,profile将被激活。
  • <property>:指定此系统属性时,profile将被激活。
  • <file>:文件的存在或者不存在时,profile将被激活。

profile的激活方式

  • 在命令控制台中使用 maven 命令激活 profile:mvn test -Pdev

    命令说明:第一个 test 为 Maven 生命周期阶段, dev 为构建配置文件指定的 <id> 参数,这个参数通过 -P 来传输。

  • 通过Maven设置激活配置文件,在settings.xml文件中添加配置

    <settings 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/settings-1.0.0.xsd">
       ...
       <activeProfiles>
          <activeProfile>dev</activeProfile>
       </activeProfiles>
    </settings>
    
  • 通过环境变量激活配置文件 以及 <activation>配置

    在profile中增加配置

    <activation>
        <property>
            <name>env</name>
            <value>test</value>
        </property>
    </activation>
    

    在命令控制台中使用 maven 命令:mvn test -Denv=test

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容