Maven

Posted by Wh0ami-hy on January 7, 2023

1. Maven简介

Maven是一个项目管理工具,可以对Java项目进行自动化的构建和依赖管理。

QQ截图20230107090232

1.1. Maven作用

项目构建:提供标准的,跨平台的自动化构建项目的方式

依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突等问题

统一开发结构:提供标准的,统一的项目开发结构,如图

QQ截图20230107090429

下载地址(版本需不低于3.6)

https://maven.apache.org/download.cgi

下载后解压的目录对应的含义

bin目录:maven的运行文件。mvn.cmd正常运行mvn,mvnDebug.cmd已debug方式运行maven。  
boot目录:maven运行需要类加载器。  
conf目录:maven的配置文件目录,核心配置文件为其中的setting.xml。  
lib目录:maven所需要的jar包。

1.2. Maven仓库

https://mvnrepository.com/

运行Maven的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库。

本地仓库

默认位置是用户目录下的.m2文件夹

修改maven安装包中的conf/settings.xml文件,指定本地仓库位置。位于localRepository字段处

远程仓库

maven默认连接的远程仓库位置并不在国内,下载速度非常慢,我们可以配置一个国内站点镜像,可用于加速下载资源。位于mirrors字段处

如阿里云镜像

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>aliyun_maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

1.3. Maven指令

mvn -v 查看maven版本

mvn compile 用来将src/main/java下的文件编译为class文件,并输出到target中

mvn test test 用来将src/main/test下的文件进行编译,同时执行一次

mvn package 打包,将项目进行打包,如果是jar打包为jar,war打包为war

mvn clean 删除编译产生的target文件夹

mvn install 安装jar包到本地仓库中

1.4. Maven插件

maven-compiler-plugin: 用于编译 Java 代码。

maven-surefire-plugin: 用于运行单元测试。

maven-jar-plugin: 用于打包 JAR 文件。

maven-war-plugin: 用于打包 WAR 文件。

maven-install-plugin: 用于将项目安装到本地 Maven 仓库中。

maven-deploy-plugin: 用于将项目部署到远程 Maven 仓库中。

maven-release-plugin: 用于发布项目的正式版本。

maven-site-plugin: 用于生成项目文档网站。

maven-dependency-plugin: 用于管理项目的依赖项。

maven-clean-plugin: 用于清理项目的目录。

2. settings.xml

<localRepository>
描述: 指定 Maven 本地仓库的路径。
作用: 当 Maven 需要下载依赖时,会优先从本地仓库查找,如果没有找到才会从远程仓库下载。
<mirrors>
描述: 配置Maven的镜像仓库。
作用: 当访问中央仓库比较慢时,可以配置一个镜像仓库,如阿里云的仓库,从而加快下载速度。
<servers>
描述: 配置访问远程仓库的认证信息。
作用: 如果远程仓库需要用户名和密码来访问,就需要在这里进行配置。
<proxies>
描述: 配置代理服务器信息。
作用: 如果需要通过代理服务器访问远程仓库,可以在这里进行配置。
<profiles>
描述: 配置项目构建时使用的 profile。
作用: 可以针对不同的环境(如开发、测试、生产)设置不同的配置信息。
<activeProfiles>
描述: 指定默认激活的 profile。
作用: 当 Maven 构建项目时,会自动激活这里配置的 profile。
<pluginGroups>
描述: 配置默认加载的插件组。
作用: 当在命令行使用插件时,可以不用输入完整的坐标。

配置阿里云镜像和私服镜像, 并且先从阿里云下载,下载不到的再去私服下载

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <!-- 本地仓库的位置 -->
    <localRepository>.../repository</localRepository>
  
    <!-- Apache Maven 配置 -->
    <pluginGroups/>
    <proxies/>

    <!-- 私服发布的用户名密码 -->
  <servers>
    <server>
      <id>nexus-releases</id>
      <username>mvn-public</username>
      <password>xxb-88809</password>
    </server>

    <server>
      <id>nexus-snapshots</id>
      <username>mvn-public</username>
      <password>xxb-88809</password>
    </server>
  </servers>
    
    <!-- 阿里云镜像 -->
    <mirrors>
        <mirror>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
    <!-- 影响下载顺序的是profiles标签的配置顺序(后面配置的ali仓库先下载), 而不是activeProfiles的顺序 -->
    <profiles>
        <!-- Nexus私服配置: 第三方jar包下载, 比如oracle的jdbc驱动等 -->
        <profile>
            <id>dev</id>
            <repositories>
                <repository>
                    <id>nexus</id>
                    <url>http://library.yatoil.com:8081/repository/maven-public/</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>public</id>
                    <name>Public Repositories</name>
                    <url>http://library.yatoil.com:8081/repository/maven-public/</url>
                </pluginRepository>
            </pluginRepositories>
        </profile>
        
        <!-- 阿里云配置: 提高国内的jar包下载速度 -->
        <profile>
            <id>ali</id>
            <repositories>
                <repository>
                    <id>alimaven</id>
                    <name>aliyun maven</name>
                    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>alimaven</id>
                    <name>aliyun maven</name>
                    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                </pluginRepository>
            </pluginRepositories>
        </profile>

    </profiles>
    
    <!-- 激活配置 --> 
    <activeProfiles>
        <activeProfile>dev</activeProfile>
        <activeProfile>ali</activeProfile>
    </activeProfiles>
