Maven日常使用
一、Maven简介
Maven是属于apache软件基金会下一个开源免费的项目,是跨平台的项目管理工具, Maven采用了一种被称之为Project Object Model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理,可以在代码进行部署的过程中自动解决项目中代码的依赖环境,需要从maven的镜像仓库中进行下载依赖环境,通常下载比较慢,企业中会在公司内部搭建nexus(私服),将构建项目中的依赖环境保存到nexus服务器中,提高访问速度。
POM项目对象模型,是Maven工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。
执行任务或目标时,Maven会在当前目录中查找POM。读取POM,获取所需的配置信息,然后执行目标。
POM中可以指定以下配置:项目依赖、插件、执行目标、项目构建profile、项目版本、项目开发列表、相关邮件列表信息。
1.1 Maven的功能
- mavne模型的Java项目对源代码、单元测试代码、资源、jar包等有规范和目录规划;
- 解决项目间的依赖关系、版本不一致、版本冲突问题;
- 合理的jar管理机制;
1.2 Maven使用场景
- 原来项目中的jar包必须手动复制、粘贴到
WEB-INF/lib
项目下,而借助maven,可以将jar包仅仅保存在仓库中,有需要使用的工程只需要引用这个文件,并不需要重复复制到工程中; - 原来的项目中所需要的jar包都是提前下载好的,而maven在联网状态下会自动下载所需要的jar包。首先在本地仓库中找,找不到就在网上进行下载;
- 原来的项目中一个jar包所依赖的其他jar包必须手动导进来,而maven会自动将被依赖的jar包导进来;
- 原来的项目一个项目就是一个工程,而借助maven可以将一个项目拆分成多个工程;
项目构建过程包括:【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】这几个步骤,这六个步骤就是一个项目的完整构建过程。
1.3 Maven仓库类型
在Maven的专业术语中,仓库是指一个位置,Maven仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven仓库能帮助我们管理构件(主要是Jar),它就是放置所有JAR文件(WAR、ZIP、POM等等)的地方。
Maven仓库有三种类型:
- 本地;
- 中央;
- 远程;
1、本地仓库
Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 ~/.m2/respository/
的仓库目录。
2、中央仓库
Maven中央仓库是由Maven社区提供的仓库,其中包含了大量常用的库。maven内置了远程公用仓库:http://repo1.maven.org/maven2 。中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。
3、第三方仓库
第三方仓库又称为内部中心仓库,也称为私服。私服:一般是由公司自己设立的,只为公司内部共享使用。它既可以作为公司内部构件协作和存档,也可以作为公用类库镜像缓存,减少在外部访问和下载的频率(使用了私服就减少了对中央仓库的访问)。如需了解更多,可以移步这篇文档:Maven教程
二、Maven简单使用
安装Maven需依赖java环境,所以应实现部署jdk环境!
2.1 安装部署jdk环境
下载Linux环境下的jdk1.8,请去(官网)中下载jdk的安装文件;
$ mkdir /usr/local/java/
$ tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/java/
$ vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
$ source /etc/profile
$ java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
2.2 maven安装
$ wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
$ tar zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local/
$ ln -sf /usr/local/apache-maven-3.6.3/ /usr/local/maven
$ vim /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin
$ source /etc/profile
$ mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 1.8.0_171, vendor: Oracle Corporation, runtime: /usr/local/java/jdk1.8.0_171/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
2.3 更换maven使用的仓库地址
由于使用maven官网的地址。下载较慢,所以直接更改为阿里云提供的maven仓库地址!
$ vim /usr/local/maven/conf/settings.xml
.......
49 <!-- localRepository # 本地仓库配置
50 | The path to the local repository maven will use to store artifacts.
51 |
52 | Default: ${user.home}/.m2/repository
53 <localRepository>/path/to/local/repo</localRepository> # 可更换本地仓库目录位置
54 -->
.......
159 <mirror>
160 <id>aliyun</id>
161 <mirrorOf>central</mirrorOf>
162 <name>aliyun maven</name>
163 <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
164 </mirror>
165 </mirrors> # 必须写在这个标签里面,这个大标签默认是存在的
# mirror就是镜像,主要提供一个方便地切换远程仓库地址的途径
# <mirrorOf>central</mirrorOf>里是要替代的仓库的id。代理原有仓库,如果填写*表示替换所有仓库
2.4 构建项目测试
$ mkdir /tmp/test && cd /tmp/test
$ mvn archetype:generate -DgroupId=com.lzj.maven.quickstart -DartifactIdk=test_app -DarchetypeArtifactId=maven-archetype-quickstart
# 输入执行命令时指定的项目名称,接下来的直接按回车保持默认即可
...........................#省略部分内容
[INFO] Using property: groupId = com.lzj.maven.quickstart
Define value for property 'artifactId': test_app # 需手动指定项目名称,可自定义,接下来保持默认即可!
Define value for property 'version' 1.0-SNAPSHOT: :
[INFO] Using property: package = com.lzj.maven.quickstart
Confirm properties configuration:
groupId: com.lzj.maven.quickstart
artifactId: test_app
version: 1.0-SNAPSHOT
package: com.lzj.maven.quickstart
Y: : y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /tmp/test
[INFO] Parameter: package, Value: com.lzj.maven.quickstart
[INFO] Parameter: groupId, Value: com.lzj.maven.quickstart
[INFO] Parameter: artifactId, Value: test_app
[INFO] Parameter: packageName, Value: com.lzj.maven.quickstart
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /tmp/test/test_app
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:41 min
[INFO] Finished at: 2021-03-10T10:44:40+08:00
[INFO] ------------------------------------------------------------------------
# 最后出现 BUILD SUCCESS 即表示成功!
上述命令解释如下:
- archetype:generate:创建一个简单的java项目;
- archetype 也就是原型,是一个 Maven 插件,准确说是一个项目模板,它的任务是根据模板创建一个项目结构。使用 quickstart 原型插件创建一个简单的 java 应用程序
- -DgroupId:组织名,公司网址的反写(反向域名)+项目名称;
- -DartifactIdk:项目名或者模块名;
- -DarchetypeArtifactId:指定 ArchetypeId,maven-archetype-quickstart,创建一个简单的 Java 应用;
- -DinteractiveMode: 是否使用交互模式。
2.5 生成的POM文件参数解释
$ ls test_app/
pom.xml src
$ cat test_app/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">
<!-- 根,这是对Project添加一些根元素的约束信息 -->
<modelVersion>4.0.0</modelVersion>
<!-- 指定当前maven模型的版本号 -->
<groupId>com.lzj.maven.quickstart</groupId>
<!-- 应该是公司名或者组织名。一般来说groupID有三个部分组成,每个部分之间以“.”分隔,第一部分是项目的用途,比如用于商业的就是com,用于非商业盈利性组织的就是org,第二部分是公司名,比如tentxun/baidu/alibaba,第三部分是你的项目名 -->
<artifactId>test_app</artifactId>
<!-- 可以认为是maven构建的项目名,比如你的项目中有子项目,就可以使用“项目名-子项目的命名方式 -->
<packaging>jar</packaging>
<!-- 指定生成的格式(jar/war/rar/pom/ear) -->
<version>1.0-SNAPSHOT</version>
<!-- SNAPSHOT意味快照,说明该项目还在开发中,是不稳定的版本 -->
<name>test_app</name>
<!-- 项目的名称, Maven产生的文档用 -->
<url>http://maven.apache.org</url>
<!-- 项目主页的url,Maven产生的文档用 -->
<dependencies>
<!-- 指定开发构建(jar包) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!-- JUnit是一个Java语言的单元测试框架 -->
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
用户的家目录下也会生成一些依赖,用作本地仓库!
$ ls ~/.m2/repository/
antlr asm classworlds commons-codec commons-collections commons-io commons-lang junit net org
2.6 maven配置文件
Maven 的配置文件名称为:setting.xml
。它被存放在两个地方:
/usr/local/maven/conf/settings.xml
#安装的目录;~/.m2/settings.xml
#用户的家目录;
其中,安装目录配置又是全局配置,用户目录配置被称为用户配置。如果两者都存在,他们的内容将被合并,并且用户范围的settings.xml优先。默认用户目录不存在配置文件,可以copy maven安装目录下的settings.xml到用户目录。
关于settings.xml文件常用的的配置修改如下:
- 修改本地仓库存储路径,默认值是
~/.m2/repository
可在settings.xml
中的localRepository
修改成自己需要的目录; - 如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,需要离线模式下,设置
offline
属性,设置为true,默认为false; - 修改中央仓库服务器,修改配置文件中便签,添加或修改镜像地址;
- 设置代理地址,修改配置文件中proxy标签,定义代理服务器,实现maven的代理。
由于中央仓库服务器是国外的,在国内使用的话,下载比较慢,所以建议国内用户使用阿里云仓库地址。
2.7 maven常用命令
$ cd /tmp/test/test_app/ # 进入刚才构建的项目目录下
$ mvn compile # 编译(在编译的过程中,可以看到使用的是阿里云的仓库)
[INFO] BUILD SUCCESS # 只要在输出信息的最后几行中看到该行,则表示执行成功
# 以后所有命令都一样,只要最后几行有上述信息,就表示执行成功
$ ls # 会看到目录下会生成新的目录target
pom.xml src target
# target:打包输出目录,如打包好的jar或war文件;
# target/classes:编译输出目录;
$ mvn test # 测试命令
$ ls target/test-classes/
com
# target/test-classes:测试编译输出目录
$ mvn clean # 清理命令(就是将编译和测试生成的目录删除)
$ ls # target目录已经不在了
pom.xml src
$ mvn package # 打包
$ ls target/*.jar # 会生成一个jar包
target/test_app-1.0-SNAPSHOT.jar
$ mvn install # 安装命令(作用是将压缩文件jar包或者war包上传到本地仓库)
$ find ~/.m2/repository/ -name test_app-1.0-SNAPSHOT.jar
/root/.m2/repository/com/lzj/maven/quickstart/test_app/1.0-SNAPSHOT/test_app-1.0-SNAPSHOT.jar
# 确认上传的包
$ mvn deploy # 发布(将包上传到私服,现在我这里还没有私服,所以会失败)
2.8 mvn命令的生命周期
maven基于构建生命周期这个中心概念,这意味着构建和分布特定项目的过程被明确定义,具体如下:
大致的生命周期图:
详细的生命周期图:
三、maven实战
3.1 编译生成war包
$ mvn archetype:generate -DgroupId=cn.test.testweb -DartifactId=test_web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
$ ls
test_app test_web
$ cd test_web/
$ mvn package
$ ls target/*.war
target/test_web.war
3.2 安装tomcat
$ wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz
$ tar zxf apache-tomcat-9.0.43.tar.gz -C /usr/local/
$ ln -sf /usr/local/apache-tomcat-9.0.43/ /usr/local/tomcat
$ cp /tmp/test/test_web/target/test_web.war /usr/local/tomcat/webapps/
$ /usr/local/tomcat/bin/startup.sh
3.3 访问测试
客户端访问移动到Tomcat网页根目录下的war包,地址:http://TomcatIP:8080/test_web 如图: