maven入门

maven

项目管理工具

下载。配置环境变量

目录结构:

bin目录:存放执行文件,是一些命令,IDEA直接集成Maven

config目录:Maven核心配置文件 settings.xml

lib、boot目录:放启动用的jar包

Maven仓库

Maven仓库是基于 简单文件系统存储的,集中化管理Java API资源(构件)的 一个 服务。

仓库中的任何一个构件(jar包的集合)都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。

Maven可以在某个位置统一存储所有的Maven项目共享的构件,这个统一的位置就是仓库(仓库分为:远程仓库、本地仓库);项目构件完毕后生成的构件也可以安装或者部署到仓库中,供其他项目使用。比如说:B项目要引用A项目,直接在B项目的pom.xml添加A项目的坐标,通过这个坐标就可以访问到A项目。

在项目配置了 坐标 之后,就会去 远程仓库 里找坐标对应的jar包,然后下载到本地仓库,项目会读取本地仓库对应的jar包使用

远程仓库

不在本机中的一切仓库,都是远程仓库:分为中央仓库和本地私服仓库。

远程仓库指通过各种协议如 file:// 和 http:// 访问的仓库。这些仓库可以是第三方搭建的真实的远程仓库,用来提供构件的下载。 这些“远程”也可以是公司建立在文件或者HTTP服务器上的内部仓库(公司的私服,在局域网搭建的Maven仓库),用来 开发团队间 共享私有构件和管理。

默认的远程仓库是Apache提供的中央仓库

本地仓库

  • 存储远程仓库下载jar

  • 自己项目的jar(尚未发布的临时构件)也会存储

仓库配置

config目录 settings.xml

  1. 配置本地仓库的位置
                <!--写自己的!-->  
<localRepository>E:\javaMvn</localRepository>
  1. 配置阿里镜像
<!--<mirrors>标签里配置:-->

<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

仓库优先级别

2021-04-17_114551

JDK的配置

当idea中有多个jdk时,需要值定 编译和运行的jdk

<!--<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>

到此,settings.xml中:配置了三个信息:

  1. 本地仓库
  2. 镜像仓库
  3. JDK

Maven工程

可以使用 <packaging>pom</packaging> 来指定工程类型。

  1. POM工程

POM工程是逻辑工程,用在 父级工程 或 聚合工程中。用来做jar包的版本控制

父工程:父工程定义通用jar包,设置好版本,子工程继承父工程即可使用父工程通用jar包。

聚合工程:一个父工程 管理N个具体的工程。

  1. JAR工程

将会打包成jar,用作jar包使用。即常见的本地工程 ——>Java Project。

  1. WAR工程

将会打成war,发布在服务器上的工程。

Idea中创建Maven工程

2021-04-17_122348

标准的maven工程目录结构

2021-04-17_122641

--MavenDemo项目名
  --.idea 项目的配置,自动生成,无需关注
  --src
    --mian 实际开发内容
      --java 写 包 和 java代码,此文件默认只编译.java文件
      --resource 所有配置文件。最终编译把配置文件放入到classpath中
    --test 测试包,可以写测试的内容,新建resource测试包、mapper测试包 等
      --java 写测试类
        --mapper测试包 等等
  --target 存放 编译后的内容(.class文件)
  pom.xml 整个maven项目所有配置内容

新建maven项目可以执行 maven下的install生成target目录

2021-04-17_124515

POM模式 Maven工程关系

Maven工具基于POM(Project Object Model 项目对象模型)模式实现。Maven中每个项目相当于一个对象,项目间的关系:依赖、继承、聚合。Maven项目可以更加方便的实现导jar包、拆分项目等效果。

2021-04-18_105817

依赖

【1】

A工程运行、开发过程中需要B工程提供支持:A工程依赖B工程。

这种情况下,需要在A项目的pom.xml中增加 配置B的坐标。

2021-04-17_143644

通俗理解:导jar包。

B工程可以是 自己的项目打包后的jar包,也可以是 中央仓库的jar包。

