写在前面
工作中一直都在使用MAVEN,现通过对网上的博文和官方的文档的学习、验证以及实际项目的使用,对POM的配置和使用进行了总结归纳。
用户指南
项目对象模型(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">
<!--
POM,(Project Object Model 项目对象模型)是Maven工程的基本工作单元,是一个XML文件,对应一个项目。
POM 包含了项目的基本信息,用于描述项目如何构建/声明项目依赖等等
groupId,组织的标识,通常是包路径: com.hadoopx.servicex
artifactId,工程标识,通常是工程名
-->
<!-- 描述项目描述符遵循的版本。声明项目描述符遵循哪一个POM模型版本,相对于Maven2及Maven3来说它只能是4.0.0。-->
<modelVersion>4.0.0</modelVersion>
<!-- 父项目坐标配置。无论是否显示的定义父项目,所有POM都会继承自一个父POM。如果项目中没有规定某个元素的值,则会使用父项目中定义的值。包括Group ID、Artifact ID和Version都会被未定义的子项目继承。-->
<parent>
<!-- 父项目的构件标识符 -->
<artifactId>kie-parent</artifactId>
<!-- 父项目的全球唯一标识符 -->
<groupId>org.kie</groupId>
<!-- 父项目的版本 -->
<version>7.61.0.Final</version>
<!-- 父项目的pom.xml文件的相对路径,用于查找该项目的父项目的POM文件,默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在relativePath位置,然后在本地仓库,最后在远程仓库寻找父项目的pom。 -->
<!-- <relativePath/>和<relativePath></relativePath>一样,都表示设置的pom.xml的路径为空,并不是默认值,所以该项目会从仓库中获取pom.xml,不从该项目的父项目的路径下获取-->
<relativePath/>
</parent>
<!-- 构件的标识符。它和group ID一起唯一标识一个构件,换句话说你不能有两个不同的项目拥有同样的artifact ID和groupID。在某个特定的group ID下,artifact ID也必须是唯一的,构件是由项目产生的或供项目使用,MAVEN产生的构件包括:JARS、源码、二进制发布包和WARS等。-->
<artifactId>drools-core</artifactId>
<!-- 项目的全球唯一标识符。通常使用全限定的包名来和其他项目进行区分,并且构建时生成的路径也是由groupId生成,如org.drools生成的相对路径为:/org/drools -->
<groupId>org.drools</groupId>
<!-- 项目产生的构件类型,默认是jar。构件类型包括jar、war、ear、pom、bundle。 bundle = jar + OSGi metadata-->
<!-- 在父级项目中的pom.xml文件使用的packaging配置一定为pom。父级的pom文件只用于项目的子模块的整合,在maven install时不会生成jar/war压缩包。 -->
<!-- jar: 将所有java文件都进行编译形成.class文件,且按照原来的java文件层级结构放置,最终压缩为一个jar文件,供其他服务或者工程引用的时候一般打成jar包,当然可直接通过jar命令直接启动程序,如springboot的服务.
将src/main/java和src/main/resources下的所有文件经打包,在打包的时候会自动生成MATA-INF文件夹,用于存储maven的pom信息和MANIFEST.MF文件
传统JAR和SpringBoot的JAR的区别是:SpringBoot的JAR多了BOOT-INFO/lib目录,里面存放了该JAR包的依赖JAR文件
-->
<!-- war: 将所有java文件都进行编译形成.class文件,且按照原来的java文件层级结构放置,最终压缩为一个war文件,不同的是它会将项目中依赖的所有jar包都放在WEB-INF/lib这个文件夹下,常见于通过web容器部署的时候,如Tomcat
一个WAR文件代表了一个Web应用程序,它可以包含 Servlet、HTML页面、Java类、图像文件,以及组成Web应用程序的其他资源,而不仅仅是类的归档文件
-->
<packaging>jar</packaging>
<!-- 项目当前版本,格式为: 主版本.次版本.增量版本-限定版本号 -->
<version>1.0.0-SNAPSHOT</version>
<!-- 项目的名称 -->
<name>mallx</name>
<!-- 项目主页的URL -->
<url>http://www.hadoopx.cn/mallx</url>
<!-- 项目的详细描述 -->
<description>一个基于SpringBoot的、包含小程序和后端管理的、开源的在线商城.</description>
<!-- 项目构建环境的前提条件,在pom4.0中,唯一的首要条件是maven元素-->
<prerequisites>
<!--构建该项目或使用该插件所需要的Maven的最低版本-->
<maven/>
</prerequisites>
<!-- 项目创建年份。四位数字,当产生版权信息时需要使用这个值。-->
<inceptionYear/>
<!-- 项目使用的问题管理系统相关信息(Redmine、Bugzilla、Jira、Scarab,或任何你喜欢的问题管理系统),主要用于和BUG管理系统对接-->
<issueManagement>
<!-- 问题管理系统的名字 -->
<system>MALLX-JIRA</system>
<!-- 问题管理系统的URL -->
<url>http://mallx.jira.com</url>
</issueManagement>
<!-- 项目持续集成相关信息,用于和持续集成管理系统对接 -->
<ciManagement>
<!-- 项目持续集成的名字 -->
<system/>
<!-- 项目持续集成的URL -->
<url/>
<!-- 构建完成时需要通知的开发者/用户的配置项,包括信息和状态(错误/失败/成功/警告)-->
<notifiers>
<!-- 配置通知方式。当构建中断时,以该方式通知用户/开发者-->
<notifier>
<!-- 传送通知的途径 -->
<type/>
<!-- 发生错误时是否通知-->
<sendOnError/>
<!-- 构建失败时是否通知 -->
<sendOnFailure/>
<!-- 构建成功时是否通知 -->
<sendOnSuccess/>
<!-- 发生警告时是否通知 -->
<sendOnWarning/>
<!-- 通知发送到哪里 -->
<address/>
<!-- 其他扩展配置项 -->
<configuration/>
</notifier>
</notifiers>
</ciManagement>
<!-- 项目相关邮件信息 -->
<mailingLists>
<!-- 该元素描述了项目相关的所有邮件列表 -->
<mailingList>
<!-- 邮件的名称 -->
<name>MALLX-LIST</name>
<!-- 发送邮件的地址或链接 -->
<post>mallx@163.com</post>
<!-- 订阅邮件的地址或链接 -->
<subscribe>mallx-admin@163.com</subscribe>
<!-- 取消订阅邮件的地址或链接 -->
<unsubscribe>mallx-user@163.com</unsubscribe>
<!-- 可以浏览邮件信息的URL -->
<archive>http://mallx.com/admin/mallx/dev/</archive>
</mailingList>
</mailingLists>
<!-- 项目开发者-committer相关信息 -->
<developers>
<!-- 某个项目开发者的信息 -->
<developer>
<!-- 项目开发者在SCM中的唯一标识符 -->
<id>mallx001</id>
<!-- 项目开发者的全名 -->
<name>张三</name>
<!-- 项目开发者的邮箱-->
<email>zhangsan@163.com</email>
<!-- 项目开发者主页的URL-->
<url/>
<!-- 项目开发者在项目中扮演的角色-->
<roles>
<role>Project Manager</role>
<role>Architect</role>
</roles>
<!-- 项目开发者所属组织 -->
<organization>dev</organization>
<!-- 项目开发者所属组织的URL -->
<organizationUrl>http://hi.mallx.com/zhangsan</organizationUrl>
<!-- 项目开发者属性等 -->
<properties>
<dept>Yes</dept>
</properties>
<!-- 项目开发者所在时区,-11到12范围内的整数 -->
<timezone>8</timezone>
</developer>
</developers>
<!--项目贡献者-contributor列表相关信息-->
<contributors>
<contributor>
<name/>
<email/>
<url/>
<organization/>
<organizationUrl/>
<roles/>
<timezone/>
<properties/>
</contributor>
</contributors>
<!-- 描述项目采用的开源协议是什么 -->
<licenses>
<!--描述了项目的License,用于生成项目的WEB站点的License页面 -->
<license>
<!-- License用于法律上的名称 -->
<name>Apache License,Version 2.0</name>
<!-- 官方的license正文页面的URL -->
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<!-- 项目分发的主要方式(repo-可以从Maven库下载;manual-用户必须手动下载和安装依赖)-->
<distribution>repo</distribution>
<!-- 关于license的补充信息 -->
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
<!-- SCM(Source Control Management)描述项目代码库相关的配置信息 -->
<scm>
<!-- SCM的URL,该连接只读 -->
<connection>scm:git:https://github.com:kiegroup/drools.git</connection>
<!-- 给开发者使用的,类似connection元素,该连接不仅仅只读 -->
<developerConnection>scm:git:git@github.com:kiegroup/drools.git</developerConnection>
<!-- 当前代码的标签,在开发阶段默认为HEAD-->
<tag></tag>
<!-- 指向项目的可浏览SCM库的URL -->
<url>https://github.com/kiegroup/drools</url>
</scm>
<!-- 项目所属组织相关信息-->
<organization>
<!-- 组织的全名 -->
<name>KIE-GROUP</name>
<!-- 组织主页的URL -->
<url>https://www.drools.org/</url>
</organization>
<!-- 该项目包含的所有子模块
<modules>标签可以整合子模块的编译顺序,将更加底层的模块放在更前面的位置
-->
<modules>
<module>kie-memory-compiler</module>
<module>drools-core-reflective</module>
<module>drools-core-dynamic</module>
<module>kie-test-util</module>
<module>drools-core</module>
<module>drools-ecj</module>
<module>drools-compiler</module>
<module>drools-mvel</module>
<module>drools-legacy-test-util</module>
<module>drools-serialization-protobuf</module>
<module>drools-beliefs</module>
<module>drools-traits</module>
<module>drools-ruleunit</module>
<module>drools-cdi</module>
<module>drools-verifier</module>
<module>drools-persistence</module>
<module>drools-templates</module>
<module>drools-decisiontables</module>
<module>drools-examples</module>
<module>kie-ci</module>
<module>kie-ci-osgi</module>
<module>drools-model</module>
<module>kie-dmn</module>
<module>kie-pmml</module>
<module>kie-pmml-trusty</module>
<module>drools-scorecards</module>
<module>drools-examples-api</module>
<module>drools-examples-cdi</module>
<module>drools-workbench-models</module>
<module>drools-test-coverage</module>
<module>drools-scenario-simulation</module>
<module>drools-metric</module>
<module>drools-alphanetwork-compiler</module>
<module>drools-engine</module>
<module>drools-engine-classic</module>
<module>drools-impact-analysis</module>
<module>drools-retediagram</module>
</modules>
<!-- 构建项目需要的信息-->
<build>
<!-- 项目源码目录。当构建项目的时候,构建系统会编译目录里的源码,该路径是相对于pom.xml的相对路径。-->
<sourceDirectory/>
<!-- 项目脚本源码目录。该目录和源码目录不同,绝大多数情况下,该目录下的内容会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。-->
<scriptSourceDirectory/>
<!-- 项目单元测试使用的源码目录 -->
<testSourceDirectory/>
<!-- 被编译过的应用程序CLASS文件存放的目录 -->
<outputDirectory/>
<!-- 被编译过的测试程序CLASS文件存放的目录 -->
<testOutputDirectory/>
<!-- 项目构建扩展-->
<extensions>
<!-- 描述使用到的构建扩展 -->
<extension>
<!-- 构建扩展的groupId -->
<groupId/>
<!-- 构建扩展的artifactId -->
<artifactId/>
<!-- 构建扩展的版本 -->
<version/>
</extension>
</extensions>
<!-- 当项目没有规定目标(Maven2 叫做阶段)时的默认值 -->
<defaultGoal/>
<!-- 项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里 -->
<resources>
<!-- 这个元素描述了项目相关或测试相关的所有资源路径 -->
<resource>
<!-- 描述了资源的目标路径 -->
<targetPath/>
<!-- 是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。-->
<filtering/>
<!-- 存放资源的目录 -->
<directory/>
<!-- 包含文件的模式列表(构件中包含哪些文件),例如**/*.xml -->
<includes/>
<!-- 排除文件的模式列表(构件中不包含哪些文件),例如**/*.log -->
<excludes/>
</resource>
</resources>
<!-- 单元测试相关的所有资源路径 -->
<testResources>
<testResource>
<targetPath/>
<filtering/>
<directory/>
<includes/>
<excludes/>
</testResource>
</testResources>
<!-- 构建产生的文件存放的目录-->
<directory/>
<!-- 生成的构件的文件名,默认值是${artifactId}-${version} -->
<finalName/>
<!-- 当filtering开关打开时,使用到的过滤器属性文件列表 -->
<filters/>
<!-- 声明项目可以引用的插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期 -->
<pluginManagement>
<!-- 声明的插件列表 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<!-- 是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。-->
<extensions/>
<!-- 在构建生命周期中执行一组目标的配置,每个目标可能有不同的配置。-->
<executions>
<!-- execution元素包含了插件执行需要的信息 -->
<execution>
<!-- 执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->
<id>make-assembly</id>
<!-- 绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->
<phase>package</phase>
<!-- 配置的执行目标 -->
<goals>
<goal>single</goal>
</goals>
<!-- 配置是否被传播到子POM -->
<inherited/>
<!-- 作为DOM对象的配置 -->
<configuration/>
</execution>
</executions>
<!--项目引入插件所需要的额外依赖-->
<dependencies>
<dependency>
</dependency>
</dependencies>
<!-- 任何配置是否被传播到子项目 -->
<inherited/>
<!-- 作为DOM对象的配置 -->
<configuration>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<!--使用的插件列表-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId/>
<artifactId/>
<version/>
<extensions/>
<executions>
<execution>
<id/>
<phase/>
<goals/>
<inherited/>
<configuration/>
</execution>
</executions>
<dependencies>
<dependency>
</dependency>
</dependencies>
<goals/>
<inherited/>
<configuration/>
</plugin>
</plugins>
</build>
<!-- 用于描述构建不同构件的配置 -->
<profiles>
<!-- 根据环境参数或命令行参数激活某个构建进行处理,可以配置多个profile -->
<profile>
<!-- 构建不同环境配置的唯一标识符,用于命令行激活,也用于在继承时合并具有相同标识符的profile。-->
<id/>
<!-- 用于指定激活方式,可以根据jdk环境,环境变量,文件的存在或缺失,自动触发profile的条件逻辑。
Activation是profile的开启钥匙,但并不是激活profile的唯一方式,在某些特定的环境中自动使用某些特定的值,这些环境通过activation元素指定。 -->
<activation>
<!-- 是否激活 -->
<activeByDefault/>
<!-- 通过JDK版本。当匹配的jdk被检测到时profile被激活,如,1.4激活JDK1.4、JDK1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。-->
<jdk/>
<!-- 通过OS信息。当匹配的操作系统属性被检测到时profile被激活。os元素可以定义一些操作系统相关的属性。-->
<os>
<!-- 激活profile的操作系统的名字 -->
<name>Windows10</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>
<!--构建项目所需要的信息-->
<build>
<defaultGoal/>
<resources>
<resource>
<targetPath/>
<filtering/>
<directory/>
<includes/>
<excludes/>
</resource>
</resources>
<testResources>
<testResource>
<targetPath/>
<filtering/>
<directory/>
<includes/>
<excludes/>
</testResource>
</testResources>
<directory/>
<finalName/>
<filters/>
<pluginManagement>
<plugins>
<plugin>
<groupId/>
<artifactId/>
<version/>
<extensions/>
<executions>
<execution>
<id/>
<phase/>
<goals/>
<inherited/>
<configuration/>
</execution>
</executions>
<dependencies>
<dependency/>
</dependencies>
<goals/>
<inherited/>
<configuration/>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId/>
<artifactId/>
<version/>
<extensions/>
<executions>
<execution>
<id/>
<phase/>
<goals/>
<inherited/>
<configuration/>
</execution>
</executions>
<dependencies>
<dependency/>
</dependencies>
<goals/>
<inherited/>
<configuration/>
</plugin>
</plugins>
</build>
<modules/>
<repositories>
<repository>
<releases>
<enabled/>
<updatePolicy/>
<checksumPolicy/>
</releases>
<snapshots>
<enabled/>
<updatePolicy/>
<checksumPolicy/>
</snapshots>
<id/>
<name/>
<url/>
<layout/>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<enabled/>
<updatePolicy/>
<checksumPolicy/>
</releases>
<snapshots>
<enabled/>
<updatePolicy/>
<checksumPolicy/>
</snapshots>
<id/>
<name/>
<url/>
<layout/>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency/>
</dependencies>
<reports/>
<reporting/>
<dependencyManagement>
<dependencies>
<dependency/>
</dependencies>
</dependencyManagement>
<distributionManagement>
</distributionManagement>
<properties/>
</profile>
</profiles>
<!-- 依赖和扩展的远程仓库列表相关信息 -->
<repositories>
<!-- 需要连接到远程仓库的信息 -->
<repository>
<!-- 远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库-->
<id>jboss-public-repository-group</id>
<!--远程仓库名称-->
<name>JBoss Public Repository Group</name>
<!--远程仓库URL,按protocol://hostname/path形式-->
<url>https://repository.jboss.org/nexus/content/groups/public/</url>
<!-- 用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2.x为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局,可以使用该元素指定布局是default(默认)还是legacy(遗留)。-->
<layout>default</layout>
<!-- 关于远程仓库里面发布版本下载的信息 -->
<releases>
<!-- true或者false表示该仓库是否开启下载某种类型构件(发布版,快照版) -->
<enabled>true</enabled>
<!-- 该元素指定更新发生的频率,Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
<updatePolicy>never</updatePolicy>
<!-- 当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告)。 -->
<checksumPolicy>ignore</checksumPolicy>
</releases>
<!-- 关于远程仓库里面快照版本下载的信息 -->
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
</repository>
</repositories>
<!-- 发现插件的远程仓库列表,这些插件用于构建和报表 -->
<pluginRepositories>
<!-- 包含需要连接到远程插件仓库的信息. -->
<pluginRepository>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<!--依赖的group ID-->
<groupId>org.apache.maven</groupId>
<!--依赖的artifact ID-->
<artifactId>maven-artifact</artifactId>
<!--依赖的版本号。 在Maven 2.x里也可以配置成版本号的范围。-->
<version>3.8.1</version>
<!-- 依赖类型,默认类型是jar -->
<type>jar</type>
<!-- 依赖的分类器。用于在同一个POM,生成不同构建方式的构件。如果要构建两个单独的构件成JAR,一个使用Java 1.7编译器,另一个使用Java 1.8编译器,可以使用分类器生成两个单独的JAR构件。-->
<classifier></classifier>
<!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来,依赖范围包含以下几种:
- compile: 作用在编译时,可以在生命周期的所有阶段使用,会随着项目一起发布;
- provided: 类似于编译,但支持你期待JDK或者容器提供,类似于classpath,不会随着项目一起发布;使用默认或其他时,会将依赖的项目打成jar包放入本项目的Lib里。
比如:我们开发一个web应用,在编译时我们需要依赖servlet-api.jar,但是在运行时我们不需要该 jar包,因为这个jar 包已由web服务器提供,如果在打包时又被加入进去,那么就可能产生冲突。此时我们就可以使用 provided 进行范围修饰。
- runtime: 作用在运行和测试时,不作用在编译时。在maven依赖中最常见的设置为runtime的依赖是JDBC,主要是由于jdbc中对驱动类的配置是采用反射的机制在配置文件中配置了classname
- test: 作用在测试时,不作用在运行时,不会随项目发布,如junit;
- system: 跟provided 相似,但是在系统中要以外部JAR包的形式提供,通过systemPath来取得,maven不会在repository查找它,不会随着项目一起发布;
- systemPath: 仅用于范围为system,提供相应的路径
- import: 只使用在<dependencyManagement>中,表示从其它的pom中导入dependency的配置,且仅用于type=pom的dependency
https://juejin.cn/post/6870758607659646983
- optional: 当项目自身被依赖时,标注依赖是否传递,用于连续依赖时使用-->
<scope>test</scope>
<!-- 仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径,需要绝对路径而不是相对路径,推荐使用属性匹配绝对路径,例如${java.home}。-->
<systemPath></systemPath>
<!-- 当计算传递依赖时,从依赖构件列表里,列出被排除的依赖构件集,告诉maven你只依赖指定的项目,不依赖该项目的依赖.有时我们引入的依赖中可能会包含一些不想要的依赖包,我们想引入自己想要的,这时就要用到排除依赖了。使用 <exclusion> 的时候只需要指定 groupId 和 artifactId 就行了,并不需要 version,因为 groupId 和 artifactId 就可以定位某种类型的依赖。-->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!-- 可选依赖。
如果你在项目B中把C依赖声明为可选true,那么如果项目A依赖于项目B,则项目A不会依赖项目C了,如果需要C的功能则需要,在项目A中显式的引用对项目C的依赖。
可选依赖可以阻断依赖的传递性。
-->
<optional>true</optional>
</dependency>
</dependencies>
<!-- 不赞成使用. 现在Maven忽略该元素. -->
<reports></reports>
<!-- 用于描述使用报表插件产生报表的规范,是对生成的项目站点内容的再丰富,生成报表的命令和生成项目站点的命令一致(mvn site),所以当用户执行“mvn site”,这些报表就会运行,在页面导航栏能看到所有插件生成的报表的链接 -->
<reporting>
<!-- true,则表示网站不包括默认的报表,只包括"项目信息"菜单中的报表. 默认是false, 包含默认的报表-->
<excludeDefaults/>
<!-- 报表存放目录。默认值是${project.build.directory}/site。-->
<outputDirectory/>
<!-- 使用的报表插件相关的配置 -->
<plugins>
<plugin>
<!--报表插件在仓库里的group ID-->
<groupId/>
<!--报表插件在仓库里的artifact ID-->
<artifactId/>
<!--被使用的报表插件的版本(或版本范围)-->
<version/>
<!--任何配置是否被传播到子项目-->
<inherited/>
<!--报表插件的配置-->
<configuration/>
<!--一组报表的多重规范,每个规范可能有不同的配置。一个规范(报表集)对应一个执行目标 。例如,有1,2,3,4,5,6,7,8,9个报表。1,2,5构成A报表集,对应一个执行目标。2,5,8构成B报表集,对应另一个执行目标-->
<reportSets>
<!--表示报表的一个集合,以及产生该集合的配置-->
<reportSet>
<!--报表集合的唯一标识符 -->
<id/>
<!-- 报表相关的配置-->
<configuration/>
<!-- 配置是否被继承到子POMs -->
<inherited/>
<!-- 这个集合里使用到哪些报表 -->
<reports/>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
<!-- 这部分定义的依赖信息不会被立即解析,而是当子项目声明一个依赖(group ID和artifact ID是必须定义的信息),如果group ID和artifact ID以外的一些信息没有定义,则通过group ID和artifact ID 匹配到这里的依赖,并使用这里定义的依赖信息。-->
<!--
<dependencyManagement>一般在父项目中出现,只用于声明依赖,并不会将依赖引入,也就是说子模块不会继承parent中dependencyManagement所有预定义的depandency,
只有当子模块在需要的时候按需引入即可.
使用dependencyManagement主要用于声明依赖,并统一管理项目中使用到的依赖的种类、版本,这样每个子项目就不会出现额外的依赖,也避免了多个依赖出现不同版本的冲突了。
所以,使用时需要在子项目中显式地声明需要用的依赖,如果不在子项目中声明依赖,子项目需要的依赖是不会从父项目中继承的。
如果在子项目中显示的声明了需要的依赖,但是未指定版本的话,version和scope都会继承父项目在dependencyManagement中定义的依赖版本和范围;
如果在子项目中指定了版本,则使用子项目指定的版本号。
但是,在<dependencies/>标签里的依赖是可以直接被子项目继承的,所有声明在<dependencies/>里的依赖都会在所有的子项目中被自动引入,
所以在parent中一般都严禁直接使用depandencys预定义依赖。
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-bom</artifactId>
<version>${version.org.kie}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.kie.soup</groupId>
<artifactId>kie-soup-bom</artifactId>
<version>${version.org.kie}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 项目生成的构件分发到远程仓库相关信息。当执行mvn deploy时将把网站或项目生成的构件分发到远程Maven仓库中,用distributionManagement来定义Maven分发构件的位置-->
<distributionManagement>
<!-- 分发发布版本的构件到远程仓库的中-->
<repository>
<uniqueVersion/>
<id>nexus-releases</id>
<name>Nexus Release Repository</name>
<url>http://10.0.16.10:18080/nexus/content/repositories/releases/</url>
<layout/>
</repository>
<!-- 分发快照版本的构件到远程仓库中。如果没有配置该元素,默认部署到repository元素配置的仓库 -->
<snapshotRepository>
<uniqueVersion/>
<id>nexus-snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://10.0.16.10:18080/nexus/content/repositories/snapshots/</url>
<layout/>
</snapshotRepository>
<!--部署项目的网站需要的信息-->
<site>
<!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置-->
<id>mallx-site</id>
<!--部署位置的名称-->
<name>business api website</name>
<!--部署位置的URL,按protocol://hostname/path形式-->
<url>scp://svn.mallx.com/mallx:/usr/local/mallx-parent-snapshot/web</url>
</site>
<!-- 项目构件下载的URL。主要用于定位那些不在仓库里的构件(由于license限制)。-->
<downloadUrl/>
<!-- 如果构件有了新的group ID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。-->
<!-- 使用场景是什么? 旧的group ID和artifact ID还可以使用吗? 在项目之初如何知道新的group ID和artifact ID? -->
<relocation>
<!--构件新的group ID-->
<groupId/>
<!--构件新的artifact ID-->
<artifactId/>
<!--构件新的版本号-->
<version/>
<!--显示给用户的,关于移动的额外信息,例如原因。-->
<message/>
</relocation>
<!-- 给出该构件在远程仓库的状态。该值是由Maven自动设置,无需人为设置,有效的值有:none(默认),converted(仓库管理员从 Maven 1 POM转换过来),partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部 署),verified(被核实时正确的和最终的)。-->
<status/>
</distributionManagement>
<!-- 属性标签, 用于定义常量、版本号等信息,Properties可以在整个POM中使用 -->
<properties>
<version.org.kie>7.61.0.Final</version.org.kie>
<skipTests>true</skipTests>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<fastjson.version>1.2.75</fastjson.version>
<commons.io.version>2.5</commons.io.version>
<geotools.version>20.0</geotools.version>
<compress.version>1.21</compress.version>
<surefire.forkCount>1</surefire.forkCount>
<alphanetworkCompilerEnabled>false</alphanetworkCompilerEnabled>
</properties>
</project>
MAVEN的属性
1. 内置/POM属性
序号 | 属性 | 类型 | 说明 |
---|---|---|---|
1 | ${basedir} | 内置属性 | 表示项目的根目录,也就是包含pom.xml文件的目录 |
2 | ${version} | 内置属性 | 表示项目的版本 |
3 | ${project.basedir} | POM属性 | 和${basedir}相同 |
4 | ${project.version} | POM属性 | 和${version}相同 |
5 | ${project.build.directory} | POM属性 | 表示构建目录,缺省为target |
6 | ${project.build.sourceEncoding} | POM属性 | 表示主源码的编码格式 |
7 | ${project.build.sourceDirectory} | POM属性 | 表示主源码路径 |
8 | ${project.build.finalName} | POM属性 | 表示输出文件名称,缺省为${project.artifactId}-${project.version}.${project.packaging},打包类型缺省为JAR |
9 | ${project.build.outputDirectory} | POM属性 | 表示构建过程输出目录,缺省为target/classes |
10 | ${project.XXX} | POM属性 | 表示当前POM文件的任意节点的内容 |
2. 自定义属性
用户可以在POM文件的元素下自定义MAVEN的属性:
...
<properties>
<rills.drools.version>7.61.0.Final</rills.drools.version>
</properties>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${rills.drools.version}</version>
</dependency>
</dependencies>
...
3. SETTING属性
用户可以引用settings.xml文件中XML元素的值,需要使用settings.开头,如:${settings.localRepository}表示指向用户本地仓库的地址。
4. JAVA系统属性以及环境变量属性
A. 用户可以使用当前JAVA系统的属性,如: ${user.home} 指向了用户目录。
B. 用户可以使用所有的环境变量的属性,需要使用env.开头,如: ${env.JAVA_HOE} 指向JDK的根目录。
5. 如何查看JAVA系统属性以及环境变量属性?
使用MAVEN的指令: mvn help:system
===============================================================================
System Properties
===============================================================================
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D:\Program Files (x86)\Java\jdk1.8.0_251\jre\bin
java.vm.version=25.251-b08
java.vm.vendor=Oracle Corporation
maven.multiModuleProjectDirectory=D:/04-gitee/rills-atlas-2.1.0-rc3
java.vendor.url=http://java.oracle.com/
path.separator=;
guice.disable.misplaced.annotation.check=true
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=D:/04-gitee/rills-atlas-2.1.0-rc3
java.runtime.version=1.8.0_251-b08
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\endorsed
os.arch=amd64
java.io.tmpdir=C:\Users\ROCKY\AppData\Local\Temp\
line.separator=
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 10
classworlds.conf=D:/Program Files (x86)/apache-maven-3.6.3/bin/m2.conf
sun.jnu.encoding=GBK
java.library.path=D:\Program Files (x86)\Java\jdk1.8.0_251\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\ROCKY\bin;D:\Program Files (x86)\Git\mingw64\bin;D:\Program Files (x86)\Git\usr\local\bin;D:\Program Files (x86)\Git\usr\bin;D:\Program Files (x86)\Git\usr\bin;D:\Program Files (x86)\Git\mingw64\bin;D:\Program Files (x86)\Git\usr\bin;C:\Users\ROCKY\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;D:\Program Files (x86)\Git\cmd;D:\Program Files (x86)\TortoiseSVN\bin;D:\Program Files (x86)\nodejs;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Users\ROCKY\AppData\Local\Microsoft\WindowsApps;D:\Program Files (x86)\Java\jdk1.8.0_251\bin;D:\Program Files (x86)\apache-maven-3.6.3\bin;C:\Users\ROCKY\AppData\Roaming\npm;D:\Program Files (x86)\Git\usr\bin\vendor_perl;D:\Program Files (x86)\Git\usr\bin\core_perl;.
maven.conf=D:/Program Files (x86)/apache-maven-3.6.3/conf
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=10.0
library.jansi.path=D:/Program Files (x86)/apache-maven-3.6.3/lib/jansi-native
user.home=C:\Users\ROCKY
user.timezone=Asia/Shanghai
java.awt.printerjob=sun.awt.windows.WPrinterJob
java.specification.version=1.8
file.encoding=GBK
user.name=ROCKY
java.class.path=D:/Program Files (x86)/apache-maven-3.6.3/boot/plexus-classworlds-2.6.0.jar
java.vm.specification.version=1.8
sun.arch.data.model=64
java.home=D:\Program Files (x86)\Java\jdk1.8.0_251\jre
sun.java.command=org.codehaus.plexus.classworlds.launcher.Launcher help:system
java.specification.vendor=Oracle Corporation
user.language=zh
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_251
java.ext.dirs=D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.boot.class.path=D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\resources.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\rt.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\sunrsasign.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\jsse.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\jce.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\charsets.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\jfr.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\classes
java.vendor=Oracle Corporation
maven.home=D:\Program Files (x86)\apache-maven-3.6.3
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64
===============================================================================
Environment Variables
===============================================================================
PSMODULEPATH=%ProgramFiles%\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
DISPLAY=needs-to-be-defined
COMMONPROGRAMW6432=C:\Program Files\Common Files
PROGRAMW6432=C:\Program Files
PROCESSOR_ARCHITECTURE=AMD64
PATH=C:\Users\ROCKY\bin;D:\Program Files (x86)\Git\mingw64\bin;D:\Program Files (x86)\Git\usr\local\bin;D:\Program Files (x86)\Git\usr\bin;D:\Program Files (x86)\Git\usr\bin;D:\Program Files (x86)\Git\mingw64\bin;D:\Program Files (x86)\Git\usr\bin;C:\Users\ROCKY\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;D:\Program Files (x86)\Git\cmd;D:\Program Files (x86)\TortoiseSVN\bin;D:\Program Files (x86)\nodejs;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Users\ROCKY\AppData\Local\Microsoft\WindowsApps;D:\Program Files (x86)\Java\jdk1.8.0_251\bin;D:\Program Files (x86)\apache-maven-3.6.3\bin;C:\Users\ROCKY\AppData\Roaming\npm;D:\Program Files (x86)\Git\usr\bin\vendor_perl;D:\Program Files (x86)\Git\usr\bin\core_perl
PROGRAMDATA=C:\ProgramData
MINGW_PREFIX=D:/Program Files (x86)/Git/mingw64
SHLVL=1
SYSTEMROOT=C:\WINDOWS
SHELL=D:\Program Files (x86)\Git\usr\bin\bash.exe
MSYSTEM_CHOST=x86_64-w64-mingw32
ORIGINAL_TEMP=C:/Users/ROCKY/AppData/Local/Temp
TMP=C:\Users\ROCKY\AppData\Local\Temp
HOSTNAME=LAPTOP-IFSVISPM
PROGRAMFILES(X86)=C:\Program Files (x86)
COMPUTERNAME=LAPTOP-IFSVISPM
OS=Windows_NT
MAVEN_HOME=D:/Program Files (x86)/apache-maven-3.6.3
WINDIR=C:\WINDOWS
PLINK_PROTOCOL=ssh
SYSTEMDRIVE=C:
=::=::\
ZES_ENABLE_SYSMAN=1
SSH_ASKPASS=D:/Program Files (x86)/Git/mingw64/libexec/git-core/git-gui--askpass
MSYSTEM_CARCH=x86_64
COMSPEC=C:\WINDOWS\system32\cmd.exe
DRIVERDATA=C:\Windows\System32\Drivers\DriverData
HOMEDRIVE=C:
LANG=zh_CN.UTF-8
LOGONSERVER=\\LAPTOP-IFSVISPM
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 142 Stepping 12, GenuineIntel
ACLOCAL_PATH=D:\Program Files (x86)\Git\mingw64\share\aclocal;D:\Program Files (x86)\Git\usr\share\aclocal
COMMONPROGRAMFILES=C:\Program Files\Common Files
PROGRAMFILES=C:\Program Files
COMMONPROGRAMFILES(X86)=C:\Program Files (x86)\Common Files
OLDPWD=D:/04-gitee/rills-atlas-2.1.0-rc3
MANPATH=D:\Program Files (x86)\Git\mingw64\local\man;D:\Program Files (x86)\Git\mingw64\share\man;D:\Program Files (x86)\Git\usr\local\man;D:\Program Files (x86)\Git\usr\share\man;D:\Program Files (x86)\Git\usr\man;D:\Program Files (x86)\Git\share\man
TEMP=C:\Users\ROCKY\AppData\Local\Temp
NUMBER_OF_PROCESSORS=8
USERDOMAIN=LAPTOP-IFSVISPM
INFOPATH=D:\Program Files (x86)\Git\usr\local\info;D:\Program Files (x86)\Git\usr\share\info;D:\Program Files (x86)\Git\usr\info;D:\Program Files (x86)\Git\share\info
HOME=C:\Users\ROCKY
TMPDIR=C:\Users\ROCKY\AppData\Local\Temp
PROCESSOR_LEVEL=6
PWD=D:/04-gitee/rills-atlas-2.1.0-rc3
USERNAME=ROCKY
MSYSTEM=MINGW64
CONFIG_SITE=D:/Program Files (x86)/Git/mingw64/etc/config.site
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
ORIGINAL_TMP=C:/Users/ROCKY/AppData/Local/Temp
USERDOMAIN_ROAMINGPROFILE=LAPTOP-IFSVISPM
PUBLIC=C:\Users\Public
PROCESSOR_REVISION=8e0c
USERPROFILE=C:\Users\ROCKY
APPDATA=C:\Users\ROCKY\AppData\Roaming
HOMEPATH=\Users\ROCKY
EXEPATH=D:\Program Files (x86)\Git
LOCALAPPDATA=C:\Users\ROCKY\AppData\Local
MINGW_PACKAGE_PREFIX=mingw-w64-x86_64
ORIGINAL_PATH=D:\Program Files (x86)\Git\mingw64\bin;D:\Program Files (x86)\Git\usr\bin;C:\Users\ROCKY\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;D:\Program Files (x86)\Git\cmd;D:\Program Files (x86)\TortoiseSVN\bin;D:\Program Files (x86)\nodejs;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Users\ROCKY\AppData\Local\Microsoft\WindowsApps;D:\Program Files (x86)\Java\jdk1.8.0_251\bin;D:\Program Files (x86)\apache-maven-3.6.3\bin;C:\Users\ROCKY\AppData\Roaming\npm
JAVA_HOME=D:/Program Files (x86)/Java/jdk1.8.0_251
ALLUSERSPROFILE=C:\ProgramData
PKG_CONFIG_PATH=D:\Program Files (x86)\Git\mingw64\lib\pkgconfig;D:\Program Files (x86)\Git\mingw64\share\pkgconfig
TERM=xterm
MAVEN_CMD_LINE_ARGS= help:system
MINGW_CHOST=x86_64-w64-mingw32
MSYSTEM_PREFIX=D:/Program Files (x86)/Git/mingw64
MAVEN_PROJECTBASEDIR=D:/04-gitee/rills-atlas-2.1.0-rc3