</settings>

3. nexus仓库管理器

Nexus 是一个强大的 Maven 私有仓库管理工具,它提供了以下主要功能:

私有仓库管理:
	可以在 Nexus 中配置多个私有仓库,用于存放组织内部开发的 Artifact。
	可以设置访问权限,控制哪些用户/角色可以访问特定仓库。
代理远程仓库:
	Nexus 可以代理官方的 Maven 中央仓库,以及其他公共仓库,加快 Artifact 的下载速度。
	可以对下载的 Artifact 进行缓存,减少重复下载。
仓库组管理:
	可以将多个仓库聚合成一个仓库组,以便统一管理。
	客户端可以统一访问仓库组,无需关心具体的仓库位置。
构建集成:
	Nexus 可以与持续集成工具(如 Jenkins)集成,用于管理构建产物。
	可以自动部署构建产物到 Nexus 仓库中。
用户权限管理:
	Nexus 提供了丰富的用户权限管理功能,可以细粒度地控制用户对仓库的访问权限。
	支持通过 LDAP 等外部身份验证系统进行集成。
仓库运维:
	Nexus 提供了强大的仓库管理界面,可以方便地查看仓库状态、监控仓库使用情况等。
	支持仓库的备份和还原操作。

4. 在IDEA中配置maven

打开settings,搜索maven即可

5. pom.xml文件

pom.xml文件是Maven 项目管理工具中使用的项目对象模型(Project Object Model)文件,通常简称为 POM 文件。它是 Maven 项目的核心文件之一,用于描述项目的基本信息、依赖关系、构建选项、插件配置等。

每个Maven项目都应该包含一个 POM 文件,以便 Maven 能够正确地构建该项目。POM 文件通常位于项目的根目录下,文件名为 pom.xml

POM 文件由 XML 编写,其中包含了一些元素和属性,用于描述项目的各个方面。例如,POM 文件中通常包含以下信息:

项目的坐标(groupId、artifactId、version)、依赖关系、构建选项和插件配置、开发者信息、许可证信息等。通过这些信息,Maven 可以自动下载依赖项、编译代码、运行测试、打包构建结果等

5.1. 基础配置

一个典型的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">
  
	<!--  POM 模型的版本号 -->  
	<modelVersion>4.0.0</modelVersion>
  
    <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.baidu,maven会将该项目打成的jar包放本地路径:/com/baidu -->  
    <groupId>com.baidu</groupId>  
  
    <!-- 本项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->  
    <artifactId>dorm-repair</artifactId>  
  
    <!-- 本项目目前所处的版本号 SNAPSHOT 表示快照版本,RELEASE 表示正式版本-->  
    <version>1.0.0-SNAPSHOT</version>  
  
    <!-- 打包的机制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar -->  
    <!-- 对于聚合模块来说,其打包方式必须为pom,否则无法构建 -->
    <packaging>jar</packaging>  
  
    <!-- 一般不用。帮助定义构件输出的一些附属构件,附属构件与主构件对应,有时候需要加上classifier才能唯一的确定该构件 不能直接定义项目的classifer,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的 -->  
    <classifier>...</classifier>  
  
    <!-- 定义本项目的依赖关系 -->  
    <dependencies>  
  
        <!-- 每个dependency都对应这一个jar包 -->  
        <dependency>  
  
            <!--一般情况下,maven是通过groupId、artifactId、version这三个元素值(俗称坐标)来检索该构件, 然后引入你的工程。如果别人想引用你现在开发的这个项目(前提是已开发完毕并发布到了远程仓库),-->   
            <!--就需要在他的pom文件中新建一个dependency节点,将本项目的groupId、artifactId、version写入, maven就会把你上传的jar包下载到他的本地 -->  
            <groupId>com.winner.trade</groupId>  
            <artifactId>trade-test</artifactId>  
            <version>1.0.0-SNAPSHOT</version>  
  
            <!-- maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。 -->  
            <!--scope包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围) -->  
            <scope>test</scope>  
  
            <!-- 设置指依赖是否可选,默认为false,即子项目默认都继承:为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似  -->  
            <optional>false</optional>  
  
            <!-- 屏蔽依赖关系。 比如项目中使用的libA依赖某个库的1.0版,libB依赖某个库的2.0版,现在想统一使用2.0版,就应该屏蔽掉对1.0版的依赖 -->  
            <exclusions>  
                <exclusion>  
                    <groupId>org.slf4j</groupId>  
                    <artifactId>slf4j-api</artifactId>  
                </exclusion>  
            </exclusions>  
  
        </dependency>  
  
    </dependencies>  
  
    <!-- 为pom定义一些常量,在pom中的其它地方可以直接引用 使用方式 如下 :${file.encoding} -->  
    <properties>  
        <file.encoding>UTF-8</file.encoding>  
        <java.source.version>1.5</java.source.version>  
        <java.target.version>1.5</java.target.version>  
    </properties>  
  
    ...  
