maven项目管理工具
maven依赖信息下载地址
tips:Tomcat容器管理的官方网站:cargo.codehaus.org
maven项目的目录机构
src
-main
-java
-package
-test
-java
-package
resource
pom.xml文件:
struts-2.3.31-all\struts-2.3.31\lib文件夹下
解压struts-core-1.3.10.jar
struts-core-1.3.10\META-INF\maven\org.apache.struts\struts-core文件夹下
复制出pom.xml
maven案例测试
进入项目所在目录: cd F:\代码\Maven\第一个maven案例HelloWord\MavenCode
对项目进行编译: mvn compile
测试项目: mvn test
打包项目: mvn package
查看maven版本: mvn -v
删除target: mvn clean
安装jar包到本地仓库中: mvn install (如果本地不存在该jar包,会去中央仓库联网下载。都不存在就会报错)
archetype插件:用于创建符合maven规定的目录骨架(HelloWord)
![](https://images2018.cnblogs.com/blog/1191677/201802/1191677-20180224234919776-1402274874.png)
选择第一种方式:
cd F:\代码\Maven\第一个maven案例HelloWord
mvn archetype:generate
archetype版本选择 Choose a number: 6
![](https://images2018.cnblogs.com/blog/1191677/201802/1191677-20180224234920233-925287653.png)
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/
maven-source-plugin插件地址:http://maven.apache.org/plugins/maven-source-plugin/
在pom.xml中添加插件:
<!-- 添加插件 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.4</version> <!-- 绑定sourse插件到default生命周期的package阶段 即在package阶段会运行source插件 --> <executions> <execution> <phase>package</phase> <!-- 运行目标 --> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
mvn clean package 执行结果:
![](https://images2018.cnblogs.com/blog/1191677/201802/1191677-20180224234920715-1803153070.png)
pom的常用元素(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 http://maven.apache.org/maven-v4_0_0.xsd"> <!-- 指定了当前pom的版本 --> <modelVersion>4.0.0</modelVersion> <groupId>反写的公司网址+项目名</groupId> <artifactId>项目名+模块名</artifactId> <!-- 第一位表示大版本号;第二位表示分支版本号;第三位表示小版本号 [0.0.1] snapshot 快照 alpha 内部测试 beta 公测 Release 稳定 GA 正式发布 --> <version>版本号</version> <!-- 默认是jar/ war/ zip/ pom --> <packaging>jar</packaging> <!-- name 一般在产生项目文档时使用 --> <name>项目描述名</name> <url>项目地址</url> <description>项目描述</description> <developers>开发人员列表</developers> <licenses>开源框架等许可证信息</licenses> <organization>组织信息</organization> <!-- 依赖列表 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <type>pom</type> <!-- 依赖范围 --> <scope>test</scope> <!-- 设置依赖是否可选,默认为false --> <optional></optional> <!-- 排除依赖传递列表 --> <exclusions> <exclusion></exclusion> </exclusions> </dependency> </dependencies> <!-- 依赖的管理 --> <dependencyManagement> <dependencies> <dependency></dependency> </dependencies> </dependencyManagement> <build> <!-- 插件列表 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.4</version> <!-- 绑定sourse插件到default生命周期的package阶段 即在package阶段会运行source插件 --> <executions> <execution> <phase>package</phase> <!-- 运行目标 --> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <!-- 对父模块pom的继承 --> <parent></parent> <!-- 指定多个maven模块共同编译(maven的聚合) --> <modules> <module></module> </modules> </project>
maven依赖的范围<scope></scope>
依赖范围是用来控制依赖和3种classpath的关系
3种classpath:编译、测试、运行
![](https://images2018.cnblogs.com/blog/1191677/201802/1191677-20180224234921869-661909568.png)
compile:默认的依赖范围, 如果没有指定,则使用。 在项目的所有类路径中都有效
provided: 仅适用于编译和测试类路径,不可传递。
runtime: 此范围表示编译不需要依赖关系,而是用于执行。在运行和测试类路径有效
test:表示正常使用应用程序时不需要依赖关系。仅适用于测试类路径,不可传递(典型应用:junit)
system:仅适用于编译和测试类路径,不可传递。与本机系统相关联,可移植性差
import:导入的依赖范围,只使用在<dependencyManagement>标签中,表示从其他的pom中继承的依赖(导入dependency的配置 )
![](https://images2018.cnblogs.com/blog/1191677/201802/1191677-20180224234922785-502472337.png)
maven的依赖传递和排除依赖
依赖的传递:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- 在南哥的pom,引入B哥的依赖 --> <dependency> <groupId>com.hongxing</groupId> <artifactId>hongxing-bge</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies>
排除依赖:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- 山鸡依赖于南哥 --> <dependency> <groupId>com.hongxing</groupId> <artifactId>hongxing-nange</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 在山鸡的pom,排除B哥的依赖传递 --> <exclusions> <exclusion> <groupId>com.hongxing</groupId> <artifactId>hongxing-bge</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
maven依赖冲突
1、短路优先:优先解析路径短的版本
A -> B -> C -> D ->X(jar)
(1.0 -1.0 -2.0 -3.0 -n.0 )
commons-io插件为例:
![](https://images2018.cnblogs.com/blog/1191677/201802/1191677-20180224234923547-1201123322.png)
2、先声明的优先:如果路径长度相同,谁先声明,先解析谁
以山鸡同时依赖B哥和南哥为例:
![](https://images2018.cnblogs.com/blog/1191677/201802/1191677-20180224234924563-719087553.png)
maven的聚合(多个项目一起执行install操作,安装到本地仓库)和继承(将共同特性封装成一个父类)
以B哥、南哥、山鸡代码为例实现项目的聚合:
新建项目hongxing-aggregation,在pom中进行聚合配置
![](https://images2018.cnblogs.com/blog/1191677/201802/1191677-20180224234925138-340170993.png)
执行 mvn clean install:生成所有的jar,并安装到本地仓库中
以B哥代码为例实现项目的继承:
>1 新建项目hongxing-parent,在pom中配置依赖的管理
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 提取junit版本号 --> <junit.version>4.8.2</junit.version> </properties> <!-- 依赖的管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!-- 调用版本号 --> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
>2 在项目hongxing-bge的pom中配置,继承项目hongxing-parent中的junit
<!-- 继承项目hongxing-parent中的junit --> <parent> <!-- 引入父类pom的坐标 --> <groupId>com.hongxing</groupId> <artifactId>hongxing-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency>
![](https://images2018.cnblogs.com/blog/1191677/201802/1191677-20180224234925838-1589514293.png)