Maven 了解及使用
一、Maven安装及使用
1. Maven下载及安装
下载地址:https://maven.apache.org/download.cgi。下载的版本要落后与你的集成工具版本。
下载后,解压。注意:解压的目录中最好不要含有空格、中文或者其他特殊符号
配置环境变量
2. 指定本地及远程仓库
修改配置文件,文件位置:Maven安装目录/conf/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 为了方便观看,去掉了注释 需要做出的修改就是下面三部分,注意标签的位置-->
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- 配置本地仓库 -->
<localRepository>D:\java\Maven\LocalRepository</localRepository>
<!-- 配置远程仓库,即在本地仓库找不到包,从阿里MAVEN(中央仓库镜像)下载 -->
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<!-- 配置jdk信息,默认的jre运行是1.5 -->
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
</settings>
3. Eclipse上使用 Maven
3.1 配置Maven 插件及settings
3.2 创建Maven JavaWeb项目
现在大多使用SpringBoot进行web项目开发,但只想用maven开发项目,请看下面步骤。
以上就完成了带maven的javaweb项目创建了,接下来在pom.xml 文件中增加相关web依赖即可。相关依赖,请查看:https://blog.csdn.net/y_Engineer/article/details/102400977
3.3 报错:Perhaps you are running on a JRE rather than a JDK?
为了防止以后报上述错误,修改下面配置。
4. IDEA 上使用 Maven
4.1 配置Maven版本及settings
在选择Maven版本时,要注意Maven与IDEA版本上的兼容性。
Maven的版本要落后于IDEA的版本。(鄙人为了贪新版本,在创建SpringBoot时出现pom依赖找不到,下不了等问题)。下附 Maven版本(注意版本发布时间)。
4.2 创建 Maven项目
创建教程:二、3. 新建Maven Moudle
4.3 报错:No archetype found in remote catalog. Defaulting to internal catalog…
[WARNING] Archetype not found in any catalog. Falling back to central repository.
[WARNING] Add a repository with id 'archetype' in your settings.xml if archetype's repository is elsewhere.
我找了半天,解决办法是:将 archetype-catalog.xml 和 settings.xml 放置在本地仓库,然后VM Options 填入-DarchetypeCatalog=local。具体步骤:见链接
但上面办法,我没试成功,失败!!! 后终于在一位大佬那里找到了一个解决办法。配置项:archetypeCatalog \ internal。
二、Maven 知识点介绍
1. Maven初认识
Maven是一款服务于Java平台的自动化构建工具。Maven项目有固定的目录结构:
Project
|------src
|------|------main
|------|------|------java
|------|------|------resources
|------|------test
|------|------|------java
|------|------|------resources
|------pom.xml
- 根目录:工程名
- src目录:源码
- pom.xml文件:Maven工程的核心配置文件
- main目录:存放主程序
- test目录:存放测试程序
- java目录:存放java源文件
- resources目录:存放框架或其他工具的配置文件
Maven构建过程:
- 清理:将以前编译得到的旧class字节码文件删除,为下一次编译做准备
- 编译:将Java源程序编译成class字节码文件
- 测试:自动测试,自动调用Junit程序
- 报告:测试程序执行的结果
- 打包:动态Web工程打war包,Java工程打jar包
- 安装:Maven特点的概念——将打包得到的文件复制到“仓库”中的指定位置
- 部署:将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行
2. Maven 概念 - 坐标
Maven中使用三个向量在仓库中唯一定位一个工程
<groupId>com.winner.trade</groupId> <!--公司或组织域名倒序+项目名-->
<artifactId>trade-test</artifactId> <!--模块名-->
<version>0.0.1-SNAPSHOT</version> <!--版本-->
以上三个向量可确定项目存放路径:
com/winner/trade/trade-test/1.0.0-SNAPSHOT/trade-test-1.0.0-SNAPSHOT.jar
3. Maven 概念 - 依赖
3.1 依赖范围
<!-- 在增加依赖时就指定其依赖范围 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope> <!-- 依赖范围:provided -->
</dependency>
依赖范围:
- compile:对主程序有效,对测试程序有效,参与打包
对开发、部署、运行皆有效,典型例子:自己Maven工程、spring-core - test:对主程序无效,对测试程序有效,不参与打包,不参与部署,典型例子:Junit
- provided:对主程序有效,对测试程序有效,不参于打包,不参与部署。典型例子:servlet-api.jar。
- import:只能在dependenceManager中使用
常用依赖范围理解:
3.2 依赖冲突
当依赖包指定错域,极有可能发生依赖包冲突。比如说:当一个包servlet-api定义为compile,但是tomcat已经有此包了。在程序运行过程中可能会报空指针异常。
3.3 依赖排除
在dependency标签中加排除标签exclusions,通过groupId和artifactId确定要排除的依赖。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope> <!-- 依赖范围:provided -->
<exclusions>
<exclusion>
<groupId>xxxx</groupId>
<artifactId>yyyyy</artifactId>
</exclusion>
</exclusions>
</dependency>
3.4 依赖原则
路径短者优先,路径相同,先声明者(在pom.xml 的位置)优先。
3.5 统一依赖版本
<!-- 在properties进行变量设定,后续使用${..}进行引用 -->
<properties>
<spring-version>4.0.0.RELEASE</spring-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
3.5 依赖传递性
- pom.xml 配置一个依赖包A,假设A的运作需要依赖包B,则B会自动加入到运行时环境中
- 非compile范围的依赖无法传递
4. Maven概念 - 继承
现在可以在每个Maven工程中编写自己的pom文件了,但有一一个问题是随着项目的增多,pom.xml上的依赖版本极有可能发生不一致的情况,而且不可传递依赖(test、provided等)在配置过程中,也可能发生版本不一致。
利用继承,可将依赖统一提取到“父”工程中,在子工程中声明依赖时不指定版本,以父工程统一设定的为准。
注意:配置继承后,执行install命令(命令使用见下)时,要先执行父工程,再执行子工程。
2. 为了方便观看,将父、子整个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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.parent</groupId>
<artifactId>pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
<!-- 子工程 -->
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>home</groupId>
<artifactId>test</artifactId>
<description>home test</description>
<!-- 子工程与父工程一致的信息可删除,版本号一致删除 -->
<!-- <version>0.0.1-SNAPSHOT</version> -->
<!-- 指定父工程 -->
<parent>
<groupId>com.parent</groupId>
<artifactId>pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 以当前文件为基准父工程pom.xml的相对路径 -->
<relativePath>../pom/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!-- 子工程依赖不指定版本 -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
5. Maven概念 - 聚合
当项目特别多的时候,不可能一个个去启动项目,故应在一个“总的聚合工程”中配置各个参与聚合的模块。例如:在聚合工程上,mvn install 会将所有配置的所有工程全安装上。
<!-- 新建工程或在继承的父工程中配置聚合 -->
<modules>
<!-- 指定各个工程的相对路径,顺序无影响 -->
<module>../JavaWebMaven</module>
<!-- ...其他工程... -->
</modules>
6. Maven 概念 - 仓库
仓库分为本地仓库,远程仓库。
- 本地仓库:在自己电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
- 远程仓库:有私服,中央仓库,中央仓库镜像
- 私服:架设在当前局域网环境下,为当前局域网内的所有Maven工程服务
- 中央仓库:架设在Internet上,为全世界所有Maven服务
- 中央仓库镜像:架设在各大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快地响应用户请求。举例,见setting.xml使用的阿里maven
仓库中保存的内容:Maven工程
- Maven自身所需要的插件
- 第三方框架或工具的jar包(第一方:JDK;第二方:自己)
- 我们自己开发的Maven工程
7. Maven 概念 - 生命周期
前面也介绍过:Maven的构建过程【1. Maven 初认识】,其构建过程顺序是固定,而且执行后面的过程,会将之前的过程也都执行。
Maven有三套相互独立的生命周期
- Clean Lifecycle:在进行真正的构建之前进行一些清理工作
- Default Lifecycle:构建的核心部分,编译、测试、打包、安装、部署等
- Site Liftcycle:生成项目报告,站点,发布站点
Clean 生命周期包含3个阶段:
- pre-clean 执行需要在clean之前完成的工作
- clean 移除所有上一次构建生成的文件
- post-clean 执行需要在clean之后立刻完成的工作
Default 生命周期阶段(重要阶段)
- process-resources 复制并处理资源文件,至目标目录,准备打包
- compile 编译项目的源代码
- process-test-resources 复制并处理资源文件,至目标测试目录
- test-compile 编译测试源代码
- test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署
- package 接受编译好的代码,打包成可发布的格式,如JAR
- install 将包安装至本地仓库,以让其他项目依赖
- deploy 将最终的包复制到远程的仓库,以让其他开发人员与项目共享或部署到服务器上运行
Site 生命周期阶段
- pre-site 执行需要在生成站点文档之前完成的工作
- site 生成项目的站点文档
- post-site 执行需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上
8. Maven常用命令
命令 | 描述 |
---|---|
mvn clean | 清理,target目录删除 |
mvn compile | 编译主程序 在src同级目录下生成target/classes目录, 存放主程序编译结果 |
mvn test-compile | 编译测试程序 在src同级目录下生成target/test-class目录, 存放测试程序编译结果 |
mvn test | 执行测试 |
mvn package | 打包 在src同级目录下生成target/maven-archiver目录,存放辅助文件; 生成target/surefire-archiver,存放测试报告; 生成xxx-版本- SNAPSHOT.jar ,包中只有主程序。 |
mvn install | 安装 |
mvn site | 生成站点 |
说了这么多命令,在哪执行呢?
会显式常用命令,其他命令请点击 Maven build,在Goals中填写。
三、辅助网站
依赖包不可能手动输入,有一个网站,只需输入关键词,可以找到相关依赖包。官网:MvnRepository