</project>  

5.2. 构建配置

<build>  
  
    <!-- 产生的构件的文件名,默认值是${artifactId}-${version}。 -->  
    <finalName>myPorjectName</finalName>  
  
    <!-- 构建产生的所有文件存放的目录,默认为${basedir}/target,即项目根目录下的target -->  
    <directory>${basedir}/target</directory>  
  
    <!--当项目没有规定目标(Maven2叫做阶段(phase))时的默认值, -->  
    <!--必须跟命令行上的参数相同例如jar:jar,或者与某个阶段(phase)相同例如install、compile等 -->  
    <defaultGoal>install</defaultGoal>  
  
    <!--当filtering开关打开时,使用到的过滤器属性文件列表。 -->  
    <!--项目配置信息中诸如${spring.version}之类的占位符会被属性文件中的实际值替换掉 -->  
    <filters>  
        <filter>../filter.properties</filter>  
    </filters>  
  
    <!--项目相关的所有资源路径列表,例如和项目相关的配置文件、属性文件,这些资源被包含在最终的打包文件里。 -->  
    <resources>  
        <resource>  
  
            <!--描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。 -->  
            <!--举个例子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven/messages。 -->  
            <!--然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。 -->  
            <targetPath>resources</targetPath>  
  
            <!--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。 -->  
            <filtering>true</filtering>  
  
            <!--描述存放资源的目录,该路径相对POM路径 -->  
            <directory>src/main/resources</directory>  
  
            <!--包含的模式列表 -->  
            <includes>  
                <include>**/*.properties</include>  
                <include>**/*.xml</include>  
            </includes>  
  
            <!--排除的模式列表 如果<include>与<exclude>划定的范围存在冲突,以<exclude>为准 -->  
            <excludes>  
                <exclude>jdbc.properties</exclude>  
            </excludes>  
  
        </resource>  
    </resources>  
  
    <!--单元测试相关的所有资源路径,配制方法与resources类似 -->  
    <testResources>  
        <testResource>  
            <targetPath />  
            <filtering />  
            <directory />  
            <includes />  
            <excludes />  
        </testResource>  
    </testResources>  
  
    <!--项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->  
    <sourceDirectory>${basedir}\src\main\java</sourceDirectory>  
  
    <!--项目脚本源码目录,该目录和源码目录不同, <!-- 绝大多数情况下,该目录下的内容会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。 -->  
    <scriptSourceDirectory>${basedir}\src\main\scripts  
    </scriptSourceDirectory>  
  
    <!--项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->  
    <testSourceDirectory>${basedir}\src\test\java</testSourceDirectory>  
  
    <!--被编译过的应用程序class文件存放的目录。 -->  
    <outputDirectory>${basedir}\target\classes</outputDirectory>  
  
    <!--被编译过的测试class文件存放的目录。 -->  
    <testOutputDirectory>${basedir}\target\test-classes  
    </testOutputDirectory>  
  
    <!--项目的一系列构建扩展,它们是一系列build过程中要使用的产品,会包含在running bulid‘s classpath里面。 -->  
    <!--他们可以开启extensions,也可以通过提供条件来激活plugins。 -->  
    <!--简单来讲,extensions是在build过程被激活的产品 -->  
    <extensions>  
  
        <!--例如,通常情况下,程序开发完成后部署到线上Linux服务器,可能需要经历打包、 -->  
        <!--将包文件传到服务器、SSH连上服务器、敲命令启动程序等一系列繁琐的步骤。 -->  
        <!--实际上这些步骤都可以通过Maven的一个插件 wagon-maven-plugin 来自动完成 -->  
        <!--下面的扩展插件wagon-ssh用于通过SSH的方式连接远程服务器, -->  
        <!--类似的还有支持ftp方式的wagon-ftp插件 -->  
        <extension>  
            <groupId>org.apache.maven.wagon</groupId>  
            <artifactId>wagon-ssh</artifactId>  
            <version>2.8</version>  
        </extension>  
  
    </extensions>  
  
    <!--使用的插件列表 。 -->  
    <plugins>  
        <plugin>  
            <groupId></groupId>  
            <artifactId>maven-assembly-plugin</artifactId>  
            <version>2.5.5</version>  
  
            <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->  
            <executions>  
                <execution>  
  
                    <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->  
                    <id>assembly</id>  
  
                    <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->  
                    <phase>package</phase>  
  
                    <!--配置的执行目标 -->  
                    <goals>  
                        <goal>single</goal>  
                    </goals>  
  
                    <!--配置是否被传播到子POM -->  
                    <inherited>false</inherited>  
  
                </execution>  
            </executions>  
  
            <!--作为DOM对象的配置,配置项因插件而异 -->  
            <configuration>  
                <finalName>${finalName}</finalName>  
                <appendAssemblyId>false</appendAssemblyId>  
                <descriptor>assembly.xml</descriptor>  
            </configuration>  
  
            <!--是否从该插件下载Maven扩展(例如打包和类型处理器), -->  
            <!--由于性能原因,只有在真需要下载时,该元素才被设置成true。 -->  
            <extensions>false</extensions>  
  
            <!--项目引入插件所需要的额外依赖 -->  
            <dependencies>  
                <dependency>...</dependency>  
            </dependencies>  
  
            <!--任何配置是否被传播到子项目 -->  
            <inherited>true</inherited>  
  
        </plugin>  
    </plugins>  
  
    <!--主要定义插件的共同元素、扩展元素集合,类似于dependencyManagement, -->  
    <!--所有继承于此项目的子项目都能使用。该插件配置项直到被引用时才会被解析或绑定到生命周期。 -->  
    <!--给定插件的任何本地配置都会覆盖这里的配置 -->  
    <pluginManagement>  
        <plugins>...</plugins>  
    </pluginManagement>  
  