【2】如何注入依赖?

在pom.xml文件 配置坐标。dependencies标签可以配置N个dependence元素以声明依赖。每个依赖dependence标签都应该包含一下元素:groupIdartifactIdversion (依赖的基本坐标),对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。

【3】好处:

省去手动添加jar包的操作。

可以帮我们解决jar包冲突问题。

依赖的传递性

Since Maven2.0。假设你的项目依赖于一个库A,而这个库又依赖于其他库,你不必自己去找出所有这些依赖,你只需添加直接依赖的库A,Maven会隐式的把这些间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的 依赖库的项目文件 实现的。一般的,这些项目的所有依赖都会加入到项目中,或者从父项目继承,或者通过传递性依赖。

如果A依赖了B,那么C依赖A时,会自动把A和B都导入进来:

2021-04-17_160752

案例【1】:

项目A中导入

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

即项目A依赖了mybatis-plus的内容。

案例【2】:

将项目A打包为jar包——>重新打包(因为可能做了修改)——>IDEA maven Lifecycle clean 、install

2021-04-17_180119

让项目B依赖项目A。

在项目B的pom.xml里导入

    <!--将A的坐标注入-->
    <dependencies>
        <dependency>
            <artifactId>study</artifactId>
            <groupId>A</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

会发现项目B不仅导入了项目A,而且把项目A依赖的mybatis-plus的内容也导入了。

两个原则

【1】第一原则:最短路径优先

项目依赖关系树中 路径最短的版本会被使用。

例如:有以下依赖关系: A—依赖于—>B——>C——>D(2.0版本) 和 A——>E——>D(1.0版本)。那么D(1.0版本)会被使用。因为A通过E到D的路径最短。

【2】第二原则:最先声明

依赖路径长度是一样的时候,第一原则不能解决问题。最先声明原则:在路径长度相等的情况下,在pom中依赖声明的顺序决定了谁会被解析使用,先声明的会被使用。

例如:有以下依赖关系: A—依赖于—>B——>D(2.0版本) 和 A——>E——>D(1.0版本)。依赖关系树中 路径都是2。那么D(2.0版本)会被使用。

排除依赖

A项目依赖了mybatis-plus,让项目B依赖项目A,但是B不需要mybatis-plus的内容,使用、标签进行排除依赖

    <dependencies>
        <dependency>
            <artifactId>study</artifactId>
            <groupId>A</groupId>
            <version>1.0-SNAPSHOT</version>
            <!--排除依赖,可以排除多个-->
            <exclusions>
                <exclusion>
                    <groupId>com.baomidou</groupId>
                    <artifactId>mybatis-plus-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
依赖范围

依赖范围决定了依赖的坐标 在什么情况下有效,什么情况下无效。标签。

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
            <scope>compile</scope>
        </dependency>
compile

默认范围。范围:表示该依赖在 **编译和运行**时都生效。

provided

已提供 依赖范围。范围:编译和测试 时生效。

典型例子:servlet-api,编译和测试项目的时候需要该依赖,但是在运行项目时,由于Tomcat容器已经提供,就不需要Maven重复地引入一遍,不然会出错。

runtime

范围:编译时不需要生效,只在 运行 时生效。

典型例子:JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在测试或者运行项目时才需要实现上述接口的具体JDBC驱动。

system

必须通过 标签 显示指定一个 本地系统路径的Jar。范围:在 各个阶段 都生效。

当不想使用本地仓库的,不想使用远程仓库的,不想使用镜像库的依赖时,目标依赖在本机的某个位置

test

范围:在 编译测试代码 和 运行**测试**代码 时生效。

典型例子:Junit 在测试时才需要,导出项目时没必要把junit的东西导出。

import

范围:只能在 生效。

指定的POM工程(逻辑工程)必须使用部分的依赖。

案例:

定义一个父工程(POM工程):

2021-04-18_104001

定义一个子工程:

把父工程打打成一个jar包 ——>IDEA maven Lifecycle install
2021-04-18_104328

