https://github.com/laker1/maven-learning-notes
一、Maven下载:http://maven.apache.org/download.cgi
二、插件目录结构:
bin目录:包含mvn的运行脚本,在命令行中用mvn可调用
boot目录:包含一个类加载器的框架,Maven使用它来加载主流类库
conf目录:配置文件目录,常用的有settings.xml
lib目录:依赖类库
三、配置环境变量:
M2_HOME:D:\JAVA\apache-maven-3.5.4
Path:%M2_HOME%\bin;
验证:命令行下输入:mvn -v
四、maven项目的目录结构:
src
-main
-java
-package
-test
-java
-package
resources
pom.xml
五、pom.xml文件
可采用struts的lib目录下struts2-core-2.2.3.jar包解压后的META-INF/maven/org.apache.struts/struts2-core/pom.xml文件作为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">
// 基本4要素
<modelVersion>4.0.0</modelVersion>
<groupId>com.imooc.maven01</groupId> // 项目的包名
<artifactId>maven01-model</artifactId> // 模块名
<version>0.0.1SNAPSHOT</version> // 版本名
<dependencies>
<dependency> // 从中央仓库添加junit依赖
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency> // 从本地仓库添加jar包依赖
<groupId>com.imooc.maven02</groupId>
<artifactId>maven02-model</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
六、常用命令
编译:mvn compile
测试:mvn test
打包:mvn package
删除:mvn clean 删除target(包含编译的字节码文件和测试报告),但不删除本地仓库
安装:mvn install 安装jar包到本地仓库中(包含了compile和package过程)
用插件生成maven项目目录结构:
方式一:mvn archetype:generate 自动生成maven目录结构(需按提示录入选项)
方式二:mvn archetype:generate -DgroupId=com.imooc.maven04 -DartifactId=maven04-demo -Dversion=0.0.1-SNAPSHOT -Dpackage=com.imooc.maven04.demo
groupId表示组织名(公司网址反写+项目名)
artifactId表示项目名(项目名-模块名)
version表示版本号
package代码所存在的包名
<!--设置镜像中央仓库为阿里云-->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>maven.net.cn</id>
<mirrorOf>central</mirrorOf>
<name>central mirror in china</name>
<url>http://maven.net.cn/content/groups/public</url>
</mirror>
七、maven中的坐标和仓库
构件:任何一个依赖、插件、项目构件输出都可以称之为构件,所有构件都通过坐标作为其唯一标识。
maven中,任何构件坐标都是由groupId、artifactId、version来唯一标识的
建议创建maven项目时,java的包名应该与pom.xml中groupId和artifactId命名相吻合
仓库:用来管理和存放所有项目的构件和依赖。可分两种:本地仓库和远程仓库(包括中央仓库和其它镜像仓库)
如果本地仓库找不到就会去中央仓库查找,查找到依赖就会下载到本地仓库供我们使用
一旦设置镜像仓库,所有对原仓库的访问都将转到镜像仓库访问,原默认仓库将不会再被访问
超级pom.xml:在maven的安装目录下/lib/maven-model-builder-3.5.4.jar包
解压后在 org\apache\maven\model 目录中有一个pom.xml,所有maven项目都会继承这个超级pom
它含有中央仓库的地址
更改本地仓库默认位置:
默认:【本地仓库目录 ———— c:/user/用户名/.m2/repository】
修改本地仓库默认位置方法:
在maven安装目录找到conf/settings.xml文件,添加修改如下:
<localRepository>D:/JAVA/repo</localRepository>
建议:将该文件修改后保存到本地仓库中,以防maven升级后设置被覆盖
八、eclipse配置Maven项目
preference->Java->Installed JREs选择自已下载的JDK
->Maven->Installations选择自己下载的Maven
->Maven->User Settings选择自已设置的目录(不一定要用在maven安装目录的conf下那个)
File->New->Maven Project新建一个maven项目
鼠标在项目的pom.xml文件上右键->Run As->Maven build...弹出框中:Goals框中输入命令 compile或package即可编译或生成包
九、maven三个生命周期
clean:清理项目
pre-clean clean post-clean
default:构建项目(最核心)
compile test package install
site:生成项目站点
pre-site site post-site site-deploy
十、关于maven插件示例:http://maven.apache.org/plugins/maven-source-plugin/
build中使用的插件是执行命令用的,也放在中央仓库中,其坐标定位方式和dependency一样
jar-no-fork主要用来创建项目的源码jar包,绑定到生命周期package后,运行package,调用目标,生成source.jar的源码包
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
★可能遇到的问题:参考 https://blog.csdn.net/lslk9898/article/details/73836745
1、Preference->Java->Installed JREs应选择jdk目录(不是jre目录)
2、Build Path->Configure Build Path->Libraries->JRE System Library
->"Edit"->Alternate JRE:选择第1步中的jdk目录
3、Maven->Update project(应该放在第2步,因为更新maven后,原第2步设置会被还原)
十一、pom.xml解析
<groupId></groupId>
<artifactId></artifactId>
<version></version> // 大版本号.分支版本号.小版本号
// snapshot快照 alpha测试 beta公测 release稳定 ga正式发布
<packaging>jar</packaging>
// 打包类型默认是jar,还有war,zip,pom等类型
<name></name> // 项目描述名
<url></url> // 项目地址
<description></description>
<developers></developers>
<licenses></licenses>
<organization></organization>
<dependencies>
<dependency>
...坐标3要素
<type></type>
<scope>test</scope> // 指依赖范围,test表示用于测试范围
<optional></optional>
// 设置依赖是否可选,默认是false,表示子项目是继承的,若为true,子项目必须显式引用该依赖
<exlusions> // 排除依赖传递的列表
<exclusion></exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement> // 依赖管理坐标组件的版本号
<dependencies>
<dependency></dependency>
// 不会被运行(不会被引入到实际的依赖),主要用来定义在父模块中,让子模块来继承
</dependencies>
</dependencyManagement>
<build> // 主要用来对构件的行为提供插件支持
<plugins>
<plugin>
...坐标3要素
<executions></executions> // 行为定义管理
</plugin>
</plugins>
</build>
<parent>...坐标3要素</parent> // 通常用于指定当前子模块对父模块的pom的继承
<modules> // 用来聚合运行多个maven项(指定多个模块一起编译)
<module></module>
</modules>
十二、依赖范围
共有6种,
compile: 默认范围,编译测试运行都有效
provided: 在编译和测试时有效
runtime: 在测试和运行时有效
test: 只有测试时有效,比如junit
system: 同provided,但与本机系统相关联,可移植性差
import: 只能用于<dependencyManagement>标签中,表示从其它pom中继承过来的依赖
十三、依赖传递与依赖冲突
1、短路优先
2、如果路径长度相同,则谁先声明,先解析谁
十四、聚合和继承
A、聚合操作:
新建hongxing-aggregation的maven项目(供自身用)
1、pom.xml中的<package>改为pom类型
2、添加<modules>标签
<modules>
<module>../hongxing-bge</module>
<module>../hongxing.nge</module>
<module>../hongxing-shanji</module>
</modules>
3、Run as->maven build->compile
B、继承操作:
新建hongxing-parent的maven项目(供子项目用)
1、父项目pom.xml中的<package>改为pom类型
2、父项目中添加<dependencyManagement>标签管理所有子项目的依赖(直接包裹原<dependencies>标签即可)
注意:并不实现引入,因此子项目仍需要显式声明需要用到的依赖
3、父项目中可统一管理子项目依赖的版本属性:
a、将父项目的pom.xml文件中:<properties>中添加属性<junit.version>3.8.1</junit.version>,
将junit的依赖的版本属性替换为<version>${junit.version}</version>,统一管理版本
b、将子项目的junit依赖中的<version>和<scope>删除,保留<groupId>和<artifactId>即可,
这样子项目就继承了父项目的版本,如果子项目需要另外的一个版本,只需要声明<version>就可
4、子项目中添加<parent>标签指明父项目的坐标:
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
5、将父项目中的src/test/java目录删除掉,以免报错(因为不需要测试目录)
十五、补充部分
1、当子项目声明一个依赖(必须描述groupId和artifactId信息),如果groupid和artifactId以外的一些信息没有被描述,则通过groupId和artifactId匹配到父类的依赖,并使用这里的依赖信息。
2、POM是最简单的打包类型。不像一个JAR,SAR,或者EAR,它生成的构件只是它本身。
没有代码需要测试或者编译,也没有资源需要处理。打包类型为POM的项目的默认目标
生命周期阶段 目标
package site:attach-descriptor
install install:install
deploy deploy:deploy
注意:pom 项目里没有java代码,也不执行任何代码,只是为了聚合工程或传递依赖用的。
3、dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。
这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改 ;另外如果某个子项目需要另外的一个版本,只需要声明version就可。
4、其实继承的作用远不止如此,子项目继承父项目的东西还很多,如下:
groupId :项目组 ID ,项目坐标的核心元素;
version :项目版本,项目坐标的核心元素;
description :项目的描述信息;
organization :项目的组织信息;
inceptionYear :项目的创始年份;
url :项目的 url 地址
develoers :项目的开发者信息;
contributors :项目的贡献者信息;
distributionManagerment :项目的部署信息;
issueManagement :缺陷跟踪系统信息;
ciManagement :项目的持续继承信息;
scm :项目的版本控制信息;
mailingListserv :项目的邮件列表信息;
properties :自定义的 Maven 属性;
dependencies :项目的依赖配置;
dependencyManagement :醒目的依赖管理配置;
repositories :项目的仓库配置;
build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
reporting :包括项目的报告输出目录配置、报告插件配置等。