</build>  

5.3. 分发配置

<!--项目分发信息,在执行mvn deploy后表示要发布的位置。 -->  
<!--有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 -->  
<distributionManagement>  
  
    <!--部署项目产生的构件到远程仓库需要的信息 -->  
    <repository>  
  
        <!--是分配给快照一个唯一的版本号(由时间戳和构建流水号),还是每次都使用相同的版本号 -->  
        <!--参见repositories/repository元素 -->  
        <uniqueVersion>true</uniqueVersion>  
  
        <id> repo-id </id>  
        <name> repo-name</name>  
        <url>file://${basedir}/target/deploy </url>  
        <layout />  
  
    </repository>  
  
    <!--构件的快照部署到哪里,如果没有配置该元素,默认部署到repository元素配置的仓库 -->  
    <snapshotRepository>  
        <uniqueVersion />  
        <id />  
        <name />  
        <url />  
        <layout />  
    </snapshotRepository>  
  
    <!--部署项目的网站需要的信息 -->  
    <site>  
  
        <!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置 -->  
        <id> site-id </id>  
  
        <!--部署位置的名称 -->  
        <name> site-name</name>  
  
        <!--部署位置的URL,按protocol://hostname/path形式 -->  
        <url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url>  
  
    </site>  
  
    <!--项目下载页面的URL。如果没有该元素,用户应该参考主页。 -->  
    <!--使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。 -->  
    <downloadUrl />  
  
    <!--如果构件有了新的groupID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。 -->  
    <relocation>  
  
        <!--构件新的group ID -->  
        <groupId />  
  
        <!--构件新的artifact ID -->  
        <artifactId />  
  
        <!--构件新的版本号 -->  
        <version />  
  
        <!--显示给用户的,关于移动的额外信息,例如原因。 -->  
        <message />  
  
    </relocation>  
  
    <!--给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。 -->  
    <!--有效的值有:none(默认),converted(仓库管理员从Maven 1 POM转换过来), -->  
    <!--partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部署),verified(被核实时正确的和最终的)。 -->  
    <status />  
  
</distributionManagement>  

5.4. 仓库配置

<!--发现依赖和扩展的远程仓库列表。 -->  
<repositories>  
  
    <!--包含需要连接到远程仓库的信息 -->  
    <repository>  
  
        <!--如何处理远程仓库里发布版本的下载 -->  
        <releases>  
  
            <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->  
            <enabled />  
  
            <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。 -->  
            <!--这里的选项是:always(一直),daily(默认,每日), -->  
            <!--interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->  
            <updatePolicy />  
  
            <!--当Maven验证构件校验文件失败时该怎么做: -->  
            <!--ignore(忽略),fail(失败),或者warn(警告)。 -->  
            <checksumPolicy />  
  
        </releases>  
  
        <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置, -->  
        <!--POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。 -->  
        <!--例如,可能有人会决定只为开发目的开启对快照版本下载的支持 -->  
        <snapshots>  
            <enabled />  
            <updatePolicy />  
            <checksumPolicy />  
        </snapshots>  
  
        <!--远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库 -->  
        <id> repo-id </id>  
  
        <!--远程仓库名称 -->  
        <name> repo-name</name>  
  
        <!--远程仓库URL,按protocol://hostname/path形式 -->  
        <url>http://192.168.1.169:9999/repository/ </url>  
  
        <!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。 -->  
        <!--Maven 2为其仓库提供了一个默认的布局; -->  
        <!--然而,Maven1.x有一种不同的布局。 -->  
        <!--我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->  
        <layout> default</layout>  
  
    </repository>  
  
</repositories>  
  
<!--发现插件的远程仓库列表,这些插件用于构建和报表 -->  
<pluginRepositories>  
  
    <!--包含需要连接到远程插件仓库的信息.参见repositories/repository元素 -->  
    <pluginRepository />  
  
</pluginRepositories>  

5.5. profile配置

