Maven的安装与配置
安装参考:
https://maven.apache.org/index.html
先介绍一个命令:
mvn help:system
打印出所有java的系统属性和环境变量
设置HTTP代理
镜像仓库
为了满足一些复杂的需求,Maven还支持更高级的镜像配置,一下做一些简要说明
<!-- 匹配所有远程仓库 -->
<mirrorOf>*</mirrorOf>
<!-- 匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库 -->
<mirrorOf>external:*</mirrorOf>
<!-- 匹配仓库repo1和repo2,使用逗号分隔多个远程仓库 -->
<mirrorOf>repo1,repo2</mirrorOf>
<!-- 匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除 -->
<mirrorOf>*,!repo1</miiroOf>
需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件
<mirror>
<id>nexus-aliyun</id>
<!--<mirrorOf>*</mirrorOf>-->
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>ytx</id>
<mirrorOf>external:*</mirrorOf>
<name>迎创私有仓库</name>
<!--<url>http://115.236.173.156:8888/nexus/content/groups/public/</url>-->
<url>http://115.236.173.156:8888/nexus/content/repositories/snapshots/</url>
</mirror>
<mirror>
<id>mvn_search_thirdparty1</id>
<mirrorOf>repo1</mirrorOf>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<mirror>
<id>mvn_search_thirdparty2</id>
<mirrorOf>repo2</mirrorOf>
<url>http://nexus.mvnsearch.org/content/repositories/thirdparty/</url>
</mirror>
<mirror>
<id>mvn_search</id>
<name>mvn Central</name>
<url>http://nexus.mvnsearch.org/content/groups/public/</url>
<mirrorOf>repo3</mirrorOf>
</mirror>
<mirror>
<id>spring_release</id>
<name>repo4</name>
<url>https://repo.spring.io/release</url>
<mirrorOf>repo4</mirrorOf>
</mirror>
生命周期
maven拥有三套独立的生命周期,分别是clean、default、site
- clean:清理项目
- default:构建项目
validate
compile:编译项目的主源码,源码将会放在tartget目录下面,编译在test之前
test-compile
test
package
install
deploy - site:建立项目站点
参考文档:
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
依赖优化
- 排除依赖
- 优化依赖
mvn dependency:list
- 归类依赖
#POM
POM全称是Project Object Model,即项目对象模型。pom.xml是maven的项目描述文件。pom.xml文件以xml的 形式描述项目的信息,包括项目名称、版本、项目id、项目的依赖关系、编译环境、持续集成、项目团队、贡献管理、生成报表等等。总之,它包含了所有的项目信息。
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 4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.codhttp://maven.apache.org/xsd/maven-ehaus.mojo</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<unitils.version>3.4.2</unitils.version>
<spring.version>4.3.7.RELEASE</spring.version>
<spring-boot.version>1.5.9.RELEASE</spring-boot.version>
<spring-cloud.version>Camden.SR5</spring-cloud.version>
<platform-bom.version>Brussels-RELEASE</platform-bom.version>
<spring-boot-admin.version>1.4.6</spring-boot-admin.version>
<!-- 设置版本 -->
<java.vesion>1.8</java.vesion>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<encoding>UTF-8</encoding>
<kotlin.version>1.1.50</kotlin.version>
</properties>
</project>
modelVersion 描述这个POM文件是遵从哪个版本的项目描述符。
groupId 针对一个项目的普遍唯一识别符。通常用一个完全正确的包的名字来与其他项目的类似名字来进行区分(比如:org.apache.maven)。
artifactId 在给定groupID 的group里面为artifact 指定的标识符是唯一的 , artifact 代表的是被制作或者被一个project应用的组件(产出物)。
version 当前项目产生的artifact的版本
以上4个元素缺一不可,其中groupId, artifactId, version描述依赖的项目唯一标志。
project是pom.xml的根节点,至于其它元素请参考POM Reference
POM很重要的3个关系
POM有3个很重要的关系:依赖、继承、合成。
依赖关系
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
<type>jar</type>
<optional>true</optional>
</dependency>
</dependencies>
- packaging 类型,定义值为 pom用于定义为parent和合成多个项目。 当然我们创建的maven项目的pom都继承maven的super pom, 如果想看项目(父或子)的完全的pom结构,可以运行:
mvn help:effective-pom
就可以了。 - type
对应于依赖工件的包装类型。这个默认为jar。虽然它通常表示依赖项的文件名的扩展,但并不总是这样。类型可以映射到不同的扩展名和分类器。这种类型通常与所使用的包装相对应,但也并非总是如此。一些示例是jar、ejb-client和test-jar。新类型可以通过将扩展设置为true的插件来定义,所以这不是一个完整的列表。
子项目配置
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mygroup</groupId>
<parent>
<groupId>com.mygroup</groupId>
<artifactId>my-child-project</artifactId>
</relativePath>
</parent>
</project>
- relativePath可以不需要,但是用于指明parent的目录,用于快速查询。
合成关系
一个项目有多个模块,也叫做多重模块,或者合成项目。 如下的定义
<project>
<module>my-child-project1<module>
<module>my-child-project2<module>
</project>
- 其中module 描述的是子项目的相对路径
dependencyManagement和Profile
版本的jar包就有两种判断途径:
-
如果dependencies里的dependency自己没有声明version元素,那么maven就
会倒dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果
没有就会报错,告诉你必须为dependency声明一个version -
如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。
-
Maven 还我们提供了一个dependencyManagement元素,用来提供了一种方式来统一依赖版本号。dependencyManagement元素一 般用在顶层的父POM。使用pom.xml中的dependencyManagement元素能让你在子项目中引用一个依赖而不用显式的列出版本号。 Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个 dependencyManagement元素中指定的版本号,这样就解决了修改依赖版本号不完全的问题。
-
Maven的Profile元素可以为一个特殊的环境自定义一个特殊的构建,使得不同环境间构建的可移植性成为可能。比如要使用 production profile来运行mvn install,你需要在命令行传入-Pproduction参数,这里production是profile的id。要验证production profile覆盖了默认的Compiler插件配置,可以像这样以开启调试输入(-X) 的方式运行Maven。
手工搭建一个archetype
- 手工搭建好一个完善的工程
- 进入工程目录,保留src和pom.xml,删除其他文件;
- 执行指令mvn archetype:create-from-project 此时会自动生成target目录;
- 执行指令cd target/generated-sourced/archetype 切换目录;
- 执行指令mvn install 那么一个archetype就安装到本地库,在Eclipse中就可以被选择用于构建项目
<groupId>com.ytx.xxx</groupId>
<artifactId>ytx-xxx-parent-archetype</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>maven-archetype</packaging>