是什么
maven是 软件项目管理(依赖管理,项目信息聚合) 和 自动构建的工具。基于项目对象模型的概念,maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven提供构建一个完整的生命周期框架。开发团队快速,简便完成基础工具建设,Maven使用标准的目录结构和默认构建生命周期。
下载与安装
官网下载http://maven.apache.org/,下载 Maven 的 zip 文件,解压目录为安装位置
配置Windows环境变量:
Maven 3.2 要求 JDK 1.6 或以上版本, 而 Maven 3.0/3.1 需要 JDK 1.5 或以上。
1 JDK配置:
路径为JDK的文件夹路径,假设你解压缩到文件夹 – D:\project Files\Java目录下(包括jdk文件名)
2 maven环境变量配置
添加 M2_HOME 和 MAVEN_HOME,值都为maven解压路径(包括文件名)
假设你解压缩到文件夹 – D:\software\yiibai.com\apache-maven
3 更新 PATH 变量
![ ](https://img-blog.csdnimg.cn/20190701183130132.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNTE2NjQ3,size_16,color_FFFFFF,t_70环境变量-Path-编辑-新建-添加 Maven bin ,如图: %M2_HOME%\bin()。
4 验证
在CMD命令行下输入 mvn –version
配置成功,如果有红色ERROR字体,可能是步骤出错了
5 文件目录内容
目录 | Value |
---|---|
根目录 | 存放 pom.xml和所有的子目录 |
/src/main/java | 项目的 java源代码 |
/src/main/resources | 项目的资源,比如说 property文件 |
/src/test/java | 项目的测试文件,如junit文件 |
/src/test/resources | 项目的测试的资源 |
6 jar包存放位置及 修改配置文件setting.xml
再标题五后执行的操作
创建jar包存放位置,如:d:/mvn/repo
修改配置文件,使创建文件夹生效,apache-maven-xxx\conf\settings.xml文件
修改localRepository 为
<localRepository>d:/mvn/repo</localRepository>
创建镜像,加快jar包下载速度
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
均在setting.xml文件内修改
完成maven环境配置
7 在cmd下对maven进行操作的常用指令
8 maven生命周期
maven生命周期:初始化-编译-测试-打包-验证-安装-部署
9 文件目录
创建maven文件,自动构建目录,在cmd命令行输入
mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.chinasofti.build -DartifactId=helloworld
com.chinasofti.build为项目名,maven 的 archetype 插件建立了一个 helloworld 目录,这个名字来自 artifactId 。
在这个目录下面,有一个 Project Object Model(POM) 文件 pom.xml 。这个文件用于描述项目,配置插件和管理依赖关系。
编译
mvn clean compile exec:java -Dexec.mainClass=“com.chinasofti.build.App”
这个时候, maven 在 helloworld 下面建立了一个新的目录 target/ ,构建打包后的 jar 文件 helloworld-1.0-SNAPSHOT.jar 就存放在这个目录下。
源代码和资源文件放在 src/main 下面,而测试代码和资源放在 src/test 下面。
Maven 已经为我们建立了一个 App.java 文件:
Java代码
package com.mycompany.helloworld;
/**
* Hello world!
*
*/
public class App {
public static void main( String[] args ) {
System.out.println( "Hello World!" );
}
}
10 基本概念-坐标
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<type>..</type>
<classifier>jdk15</classifier>
</dependency>
分别用来定位 1 项目名,2 子模块名 ,3 项目当前的版本 ,4 通常默认jar , 5(可选)用来定义构建输出与主构件对应的附属构件
11 依赖
依赖传递
Only compile and runtime scopes are transitive(只有编译和运行时依赖才能传递)
A->B->C
简单传递依赖:A->C
A->B-C(0.1)
A->C(0.2)
最短路径优先原则: A->C(0.2)
A->B->C(0.1)
A->E->C(0.2)
第一声明优先原则:最终依赖C(0.1)
依赖归类
原文:https://blog.csdn.net/cckevincyh/article/details/73512722
<spring.version>2.5</spring.version>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
这里简单使用到了Maven的属性,首先使用properties元素定义了Maven的属性,该例子中定义了一个spring.version子元素,其值为2.5,有了这个属性之后,Maven运行的时候,会将POM中所有 s p r i n g . v e r s i o n 替 换 成 2.5 , 也 就 是 说 , 可 以 使 用 {spring.version}替换成2.5,也就是说,可以使用 spring.version替换成2.5,也就是说,可以使用{}的方式来引用Maven的属性,然后将所有Spring依赖的版本值用这一属性引用。这个和在java中常量PI替换3.14是同样的道理,只是语法不同而已。
排除归类
原文:https://blog.csdn.net/cckevincyh/article/details/73512722
传递性依赖会给项目隐式地引入很多依赖,着极大简化了项目依赖的管理,但是有些时候这种特性也会带来问题。例如,当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另一个类库的SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会直接影响到当前的项目。这时就需要排除掉该SNAPSHOT,并且在当前项目中声明该类库的某个正式发布的版本。还有一些情况,你可能也想要替换掉某个传递性依赖,比如Sun JTA API,Hibernate依赖与这个JAR,但是由于版权的因素,该类库不在中央仓库中,而Apache Geronimo项目有一个对应的实现。这时你就可以排除Sun JAT API,而声明Geronimo的JTA API实现。
<groupId>com.cc.maven</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>com.cc.maven</groupId>
<artifactId>project-c</artifactId>
</exclusion>
</exclusions>
若A依赖于B,B依赖于C,想排除A的传递依赖,就可以这样做。
12 继承依赖
父maven项目中通过dependenciesManagement中定义公共依赖项
子maven项目中通过dependencies中定义公共依赖项
插件/properties都可以继承
13 maven jar包寻找顺序优先级(1-2-3-4)
1local -> private-> central 本地仓库
2local:localRepository in settings.xml 本地创建的磁盘仓库
3private:mirrors in settings.xml 镜像仓库
4central: Public Repositories in nexus maven云端仓库
14 Profile
参考https://www.jianshu.com/p/58f6c7808e8d
未深入学习,就不发表自己的意见了