<!--在列的项目构建profile,如果被激活,会修改构建处理 -->  
<profiles>  
  
    <!--根据环境参数或命令行参数激活某个构建处理 -->  
    <profile>  
        <!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。 -->  
        <activation>  
  
            <!--profile默认是否激活的标识 -->  
            <activeByDefault>false</activeByDefault>  
  
            <!--activation有一个内建的java版本检测,如果检测到jdk版本与期待的一样,profile被激活。 -->  
            <jdk>1.7</jdk>  
  
            <!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。 -->  
            <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>  
        <id />  
        <build />  
        <modules />  
        <repositories />  
        <pluginRepositories />  
        <dependencies />  
        <reporting />  
        <dependencyManagement />  
        <distributionManagement />  
        <properties />  
    </profile>  

5.6. 报表配置

<!--描述使用报表插件产生报表的规范,特定的maven 插件能输出相应的定制和配置报表. -->  
<!--当用户执行“mvn site”,这些报表就会运行,在页面导航栏能看到所有报表的链接。 -->  
<reporting>  
  
    <!--true,则网站不包括默认的报表。这包括“项目信息”菜单中的报表。 -->  
    <excludeDefaults />  
  
    <!--所有产生的报表存放到哪里。默认值是${project.build.directory}/site。 -->  
    <outputDirectory />  
  
    <!--使用的报表插件和他们的配置。 -->  
    <plugins>  
  
        <plugin>  
            <groupId />  
            <artifactId />  
            <version />  
            <inherited />  
            <configuration>  
                <links>  
                    <link>http://java.sun.com/j2se/1.5.0/docs/api/</link>  
                </links>  
            </configuration>  
            <!--一组报表的多重规范,每个规范可能有不同的配置。 -->  
            <!--一个规范(报表集)对应一个执行目标 。例如,有1,2,3,4,5,6,7,8,9个报表。 -->  
            <!--1,2,5构成A报表集,对应一个执行目标。2,5,8构成B报表集,对应另一个执行目标 -->  
            <reportSets>  
  
                <!--表示报表的一个集合,以及产生该集合的配置 -->  
                <reportSet>  
  
                    <!--报表集合的唯一标识符,POM继承时用到 -->  
                    <id>sunlink</id>  
  
                    <!--产生报表集合时,被使用的报表的配置 -->  
                    <configuration />  
  
                    <!--配置是否被继承到子POMs -->  
                    <inherited />  
  
                    <!--这个集合里使用到哪些报表 -->  
                    <reports>  
                        <report>javadoc</report>  
                    </reports>  
  
                </reportSet>  
  
            </reportSets>  
  
        </plugin>  
  
    </plugins>  
  
</reporting>     

5.7. 环境配置

<!--项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为 jira -->  
<issueManagement>  
  
    <!--问题管理系统(例如jira)的名字, -->  
    <system> jira </system>  
  
    <!--该项目使用的问题管理系统的URL -->  
    <url> http://jira.clf.com/</url>  
  
</issueManagement>  
  
<!--项目持续集成信息 -->  
<ciManagement>  
  
    <!--持续集成系统的名字,例如continuum -->  
    <system />  
  
    <!--该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。 -->  
    <url />  
  
    <!--构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告) -->  
    <notifiers>  
  
        <!--配置一种方式,当构建中断时,以该方式通知用户/开发者 -->  
        <notifier>  
  
            <!--传送通知的途径 -->  
            <type />  
  
            <!--发生错误时是否通知 -->  
            <sendOnError />  
  
            <!--构建失败时是否通知 -->  
            <sendOnFailure />  
  
            <!--构建成功时是否通知 -->  
            <sendOnSuccess />  
  
            <!--发生警告时是否通知 -->  
            <sendOnWarning />  
  
            <!--不赞成使用。通知发送到哪里 -->  
            <address />  
  
            <!--扩展配置项 -->  
            <configuration />  
  
        </notifier>  
  
    </notifiers>  
  
</ciManagement>  

5.8. 项目信息配置

<!--项目的名称, Maven产生的文档用 -->  
<name>banseon-maven </name>  
  
<!--项目主页的URL, Maven产生的文档用 -->  
<url>http://www.clf.com/ </url>  
  
<!--项目的详细描述, Maven 产生的文档用 -->  
<description>A maven project to study maven. </description>  
  
<!--描述了这个项目构建环境中的前提条件。 -->  
<prerequisites>  
  
    <!--构建该项目或使用该插件所需要的Maven的最低版本 -->  
    <maven />  
  
</prerequisites>  
  
<!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。 -->  
<inceptionYear />  
  
<!--项目相关邮件列表信息 -->  
<mailingLists>  
  
    <!--该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。 -->  
    <mailingList>  
  
        <!--邮件的名称 -->  
        <name> Demo </name>  
  
        <!--发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->  
        <post> clf@126.com</post>  
  
        <!--订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->  
        <subscribe> clf@126.com</subscribe>  
  
        <!--取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->  
        <unsubscribe> clf@126.com</unsubscribe>  
  
        <!--你可以浏览邮件信息的URL -->  
        <archive> http:/hi.clf.com/</archive>  
  
    </mailingList>  
  
