Maven学习笔记

一、Maven是什么?有什么优点?

Maven介绍

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

Maven优点

  • 解决jar包冲突的问题
  • 解决jar包依赖的问题
  • jar文件不用在每个项目保存,只需要放在仓库
  • maven可以指定jar的依赖范围

二、Maven目录结构

在这里插入图片描述
Maven创建项目的的目录结构大体如图所示,src下包含main和test目录,这两个目录下又包含java和resources目录,分别存放项目的代码以及测试的代码
target目录下的class目录则是存放编译后的代码
而Maven的核心文件pom.xml便是资源文件,确定该项目需要使用哪些jar包的坐标,并通过该坐标在中央仓库进行自动下载。

三、利用Idea开发工具创建Maven项目

这里以创建Maven-web项目为例

四、配置本地仓库

首先本地仓库是什么?

英文名为localRepository,它是用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找。
在这里插入图片描述
作为使用者,我们往往想指定自己创建的一个目录作为本地仓库,那我们应该怎么做呢?
做法其实很简单,我们找到Maven安装目录下的conf目录下的settings.xml
然后修改settings.xml文件的内容
在这里插入图片描述
在框中的标签里将你指定的目录地址替换掉就ok了,这样以后通过Maven下载的jar包都会存在这里,当本地仓库没有对应的jar包的时候,Maven会自己去中央仓库中寻找并下载到本地仓库。

五、有关Maven常用的项目构建命令

下图表格是Maven常用的项目构建命令

命令描述
mvn clean清除项目原来的编译结果
mvn compile编译源文件
mvn test运行测试代码
mvn package打包项目war/jar
mvn install打包并安装到本地仓库
mvn deploy发布到本地仓库或者服务器

六、Maven坐标

Maven坐标的主要组成
groupId:定义当前Maven项目的隶属项目、组织
artifactId:定义实际项目的一个模块
version:定义当前项目的版本
packaging:定义该项目的打包方式(jar/war,默认为jar)
例子:

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.15</version>
</dependency>

那我们如何去让Maven自动下载我们想要的jar包
首先我们去官网https://mvnrepository.com/在里面搜索我们想要的jar包
比如 mysql-connector-java这个包
在这里插入图片描述
然后点击search,点击下图所示
在这里插入图片描述
这里有这个包的各种版本,点击你想要的的版本
在这里插入图片描述
然后就能看到对应的坐标了,将这个坐标信息复制到pom.xml文件的dependencses标签下,Maven就会自动下载jar包并放进本地仓库
在这里插入图片描述

七、Maven的依赖范围

在每个dependency标签里面都有一个子标签scope
他有以下几个属性
在这里插入图片描述

  1. compile:编译域,这个是Maven中scope的默认值,不写scope配置时默认就是使用这个值,compile表示被依赖项目需要同当前项目编译时一起编译,项目测试期以及本项目运行时同样生效,打包的时候需要包含进去
  2. test:测试域,表示被依赖的项目仅仅在项目进行测试时生效,项目运行时不会生效
  3. provided:表示打包的时候不用讲provided域的包打进去
  4. runtime:运行域,表示被依赖的项目不会参与项目的编译,但项目的测试时期和运行时期会参与,与compile相比,跳过了编译时期。
  5. system:跟provide相似,但是在系统中要以外部jar包的形式提供,Maven不会在仓库中查找它
  6. import:只使用在< dependencyManagement >中,表示从其他pom文件中导入dependency的配置

八、Maven可选依赖和依赖排除

可选依赖:是否希望将该依赖向下传递? 默认为false,向下传递,如果选择true则不向下传递

<!-- spring-boot-devtools -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>

排除依赖:

如果一个项目A依赖另一个项目B时,会将B项目的依赖jar包都会依赖。

但如果不想依赖B项目中的某一个依赖时,可设置exclusions排除指定的依赖

<!-- 定时任务 -->
<dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz</artifactId>
   <exclusions>
      <exclusion>
         <groupId>com.mchange</groupId>
         <artifactId>c3p0</artifactId>
      </exclusion>
   </exclusions>

九、Maven项目的继承

作用:在使用的时候子工程直接继承父工程的版本号,子工程中不再需要指定版本号,方便统一管理项目的依赖版本问题。
下面用代码展示
首先创建一个父工程

<?xml version="1.0" encoding="UTF-8"?>
<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>org.learn.maven</groupId>
    <artifactId>mavendemo-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mavendemochild</module>
    </modules>
    <packaging>pom</packaging>
    <description>父工程</description>
 
    <!--抽取子工程的依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.1.7.RELEASE</version>
            </dependency>
 
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.1.7.RELEASE</version>
            </dependency>
 
        </dependencies>
 
    </dependencyManagement>
 
 
</project>

我们可以看到有一个dependencyManagement标签,父工程在这个标签下定义子工程依赖的jar包

然后再创建一个子工程

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <!--引用父工程-->
    <parent>
        <artifactId>mavendemo-parent</artifactId>
        <groupId>org.learn.maven</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
 
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>org.learn.maven</groupId>
    <artifactId>mavendemochild</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
 
    </dependencies>
</project>

这个时候子工程的坐标中就不需要定义version这个标签了,由父类统一管理
同时要注意子类的pom.xml文件中parent标签里要将父工程的坐标复制过去

十、Maven的聚合

Maven:将多个Maven模块整合在一起称为聚合
好处:可以将多个模块整体运行,不需要先将被依赖的模块打包至仓库再运行项目。

假如MavenA 依赖MavenB,如果只是在MavenA模块的pom.xml中dependency MavenB,则必须先将MavenB安装并打包至仓库。
通常我们会新创建一个聚合项目,这个项目作为一个载体将项目的所有的模块都整合在一起。

我们只需要在这个载体上加上

<modules>
    <module>MavenA</module>
    <module>MavenB</module>
</modules>

下面举个例子:
首先创建mavendemoservice项目
pom.xml文件如下

<?xml version="1.0" encoding="UTF-8"?>
<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>org.learn.maven</groupId>
    <artifactId>mavenservice</artifactId>
 
 
</project>

创建mavenweb模块,增加service的依赖,但是我们此前是没有把mavendedoservice这个模块install进仓库的
pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<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>org.learn.maven</groupId>
    <artifactId>mavenweb</artifactId>
 
    <!--依赖Service模块-->
    <dependencies>
        <dependency>
            <groupId>org.learn.maven</groupId>
            <artifactId>mavenservice</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

再创建一个作为载体的工程
pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<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>org.learn.maven</groupId>
    <artifactId>mavendemo-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mavenservice</module>
        <module>mavenweb</module>
    </modules>
    <packaging>pom</packaging>
    <description>父工程</description>
 
    <!--抽取子工程的依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.1.7.RELEASE</version>
            </dependency>
 
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.1.7.RELEASE</version>
            </dependency>
 
        </dependencies>
 
    </dependencyManagement>
 
</project>

在modules标签下创建module,注意module里面写的是要聚合项目的路径,可以用相对路径

本篇文章依旧是作为个人的学习笔记,如有见解不到之处还望指教

有蛮多内容是从这个博客学习的,附上链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值