继承

本质上:就是POM的继承

如果A工程继承B工程,则代表A工程默认依赖 B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。

被继承的(B)工程只能是POM工程。

聚合

当我们开发的工程拥有2个以上模块的时候,每一个模块都是一个独立的功能集合。 比如某大学系统中有搜索平台、学习平台、考试品台等。开发的时候每个平台都可以独立编译、测试、运行。这个时候我们就需要一个聚合工程。

聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含,且父项目类型为POM类型,同时在父项目的pom.xml中出现****表示包含的所有子模块。

案例:

父工程为POM工程:

2021-04-18_113733

具体模块:

2021-04-18_113936

常见插件

编译器插件

在pom.xml中添加:

<!-- 配置maven的编译插件  -->
    <build>
        <plugins>
            
            <!--  JDK编译插件  -->
            <plugin>
                <!--  插件坐标  -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <!--  源代码使用JDK版本  -->
                    <source>11</source>
                    <!--  源代码编译为class文件的版本,要保持跟上面版本一直  -->
                    <target>11</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            
        </plugins>
    </build>

资源拷贝插件

Maven在打包的时候默认只将src/main/resource里的配置文件(非.java文件)打包编译到 target/classes里。

配置文件一般放在src/main/resource 下

打包后的配置文件就会在target/classes下:

2021-04-18_121826

把非resource的配置文件也打包到classes下:

需要在pom.xml配置:

    <build>
        <resources>
        <!--  把  非resources下  的配置文件打包到classes -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        <!--  把  resources下  的配置文件打包到classes -->
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

2021-04-18_122808

Tomcat插件

如果我们创建war项目,必然要部署在服务器上,方式:

【1】、部署在远程服务器上

【2】、将IDEA和外部tomcat产生关联,然后将项目部署在tomcat上

本节的方式:maven提供的tomcat插件。

创建一个war项目(web项目):

2021-04-18_140822

2021-04-18_140923

在pom.xml添加tomcat插件:

  <build>
    <plugins>

        <!-- tomcat插件控制 -->
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <!--端口控制-->
                <port>888</port>
                <!--项目路径控制意味着http://localhost:888/abc-->
                <path>/abc</path>
                <!--编码-->
                <uriEncoding>UTF-8</uriEncoding>
            </configuration>
        </plugin>

    </plugins>
  </build>

启动命令:

2021-04-18_151342

访问http://localhost:888/abc

Maven常见命令

2021-04-18_152652

install

本地安装。包含 编译,打包,安装到本地仓库

编译 命令: -javac

打包 命令: -jar ,将java代码打包为jar文件

安装到本地仓库 将打包的jar文件,保存到本地仓库目录中

clean

清除已编译信息

删除工程中的target目录

compile

只编译。 命令: -javac

package

打包。包含编译,打包。

install 和 package 的区别:

package 命令完成了项目 编译、单元测试、打包 功能,但没有把打包好的可执行的jar包(war包等)部署到本地maven仓库和maven私服仓库。

</plugins>
```

启动命令:

[外链图片转存中…(img-Mq4beDWL-1618734819619)]

访问http://localhost:888/abc

Maven常见命令

[外链图片转存中…(img-rSax1rFe-1618734819621)]

install

本地安装。包含 编译,打包,安装到本地仓库

编译 命令: -javac

打包 命令: -jar ,将java代码打包为jar文件

安装到本地仓库 将打包的jar文件,保存到本地仓库目录中

clean

清除已编译信息

删除工程中的target目录

compile

只编译。 命令: -javac

package

打包。包含编译,打包。

install 和 package 的区别:

package 命令完成了项目 编译、单元测试、打包 功能,但没有把打包好的可执行的jar包(war包等)部署到本地maven仓库和maven私服仓库。

install 命令完成了项目 编译、单元测试、打包 功能,同时把打包好的可执行的jar包(war包等)部署到本地maven仓库,但没有部署到远程maven私服仓库(可以用deploy命令)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值