</mailingLists>  
  
<!--项目开发者列表 -->  
<developers>  
  
    <!--某个项目开发者的信息 -->  
    <developer>  
  
        <!--SCM里项目开发者的唯一标识符 -->  
        <id> HELLO WORLD </id>  
  
        <!--项目开发者的全名 -->  
        <name> banseon </name>  
  
        <!--项目开发者的email -->  
        <email> banseon@126.com</email>  
  
        <!--项目开发者的主页的URL -->  
        <url />  
  
        <!--项目开发者在项目中扮演的角色,角色元素描述了各种角色 -->  
        <roles>  
            <role> Project Manager</role>  
            <role>Architect </role>  
        </roles>  
  
        <!--项目开发者所属组织 -->  
        <organization> demo</organization>  
  
        <!--项目开发者所属组织的URL -->  
        <organizationUrl>http://hi.clf.com/ </organizationUrl>  
  
        <!--项目开发者属性,如即时消息如何处理等 -->  
        <properties>  
            <dept> No </dept>  
        </properties>  
  
        <!--项目开发者所在时区, -11到12范围内的整数。 -->  
        <timezone> -5</timezone>  
  
    </developer>  
  
</developers>  
  
<!--项目的其他贡献者列表 -->  
<contributors>  
  
    <!--项目的其他贡献者。参见developers/developer元素 -->  
    <contributor>  
        <name />  
        <email />  
        <url />  
        <organization />  
        <organizationUrl />  
        <roles />  
        <timezone />  
        <properties />  
    </contributor>  
  
</contributors>  
  
<!--该元素描述了项目所有License列表。应该只列出该项目的license列表,不要列出依赖项目的license列表。 -->  
<!--如果列出多个license,用户可以选择它们中的一个而不是接受所有license。 -->  
<licenses>  
  
    <!--描述了项目的license,用于生成项目的web站点的license页面,其他一些报表和validation也会用到该元素。 -->  
    <license>  
  
        <!--license用于法律上的名称 -->  
        <name> Apache 2 </name>  
  
        <!--官方的license正文页面的URL -->  
        <url>http://www.clf.com/LICENSE-2.0.txt </url>  
  
        <!--项目分发的主要方式: repo,可以从Maven库下载 manual, 用户必须手动下载和安装依赖 -->  
        <distribution> repo</distribution>  
  
        <!--关于license的补充信息 -->  
        <comments> Abusiness-friendly OSS license </comments>  
  
    </license>  
  
</licenses>  
  
<!--SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。 -->  
<scm>  
  
    <!--SCM的URL,该URL描述了版本库和如何连接到版本库。欲知详情,请看SCMs提供的URL格式和列表。该连接只读。 -->  
    <connection>scm:svn:http://svn.baidu.com/banseon/maven/</connection>  
  
    <!--给开发者使用的,类似connection元素。即该连接不仅仅只读 -->  
    <developerConnection>scm:svn:http://svn.baidu.com/banseon/maven/  
    </developerConnection>  
  
    <!--当前代码的标签,在开发阶段默认为HEAD -->  
    <tag />  
  
    <!--指向项目的可浏览SCM库(例如ViewVC或者Fisheye)的URL。 -->  
    <url> http://svn.baidu.com/banseon</url>  
  
</scm>  
  
<!--描述项目所属组织的各种属性。Maven产生的文档用 -->  
<organization>  
  
    <!--组织的全名 -->  
    <name> demo </name>  
  
    <!--组织主页的URL -->  
    <url> http://www.clf.com/</url>  
  
</organization>   

5.9. maven依赖范围

scope 编译 测试 运行
compile Y Y Y
test   Y  
provided Y Y  
runtime   Y Y
system Y Y  

5.10. maven继承(重点)

当一个Java项目包含多个maven模块时,往往多个模块有相同的groupId、version,或者有相同的依赖,为了减少pom文件的配置,跟我们的项目中类的继承一样,在父工程中配置了pom,子项目中的pom可以继承

当一个父项目下的多个模块中有相同的依赖时,我们可以将这些依赖提取出来,统一在父POM中声明,这样可以简化子模块的配置,但是这样还是存在问题,当想在父项目中加入一些,不需要这么多依赖的模块,如果让这个模块也依赖那些不需要的依赖,显然不合理。

Maven提供的dependentcyManagement元素,其下的依赖声明既不会给项目引入依赖,也不会给它的子模块引入依赖,就是定义了依赖的版本,对版本进行统一管理,避免发生多个子模块使用依赖版本不一致的情况,降低依赖冲突的几率

dependencyManagement声明的依赖真正地引入到项目中是在子项目的pom文件中进行定义声明的

5.11. maven聚合(重点)

