Maven学习总结

共 5063字,需浏览 11分钟

 ·

2020-08-21 09:38

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

  作者 |  又要起名字呀 

来源 | urlify.cn/Vfm2mi

66套java从入门到精通实战课程分享


一、Maven概念

一个 基于Java平台 的 自动化构建工具 ,帮助我们管理jar包和拆分项目,其他类似的构建工具有 make-ant-maven-gradle。

基于Java平台:安装maven前一定要配置好JDK环境。

自动化构建工具:eclipse就是自动化构建工具,帮助我们把java编译为class文件。

二、Maven安装

(1)下载JDK并配置环境变量。

(2)下载maven(http://maven.apache.org/download.cgi)。

(3)解压安装包,并配置maven环境变量。

  a、配置MAVEN_HOME : D:\apache-maven-3.6.3\bin

  b、配置path:%MAVEN_HOME%\bin

命令行窗口下用 mvn -v 验证安装是否成功。

以上三步就已经成功安装了maven,但为了让你的maven使用经历更加畅快,你还需要做出以下一些小修改。

(1)增加Maven镜像

  Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。

  Maven安装目录下,找 conf ----->settings.xml,在 mirrors 标签下加入下面内容



         
         <id>nexus-aliyunid>
         <mirrorOf>*mirrorOf>
         <name>Nexus aliyunname>
         <url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>


(2)修改本地仓库位置

  Maven默认本地仓库地址在C盘,随着项目的增加,这无疑会使得C盘变的臃肿,可以修改C盘的路径。

  Maven安装目录下,找 conf ----->settings.xml,修改 localRepository 标签中的地址到你开心的位置。

<localRepository>F:/soft/MVN_repositorylocalRepository>


(3)修改IDE的配置,使本地仓库生效

  Eclipse:Windows---->Preferences---->Maven---->User Settings---->Global Settings选择你之前配置的settings.xml

  Idea:File---->Settings---->Maven---->User settings file选择你之前配置的settings.xml

三、Maven常用命令

安装完成后,不要先着急使用,还有一些知识需要你进行了解,以便于你更好的使用Maven。

Maven生命周期总的来分为clean,build,site三大部分,其中build又依次包括validate--->compile--->Test--->package--->verify--->install--->deploy,本篇文章比较偏向于实践,具体的生命周期的知识笔者不再赘述(生命周期的知识比较偏理论,但也挺重要的,还是希望大家自行了解下,https://www.runoob.com/maven/maven-build-life-cycle.html),生命周期的一些阶段对应着Maven的一些常用命令,

命令描述
mvn clean删除target目录(删除编译文件的目录)
mvn compile只编译main目录中的java文件
mvn test执行test目录下的测试用例
mvn package将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
mvn install安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖

值得注意的是,每一个命令执行时,该命令之前以及包括该命令在内的所有命令都会被执行,比如执行了mvn install,前边的五条命令也都会被执行。

四、POM文件

为了方便理解,先对常见的pom文件结构进行讲解,掌握了下边的文件结构,基本上你就可以关掉本篇博文,使用maven进行开发了,但如果你对此并不满足,可以继续向下看。

<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.0modelVersion>
     
     <groupId>com.liu.learninggroupId>
     
     <artifactId>HelloWorld01artifactId>
     
     <version>0.0.1-SNAPSHOTversion>
     
     <name>HelloWorld01name>
     
     <packaging>jarpackaging>
     
     <description>hello worlddescription>
 
     
     <profiles>
         <profile>
             <id>jdk-1.8id>
             <activation>
                 <activeByDefault>trueactiveByDefault>
                 <jdk>1.8jdk>
             activation>
             <properties>
                 <maven.compiler.source>1.8maven.compiler.source>
                 <maven.compiler.target>1.8maven.compiler.target>
                 <maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
             properties>
         profile>
     profiles>
 
     <dependencies>
         
         <dependency>
             <groupId>junitgroupId>
             <artifactId>junitartifactId>
             <version>4.12version>
             
             <scope>testscope>
         dependency>
     dependencies>
 project>


五、jar包的作用范围scope

常用的三个分别是compile,test,provided 作用范围如下表:

阶段 \ scopecompiletestprovided
编译×
测试
部署(运行)××

1、compile

  缺省值,如果不显式声明默认为compile,适用于所有阶段,会随着项目一起发布。

2、test

  jar包只在测试阶段需要,常见的jar比如说junit

3、provided

  jar包只在编译和测试时需要,这种比较少见,比如说servlet-api.jar,编译和测试时需要servlet 环境,但运行时由tomcat提供servlet环境,就不需要servlet-api.jar了

六、Maven依赖与依赖排除

1、Maven自动引入依赖

假如说我们需要用到A.jar,但是A.jar中又用到了B.jar,Maven会自动帮我们引入B.jar,最常见的例子就是spring-context.jar 了,大家可以自行尝试将下边依赖引入,Maven不仅会将spring-context.jar引入,还会将spring-aop.jar,spring-beans.jar等其他jar包一并引入。

<dependency>
             <groupId>org.springframeworkgroupId>
             <artifactId>spring-contextartifactId>
             <version>5.2.6.RELEASEversion>
 dependency>


 2、依赖排除的两种方案

但如果我们确实用不到其他jar但Maven又帮我们引入了,那该怎们办呢?


 <dependency>
             <groupId>org.springframeworkgroupId>
             <artifactId>spring-contextartifactId>
             <version>5.2.6.RELEASEversion>
             <exclusions>
                 <exclusion>
                     <groupId>org.springframeworkgroupId>
                     <artifactId>spring-coreartifactId>
                 exclusion>
                 <exclusion>
                     <groupId>org.springframeworkgroupId>
                     <artifactId>spring-beansartifactId>
                 exclusion>
                 <exclusion>
                     <groupId>org.springframeworkgroupId>
                     <artifactId>spring-aopartifactId>
                 exclusion>
             exclusions>
 dependency>
 
 
 
 <dependency>
             <groupId>org.springframeworkgroupId>
             <artifactId>spring-contextartifactId>
             <version>5.2.6.RELEASEversion>
             <exclusions>
                 <exclusion>
                     <groupId>*groupId>
                     <artifactId>*artifactId>
                 exclusion>
             exclusions>
 dependency>


七、Maven依赖传递与依赖原则

1、依赖传递

在数学上,若A依赖于B,B依赖于C,那么A依赖于C成立,但在Maven中还需要添加一个条件,要使 A.jar依赖于C.jar,当且仅当 B.jar 依赖于C.jar的范围是compile

创建maven项目A,B,其中B中引入junit.jar,然后将B用mvn install安装到本地仓库,再将B引入到A,改变junit的scope观察A中是否引入junit。

实验过程如上,读者可自行实验。

2、依赖原则

我们再来看下边三个案例,

(1)同一POM中引入同一jar包的不同版本时(不推荐这样做),会使用哪个版本呢?

(2)项目A->B,B->junit.jar(scope为compile),同时A->junit.jar,那么A中又会使用哪个jar呢?

(3)项目A依赖B和C,B和C都依赖了不同版本的junit.jar(scope为compile),那么A中会使用哪个jar呢?

前两个很好猜,第一个pom文件写在后边的jar会覆盖前边的jar。第二个会选择离自己最近的jar,也就是A中自己的jar。第三个同时也遵循 离自己最近的原则,但是两者距离一样,那怎么办呢?POM文件中对B和C的依赖声明总有先后顺序吧,那就采用先声明那个中的jar。

我们抛去第一个案例(开发中严禁这样做),来总结下规则:

(1)路径最近者优先。

(2)第一声明者优先。

八、Maven依赖继承

1、父项目


 <packaging>pompackaging>
 
 <dependencyManagement>
         <dependencies>
             <dependency>
                 <groupId>junitgroupId>
                 <artifactId>junitartifactId>
                 <version>4.12version>
                 <scope>compilescope>
             dependency>
         dependencies>
 dependencyManagement>


2、子项目


 <parent>
         <groupId>com.liu.learinggroupId>
         <artifactId>parentartifactId>
         <version>0.0.1-SNAPSHOTversion>
          
         
         <relativePath>../parent/pom.xmlrelativePath>
 parent>
 
 
 <dependencies>
         <dependency>
             <groupId>junitgroupId>
             <artifactId>junitartifactId>
         dependency>
 dependencies>


九、项目聚合

Maven项目能够识别自身和本地仓库中的项目,如果项目A依赖项目B,必须要把项目B进行打包安装放入本地仓库,然后再在项目A中引入才能使用。但是如果项目A依赖很多个其他项目,这样一一打包安装就比较麻烦了,这就引出了“聚合”。


 <packaging>pompackaging>
 
  
 <modules>
         <module>../onemodule>
         <module>../twomodule>
 modules>

 


十、统一管理版本

有时候开发项目过程会遇到版本号统一升级的问题,例如junit版本从3.0版本升级成4.12版 这个时候有两个处理办法

1、原始方案

在pom文件里统一 ctrl+f 搜索替换一下。

2、高级方案

使用pom里的properties标签,自定义一个 xxx 标签,标签内就是版本号,在需要使用的地方使用 ${xxx} 灵活取出上面定义的值,这个样子就不用那样修改多个地方啦!

<properties>
         <junit>4.12junit>
  properties>
 
     <dependencies>
         <dependency>
             <groupId>junitgroupId>
             <artifactId>junitartifactId>
             <version>${junit}version>
             <scope>compilescope>
         dependency>
     dependencies>





     




感谢点赞支持下哈 

浏览 38
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报