Maven笔记
安装maven
- 去官网下载。
- 解压即可。
目录结构:
bin:maven的可执行脚本。
boot:maven的类加载器框架,maven使用它来加载自己的类库。
conf:配置文件目录,重要的setting.xml
lib:maven运行时所用的类库 - 配置环境变量
(若果是多人使用的电脑,应在用户变量中配置)
配置m2_home
配置path:%m2_home%\bin
maven的目录结构
-
-src
- -main
- -test
- -resource
-pom.xml
maven脚本命令
mvn compile : 编译 产生的class文件放在生成target文件夹下
mvn test : 执行测试用例
mvn package:打包 在target目录下会看到生产的jar包
mvn clean : 删掉以前生产的target
mvn install : 安装生产的jar到本地仓库。这样其他依赖该jar的项目就可以获取到该jar了。
maven编译的流程是:开始编译–>发现需要依赖–>去项目的pom文件中找依赖的坐标–>先去本地仓库中–>本地仓库如果没有,联网去中央仓库找。
名词解释
- 构件:maven中用到的依赖包,项目的称呼
- 坐标:构件的定位表示。groupId+artifactId+version
- 仓库:顾名思义。分为本地仓库和远程仓库。
远程仓库的地址是在这里写的:D:\apache-maven-3.3.3\lib\maven-model-builder-3.3.3.jar\org\apache\maven\model\pom-4.0.0.xml中
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
- 镜像仓库:有时默认的远程中央仓库会很慢,一般我们会用国内的镜像仓库,配置方法是:conf/setting.xml
<mirrors>
<mirror>
<id>maven.net.cn</id>
<mirrorOf>central</mirrorOf>
<name>cnResponsitory</name>
<url>http://maven.net.cn/content/groups/public</url>
</mirror>
</mirrors>
地址貌似已经失效
<morrorOf>
中也可以使用通配符
- 更改本地仓库位置
默认放在.m2/respository
修改方法:setting.xml中:
<localRepository>/path/to/loca/repo</localRepository>
改为自己的位置
pom文件解析
<project>
<!--maven版本的4.0.0是固定的-->
<modelVersion>4.0.0</modelVersion>
<!--maven2.0必须是这样写,现在是maven2唯一支持的版本-->
<!-- 基础设置 -->
<!-- 坐标 -->
<groupId>项目名</groupId>
<artifactId>模块名</artifactId>
<version>版本号,一般由三个数字组成,大版本号.分支版本号.小版本号+snapshot快照/relaease/GA发布版等</version>
<packaging>打包方式,默认jar,还有war,zip等</packaging>
<!-- 非必须的项目描述信息 -->
<name>项目描述名</name>
<url>项目地址</url>
<description>项目描述</description>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- 用来对父pom的继承-->
<parent>...</parent>
<!-- 依赖列表 -->
<dependencies>
<dependency>
<!-- 依赖的坐标 -->
<groupId>
<artifactId>
<version>
<type>
<!-- 依赖应用的范围 -->
<!-- maven提供了三种classpath,编译,测试和运行。对应的scope提供了6种值compile,provided,runtime,test,system,import。-->
<scope>test</scope>
<!-- 设置依赖是否可选,默认false -->
<optional>true/false</optional>
<!-- 排除依赖传递列表-->
<!-- 依赖排除的意思是,A依赖B,B由依赖C。那么A就会把C加到自己的依赖列表中,但是其实A根本用不到C,那么就可以用这个排除-->
<exclusions>
<exclusion>
放要排除的坐标
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 依赖管理,并不会真正执行,一般放在父pom中,供子pom继承,子pom中用<parent>继承-->
<dependencyManagement>...</dependencyManagement>
<!-- 聚合项目,不用自己一个个编译了-->
<modules>...</modules>
<properties>...</properties>
<!--构建设置 -->
<!-- 放插件列表 -->
<build>
<!-- 例子去maven官网拿的Apache > Maven > Plugins > Apache Maven Source Plugin > Configuring Source Plugin-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<configuration>
<outputDirectory>/absolute/path/to/the/output/directory</outputDirectory>
<finalName>filename-of-generated-jar-file</finalName>
<attach>false</attach>
</configuration>
</plugin>
</plugins>
</build>
<reporting>...</reporting>
<!-- 环境设置-->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
-
scope值的说明:
- compile : 默认,对编译,测试,运行都有效。
- provided: 编译+测试。如用在servlet的api上。因为发布时用的web容器已经提供了这些api。
- runtimr : 测试 + 运行。 如jdbc
- test : 测试
- system : 编译 + 测试 ,会管理系统,不可移植
- import : 只会用在<\dependencyManagement>中。表示这是引入的依赖。
依赖冲突
maven通过两个原则来解决依赖冲突
1,短路优先
2,先声明优先