把整个项目的所有模块聚合到一起

  <parent>
        <artifactId>e3-parent</artifactId>
        <groupId>cn.e3mall</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    
    <artifactId>cn-manager</artifactId>

    <modules>
        <module>e3-manager-pojo</module>
        <module>e3-manager-dao</module>
        <module>e3-manager-interface</module>
        <module>e3-manager-service</module>
        <module>e3-manager-web</module>
    </modules>
    <packaging>pom</packaging>

一个特殊的地方就是packaging,其值为pom,如果没有声明的话,默认为jar,对于聚合模块来说,其打包方式必须为pom,否则无法构建。

modules里的每一个module都可以用来指定一个被聚合模块,这里每个module的值都是一个当前pom的相对位置。

5.12. 常用标签


<project> 标签: pom.xml 文件的根元素,它包含了整个项目的配置信息。

<modelVersion> 标签: 指定 POM 文件所使用的项目对象模型(Project Object Model)的版本号。在当前版本的 Maven 中,POM 模型的版本号为 4.0.0。

<parent> 标签: 指定当前项目的父项目,它通常用于继承父项目的配置和依赖项。

<groupId> 标签: 指定项目的组 ID,通常使用倒置的域名(例如 com.example)。

<artifactId> 标签: 指定项目的 artifact ID,通常是项目名称的小写形式(例如 my-project)。

<version> 标签: 指定项目的版本号,通常使用 Semantic Versioning 规范(例如 1.0.0)。

<name> 标签: 指定项目的人类可读名称。

<description> 标签: 指定项目的描述信息,通常是一个简短的描述,用于描述项目的目的和功能。

<packaging> 标签: 指定项目的打包类型,通常是 jar 或 war、pom

<properties> 标签: 指定项目的属性,可以在项目中通过 ${propertyName} 的形式来引用这些属性。


<dependencyManagement> 标签用于统一管理项目的依赖版本号和依赖范围,避免版本冲突。它可以让子模块继承父模块的依赖信息。这个标签通常被放在父项目的 pom.xml 文件中,子项目可以通过继承父项目的 pom.xml 文件来继承父项目的 <dependencyManagement> 标签中定义的依赖版本号和依赖范围。

<dependencies> 标签用于指定项目的依赖列表,其中每个依赖项都是通过一个 <dependency> 标签来定义的。这个标签通常被放在项目的 pom.xml 文件中,用于声明项目的依赖,以便 Maven 能够自动下载所需的依赖并将其添加到项目构建路径中。

<dependency> 标签用于定义一个具体的依赖项,包括依赖的组织、名称、版本号、依赖范围等信息。这个标签通常被定义在 <dependencies> 标签内部,用于声明项目的具体依赖。

<dependency> 标签中的 <scope> 元素: 指定依赖项的作用域,例如 compile、test、provided 等。

<exclusions> 标签: 在依赖项中排除一些不需要的传递性依赖项。

<exclusion> 标签用于排除传递性依赖中的某些依赖项。在 Maven 项目中,一个依赖项可能会依赖其他的依赖项,这些依赖项被称为传递性依赖。


<modules> 标签: 指定项目的模块,通常用于多模块项目中,每个模块都用一个 <module> 标签来描述。


<build> 标签: 指定项目的构建选项。其中包括源代码目录、资源目录、构建插件等信息。

<plugins> 标签: 指定项目所使用的 Maven 插件。每个插件都用 <plugin> 标签来描述,其中包括插件的组 ID、artifact ID 和版本号等信息。


<distributionManagement> 标签用于指定项目的发布配置信息,包括发布到哪个仓库、以何种方式发布。包含两个子元素 <repository><snapshotRepository>,分别用于配置正式版本和快照版本的发布仓库信息。


<repositories> 标签: 指定项目所使用的远程仓库。每个远程仓库都用

<repository> 标签来描述,其中包括仓库的 URL 和 ID 等信息。

<repository> 标签中的 <snapshots> 元素: 指定是否从远程仓库下载快照版本的依赖项。


<pluginRepositories> 标签指定项目中使用的插件仓库


<profiles> 标签: 指定项目的配置文件。每个配置文件都用 <profile> 标签来描述,其中包括配置文件的 ID、激活条件等信息。

