Maven基本使用

1、Maven是什么

Maven项目对象模型(Project Object Model,简称POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。

Maven除了以程序构建能力为特色之外,还提供高级项目管理工具。由于Maven的缺省构建规则有较高的可重用性,所以常常用两三行Maven构建脚本就可以构建简单的项目。由于Maven的面向项目的方法,许多Apache Jakarta项目发文时使用Maven,而且公司项目采用Maven的比例在持续增长。

Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目(有各自Ant build文件),仅有细微的差别,而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享JARs。

小结:Maven是基于项目对象模型(POM),可以通过一小段的描述信息来管理项目的构建、报告和文档的软件项目管理工具。

2、Maven的下载及配置

直接去Maven官网:
在这里插入图片描述
在这里插入图片描述
点击Download:
在这里插入图片描述
选择合适的版本下载即可。注意的一点是Maven版本和JDK版本的兼容关系。

下载完zip包后直接解压:
在这里插入图片描述
包含4个目录。

然后修改conf目录下的settings.xml配置文件:
在这里插入图片描述
在这里插入图片描述
可以修改本地仓库的路径,指定为磁盘上的任意位置都可以。依赖是从远程仓库下载到本地仓库中的,远程仓库时Maven的总仓库,在国外。
在这里插入图片描述
它默认的远程仓库地址是国外,外网访问非常慢,下载更是跟龟速一样,所以一般会配置成国内的镜像仓库,比如阿里云的仓库,这样速度就很快了。
在这里插入图片描述
可以配置一下JDK的版本,这样每次生成Maven项目,那么它自动引入的是JDK1.8版本的依赖。

配置环境变量

和JDK一样,Maven也需要配置环境变量:
在这里插入图片描述
在这里插入图片描述
配置完毕后测试是否成功:
在这里插入图片描述
输入命令mvn -v,出现以上界面是配置成功了,否则检查配置。

3、Maven的目录结构

src
  -main
     -java
       -package
       -package
       ......
  -test
     -java
       -package
       -package
       ......
  -resources
    -*.xml
    -*.js
    -*.jsp
    -*.css
    ......

说明:src/main/java下是主要代码,src/test/java里面可以放测试代码,resources下放动态web的主要资源文件,比如jsp、html、css、js、图片等。

4、测试

建立一个空文件夹m1:
在这里插入图片描述
m1里面:
在这里插入图片描述
创建一个pom.xml,一个src目录。

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.ycz.m1</groupId>
  <artifactId>m1-model</artifactId>
  <version>0.0.1SNAPSHOT</version>
  
  <!--依赖坐标-->
  <dependencies>
     <!--junit测试依赖坐标-->
     <dependency>
	        <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
	 </dependency>
  </dependencies>
</project>

在这里插入图片描述
src目录下创建两个目录:main和test。

main目录:
在这里插入图片描述
java子目录:
在这里插入图片描述
子目录下有3层目录,最里面的demo目录下有一个java源文件:
在这里插入图片描述
test目录:
在这里插入图片描述
java子目录:
在这里插入图片描述
子目录下同样有3层目录,最里面的demo目录下有一个java源文件:
在这里插入图片描述
下面将m1项目进行打包:
在这里插入图片描述
在该级目录下运行命令:mvn compile
在这里插入图片描述
在这里插入图片描述
编译成功。
在这里插入图片描述
生成了一个target目录:
在这里插入图片描述
然后继续命令:mvc test
在这里插入图片描述
在这里插入图片描述
测试成功。target目录:
在这里插入图片描述
生成了3个新的目录。

然后继续命令:mvn package
在这里插入图片描述
在这里插入图片描述
target目录:
在这里插入图片描述
成功的生成了一个jar包,这个jar包可以使用命名java -jar来运行。

然后继续命令:mvn clean
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
target目录直接清除了。

继续命令:mvn install
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
生成target目录:
在这里插入图片描述
中央仓库:
在这里插入图片描述
在这里插入图片描述
成功将打包成功的jar包安装到了本地仓库中。以上就是项目进行编译、测试、打包、清除、安装的过程。

结论:mvn intall = mvn compile + mvn test + mvn package

5、Maven常用命令

以下几个命令是Maven种最常用的:

  • mvn -v:查看maven版本。
  • mvn compile:编译。
  • mvn test:测试。
  • mvn package:打包。
  • mvn clean:删除target。
  • mvn install:安装jar包到本地仓库中。

这些命令在上面都已经用过了。

6、Maven自动建立目录骨架

可以使用archetype插件创建符合maven规定的目录骨架。

maven的规定:

  • 在src/main/java中存放主代码。
  • 在src/test/java中存放测试代码。

第一种方式创建

直接命令:mvn archetype:generate
在这里插入图片描述
在这里插入图片描述
1到7之间选一个,这里选择7:
在这里插入图片描述
按照提示填写groupId、artifactId、version、package,然后确认:
在这里插入图片描述
构建成功。查看:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
没问题。

第二种方式创建

直接指定所有的参数一步搞定:

mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.ycz.t2 -DartifactId=t2-demo -Dversion=1.0.0SNAPSHOT -Dpackage=com.ycz.t2.demo

需要指定5个参数,如下:

  • -DarchetypeCatalog
  • -DgroupId
  • -DartifactId
  • -Dversion
  • -Dpackage
    在这里插入图片描述
    在这里插入图片描述
    选择一项然后点确定:
    在这里插入图片描述
    构建成功。查看:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    没问题。

7、maven中的坐标和仓库

7.1、坐标

坐标作为依赖在中央仓库的唯一标识,groupId、artifactId、version三个属性构成坐标。

示例:

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
    </dependency>

坐标正确才能够从远程的中央仓库下载依赖到本地仓库中。

7.2、仓库

仓库有本地仓库和远程仓库。默认是从远程仓库下载构件存放到本地仓库中,默认的远程仓库地址为https://repo.maven.apache.org/maven2。可以更改仓库的镜像,因为外网一般较慢,可改成国内镜像。在conf里面的setting.xml里的mirrors可以修改。本地仓库的位置也可以修改,默认的位置是${user.home}/.m2/repository,可以通过localRepository修改本地仓库的位置。

示例:
在这里插入图片描述
在这里插入图片描述

8、eclipse中集成maven

eclipse4.0版本以上无需安装,已经集成maven到了eclipse开发环境中,只是针对4.0版本以下。

查看window-Prefrences:
在这里插入图片描述
里面有个Maven选项,这里需要配置一下。
在这里插入图片描述
里面的User-Settings需要配置:
在这里插入图片描述
需要指定Maven的配置文件路径,下面的Local Repository会从配置文件中自动获取到Maven本地仓库的位置。

配置完成以后生成一个Maven项目:
在这里插入图片描述
在这里插入图片描述
勾选,然后Next:
在这里插入图片描述
填写groupId、artifactId,选择Version版本,选择打包的方式是jar还是war包。下面的父项目坐标可以暂时不写,点击完成:
在这里插入图片描述
创建了一个简单的Maven项目,可以看到项目左上角有个M标记,表示这是个Maven项目。pom.xml如下:
在这里插入图片描述

9、maven的生命周期和插件

一个完整的项目构建过程包括如下:清理、编译、测试、打包、集成测试、验证、部署。

Maven的生命周期

主要包括清理、构建项目、生成项目站点。

(1)clean

用于清理项目,该阶段又可分为以下三个阶段:

  • pre-clean:执行清理前的工作。
  • clean:清理上一次构建生成的所有文件。
  • post-clean:执行清理后的文件。

(2)default

用于构建项目。该阶段又可分为以下四个阶段:

  • compile:编译项目。
  • test:测试。
  • package:打包。
  • install:集成,安装jar包到本地仓库。

(3)site

用来生成项目站点。可分为以下4个阶段:

  • pre-site:在生成项目站点前要完成的工作。
  • site:生成项目的站点文档。
  • post-site:在生成项目站点后要完成的工作。
  • site-deploy:发布生成的站点到服务器上。

Maven中的插件

pom.xml中一般会配置插件:

<!-- 使用插件 -->
  <build>
    <plugins>
      <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-source-plugin</artifactId>
      <version>2.4</version>
      <executions>
         <execution>
            <phase>package</phase>
            <goals>
              <goal>jar-no-fork </goal>
            </goals>
         </execution>
      </executions>
      </plugin>
    </plugins>
  </build>

这个插件一般用来打包安装。

10、pom.xml详解

一个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 
	https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	
	<!-- 本项目的地址及版本 -->
	<groupId>com.ycz.m1</groupId>
	<artifactId>m1-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<!-- 本项目的打包方式 -->
	<packaging>jar</packaging>
	
	<!-- 项目描述名 -->
	<name></name>
	<!-- 项目地址 -->
	<url></url>
	<!-- 项目描述 -->
	<description></description>
	
	<!-- 本项目的父项目 -->
	<parent>
	   <groupId></groupId>
	   <artifactId></artifactId>
	   <version></version>
	   <!-- 父项目的相对路径 -->
	   <relativePath></relativePath>
	</parent>
	<!-- 配置一些属性 -->
	<properties></properties>
     
     <!-- 本项目的子模块,可配置多个 -->
	<modules>
	   <module></module>
	</modules>
	
	<!-- 依赖 -->
	<dependencies>
	   <dependency>
	       <!-- 依赖坐标 -->
	       <groupId></groupId>
	       <artifactId></artifactId>
	       <version></version>
	       <!-- 依赖存在的范围 -->
	       <scope></scope>
	   </dependency>
	</dependencies>
	
	<!-- 用于定义父类模块 -->
	<dependencyManagement>
	    <!-- 依赖 -->
	    <dependencies>
	       <dependency>
	           <groupId></groupId>
	           <artifactId></artifactId>
	           <version></version>
	           <scope></scope>
	           <!-- 排除的依赖 -->
	           <exclusions>
	              <exclusion>
	                  <groupId></groupId>
	                  <artifactId></artifactId>
	              </exclusion>
	           </exclusions>
	       </dependency>
	    </dependencies>
	</dependencyManagement>
	
	<build>
	   <!-- 配置插件 -->
	   <plugins>
	      <!-- 子插件 -->
	      <plugin>
	         <groupId></groupId>
	         <artifactId></artifactId>
	         <version></version>
	         <executions>
	            <execution>
	                <phase></phase>
	                <goals>
	                   <goal></goal>
	                </goals>
	            </execution>
	         </executions>
	      </plugin>
	   </plugins>
	</build>
</project>

常用标签元素说明:

  • <project>:是根元素,包含了一些约束信息。
  • <modelVersion>:指定了当前pom的版本。
  • <groupId>:反写的公司网址+项目名。
  • <artifactId>:项目名+模块名。
  • <version>:当前项目的版本号,一般由三个数字组成,第一个0表示大版本号,第二个0表示分支版本号,第三个0表示小版本号。
  • :快照。
  • <alpha>:内部测试。
  • <beta>:公测。
  • <Release>:稳定。
  • <GA>:正式发布。
  • <packaging>:表示打包方式,不指定的话默认是打包成jar包。
  • <name>:项目描述名。
  • <url>:项目地址。
  • <description>:项目描述。
  • <developers>:开发人员列表。
  • <licenses>:许可证信息。
  • <organization>:组织信息。
  • <dependencies>:依赖列表,下面可包含多个依赖项。
  • <dependency>:依赖项,依赖项下面又有groupId、artifactId、version、scope、type、optional标签。
  • <scope>:依赖存在的范围,编译、测试、运行中的一种。
  • <optional>:设置依赖是否可选,默认为false,为继承的。
  • <executions>:排除依赖传递列表,下面可包含多个子列表。
  • <dependencyManagement>:用于定义父类模块,被子类模块继承。
  • <build>:对构建行为提供支持,如plugins插件列。
  • <plugins>:插件,下面可包含多个plugin插件。
  • <plugin>:子插件。
  • <parent>:用于子模块中对父模块pom的继承。
  • <modules>:聚合多个子模块。
  • <module>:子模块。

11、Maven依赖解析

依赖范围

<scope>标签来规定,用来控制依赖与3种classpath的关系。

一般的classpath可设为以下3个值:compile(编译)、test(测试)、run(
运行)。

如junit的依赖范围scope的值为test,表明junit只能用于测试中。
scope的值有6种:compile、provided、runtime、test、system、import。

依赖的传递

比如B依赖于A,而C依赖于B,那么C会继承B的依赖和A的依赖,这就是依赖的传递性。

以下进行示例。

A模块:
在这里插入图片描述
在这里插入图片描述
A模块中只有mysql驱动包相关的依赖。

然后B模块:
在这里插入图片描述
B模块依赖于A模块,同时有一个commons-io的依赖包。
在这里插入图片描述
没问题。

然后C模块:
在这里插入图片描述
C模块只依赖于B模块,查看Maven依赖包:
在这里插入图片描述
没问题,A模块和B模块的依赖都传递到了C模块中。

依赖冲突

原则如下:

  • 短路优先:比如A-B-C-X(jar),A依赖于B,B依赖于C,C依赖于X,X是jar。然后还有A-D-X(jar),A依赖于D,D依赖于X。那么Maven会判定为A依赖于D,因为路径短。
  • 先声明先优先:如果路径长度相同,则谁先声明,先解析谁。

事实上,项目的依赖冲突和依赖版本之间不兼容是最麻烦的,很难排查出来。不过IDEA提供了快捷排查依赖冲突的方式,而eclipse却不具备,eclipse中排查依赖很困难。

12、Maven项目的聚合和继承

12.1、聚合

将pom.xml中的package值设为pom,然后使用<modules>标签将任意个项目进行聚合。聚合的目的是为了方便快速构建项目。对于聚合模块来说,他知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。

示例:
在这里插入图片描述
A模块聚合了B模块和C模块,可以看到B、C模块都是一个单独的Maven项目子模块,都有自己的pom文件。

A的pom.xml如下:
在这里插入图片描述
主要是配置modules标签,A有2个子模块B和C。

12.2、继承

将pom.xml中的package值设为pom,需要用到<parent>标签。父项目并不知道自己的子项目,但是子项目是知道父项目是哪个,继承的目的主要是为了消除依赖的重复配置。

示例:
在这里插入图片描述
在这里插入图片描述
主要是parents标签里面指定父项目。

实际上,开发中经常一个项目是父项目,同时它又是聚合项目。比如上面的A项目,它既是聚合模块,也是B和C的父项目。

13、Maven构建动态web项目

先创建一个普通的Maven项目:
在这里插入图片描述
点击Finish:
在这里插入图片描述
然后选中项目:
在这里插入图片描述
右键–Properties:
在这里插入图片描述
选择左边的Project Facets,然后点击右边的Convert to faceted form:
在这里插入图片描述
勾选左边标记的dyn选项,然后点击下面标记的地方:
在这里插入图片描述
内容目录可以任意命名,一般命名为webapp。下面自动生成web.xml需要勾选上,然后点击OK。
在这里插入图片描述
maven项目生成了一个webapp目录,下面是web项目的目录结构,那么此时maven项目也是一个web项目了,可以开始进行web项目的开发了。最常见的是SSM + Maven进行开发,非常快速。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值