标准模板

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">  
  
    <!--  POM 模型的版本号 -->  
    <modelVersion>4.0.0</modelVersion>  
  
    <!-- 指定当前项目的父项目,用于自动继承父项目的依赖项、插件、资源等配置信息-->  
    <parent>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-parent</artifactId>  
        <version>2.7.14</version>  
        <relativePath/> <!-- lookup parent from repository -->  
    </parent>  
  
    <groupId>com.yatoil</groupId>  
    <artifactId>yt-dorm</artifactId>  
    <version>0.0.1-SNAPSHOT</version>  
    <!-- 设置 pom,代表打包类型为 pom -->    <packaging>pom</packaging>  
  
    <description>yt-dorm project for Spring Boot</description>  
  
    <!-- 指定项目的属性,可以在项目中通过 ${propertyName} 的形式来引用这些属性 -->  
    <properties>  
        <yt-dorm.version>1.0</yt-dorm.version>  
        <swagger.version>2.9.2</swagger.version>  
        <jwt.version>0.9.1</jwt.version>  
        <java.version>1.8</java.version>  
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
    </properties>  
  
    <dependencyManagement>  
        <dependencies>  
  
            <!-- Swagger2 -->  
            <dependency>  
                <groupId> io.springfox</groupId>  
                <artifactId>springfox-swagger2</artifactId>  
                <version>${swagger.version}</version>  
                <!-- 排除传递性依赖  
                <exclusions>                    <exclusion>                        <groupId>io.swagger</groupId>                        <artifactId>swagger-models</artifactId>                    </exclusion>                    <exclusion>                        <groupId>io.swagger</groupId>                        <artifactId>swagger-annotations</artifactId>                    </exclusion>                </exclusions> -->            </dependency>  
            <dependency>  
                <groupId>io.springfox</groupId>  
                <artifactId>springfox-swagger-ui</artifactId>  
                <version>${swagger.version}</version>  
            </dependency>  
  
            <!-- jjwt生成token -->  
            <dependency>  
                <groupId>io.jsonwebtoken</groupId>  
                <artifactId>jjwt</artifactId>  
                <version>${jwt.version}</version>  
            </dependency>  
  
            <!-- web服务入口 -->  
            <dependency>  
                <groupId>com.yatoil</groupId>  
                <artifactId>dorm-admin</artifactId>  
                <version>${yt-dorm.version}</version>  
            </dependency>  
  
            <!-- 通用工具模块 -->  
            <dependency>  
                <groupId>com.yatoil</groupId>  
                <artifactId>dorm-common</artifactId>  
                <version>${yt-dorm.version}</version>  
            </dependency>  
  
            <!-- 宿舍管理模块 -->  
            <dependency>  
                <groupId>com.yatoil</groupId>  
                <artifactId>dorm-dormitory</artifactId>  
                <version>${yt-dorm.version}</version>  
            </dependency>  
  
        </dependencies>  
    </dependencyManagement>  
  
  
    <!-- 指定项目的子模块 -->  
    <modules>  
        <module>dorm-admin</module>  
        <module>dorm-common</module>  
        <module>dorm-dormitory</module>  
    </modules>  
  
    <!-- 指定项目的构建选项。源代码目录、资源目录、构建插件等信息 -->  
    <build>  
        <!-- 指定项目所使用的 Maven 插件 -->  
        <plugins>  
            <!-- 插件功能:用于编译项目源码并生成对应的字节码文件 -->  
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-compiler-plugin</artifactId>  
                <version>3.1</version>  
                <configuration>  
                    <source>${java.version}</source>  
                    <target>${java.version}</target>  
                    <encoding>${project.build.sourceEncoding}</encoding>  
                </configuration>  
            </plugin>  
        </plugins>  
    </build>  
  
    <!-- 指定了项目的发布配置信息,包括发布到哪个仓库、以何种方式发布 -->  
    <distributionManagement>  
        <repository>  
            <id>nexus-releases</id>  
            <name>Nexus Release Repository</name>  
            <url>http://library.yatoil.com:8081/repository/maven-releases/</url>  
        </repository>  
        <snapshotRepository>  
            <id>nexus-snapshots</id>  
            <name>Nexus Snapshot Repository</name>  
            <url>http://library.yatoil.com:8081/repository/maven-snapshots/</url>  
        </snapshotRepository>  
    </distributionManagement>  
  
    <!-- 指定项目所使用的远程仓库 -->  
    <repositories>  
  
        <!-- 公司内部仓库 -->  
        <repository>  
            <id>nexus</id>  
            <name>Nexus Repository</name>  
            <url>http://library.yatoil.com:8081/repository/maven-public/</url>  
            <snapshots>  
                <enabled>true</enabled>  
            </snapshots>  
            <releases>  
                <enabled>true</enabled>  
            </releases>  
        </repository>  
  
        <!-- 阿里云仓库 -->  
        <repository>  
            <id>aliyun-repos</id>  
            <name>Aliyun Repository</name>  
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
            <releases>  
                <enabled>true</enabled>  
            </releases>  
            <snapshots>  
                <enabled>false</enabled>  
            </snapshots>  
        </repository>  
    </repositories>  
  
    <!-- 指定项目中使用的插件仓库 -->  
    <pluginRepositories>  
        <pluginRepository>  
            <id>nexus</id>  
            <name>Nexus Plugin Repository</name>  
            <url>http://library.yatoil.com:8081/repository/maven-public/</url>  
            <snapshots>  
                <enabled>true</enabled>  
            </snapshots>  
            <releases>  
                <enabled>true</enabled>  
            </releases>  
        </pluginRepository>  
  
        <pluginRepository>  
            <id>aliyun-repos</id>  
            <name>Aliyun Repository</name>  
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
            <releases>  
                <enabled>true</enabled>  
            </releases>  
            <snapshots>  
                <enabled>false</enabled>  
            </snapshots>  
        </pluginRepository>  
    </pluginRepositories>  
  
</project>



本站总访问量