Maven配置与idea使用

为什么我们要学习maven?

maven解决的问题:

jar包难以寻找

网址https://maven.aliyun.com/mvn/search阿里云镜像仓库,快。https://mvnrepository.com/慢。下载下来,放到项目的lib下面,然后加到项目的classpath下面。

jar包依赖的问题

jar包一般都不是独立存在的,一般一些jar也会用到其他的jar。比如a.jar依赖于b.jar,而b.jar依赖c.jar,而c.jar又依赖于b.jar,当你用到a.jar的时候,你需要把其他3个也进入才可以,所以你用到一个jar的时候,你必须明确知道这些jar还会依赖于哪些jar,把他们都引入进来,否则项目是无法正常运行的,当项目用到很多jar的时候,我们是很难判断缺少哪些jar的,只有在项目运行过程报错了,才知道,这种也是相当痛苦的,浪费了大量时间。


jar包版本冲突问题

项目中用到了a.jar,a.jar依赖于c.jar的1.5版本,然后我们把这2个jar拷贝到项目中,后面又用到了b.jar,但是b.jar又依赖于c.jar的1.0版本,此时你把b.jar和c-1.0.jar引进来了,会发现c.jar有2个版本,发生冲突了,启动的时候会报错,这种情况你要着手去解决jar冲突的问题,也是非常痛苦的。


jar不方便管理

当我们的项目比较大的时候,我们会将一个大的项目分成很多小的项目,每个小项目由几个开发负责,比如一个电商项目分为:账户相关的项目、订单相关的项目、商品相关的项目,这些项目的结构都是类似的,用到的技术都是一样的:ssh(spring、springmvc、mybatis),然后每个项目都需要把这些jar拷贝一份到自己的项目目录中,最后10个项目只是jar就复制了10份,后来,我们发现项目中有些jar需要升级版本,打算替换一下,此时我们需要依次去替换10个项目,也是相当痛苦。


Maven是什么呢?

maven给每个jar定义了唯一的标志,这个在maven中叫做项目的坐标,通过这个坐标可以找到你需要用到的任何版本的jar包maven会自动解决jar依赖的问题,比如你用到了a-1.0.jar,而a-1.0.jar依赖于b-1.1.jar和c-1.5.jar,当我们通过maven把a-1.0.jar引入之后,b-1.1.jar和c-1.5.jar会自动被引入进来。maven可以很容易的解决不同版本之间的jar冲突的问题。


安装、配置、mvn运行过程详解

安装

下载地址http://maven.apache.org/download.cgi#

点击Download,找到如图:
在这里插入图片描述


下载后解压:放在你自己习惯放的路径。如放在:D:\apache-maven-3.6.3
在这里插入图片描述

配置环境变量

右击此电脑选择属性——>高级系统设置——>环境变量——>系统变量——>新建

变量名:Maven_Home 变量值:刚才解压存放文件夹的路径,我的是:D:\apache-maven-3.6.3

再找到 系统变量 下的Path——>点击编辑——>新建——>输入:%Maven_Home%\bin
在这里插入图片描述
在这里插入图片描述

打开cmd 输入:mvn -v
在这里插入图片描述

若有此图,说明安装成功。

配置settings文件

新建一个文件夹,如在D盘下的apache-maven-3.6.3文件夹下建一个local的文件夹,然后找到我们刚才解压的文件夹,点击conf——>找到settings用合适的编辑器打开,然后如图
在这里插入图片描述
这行输入的就是我们刚才新建文件夹的路径,注意这里是正斜杠/

输入后应为:
在这里插入图片描述

因为国外的服务器下载jar包很慢所以我们改为阿里云服务器
在这里插入图片描述

 <!-- 阿里云仓库 -->
        <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        </mirror>
     或者
      <mirror>
		<id>nexus-aliyun</id>
		<mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
	 </mirror>


添加镜像后的图片:
在这里插入图片描述
然后输入mvn system:help

若出现错误:
在这里插入图片描述
在控制台输入:mvn help:describe -Dplugin=help -e -X就解决了。

Idea创建项目

打开idea,点击 File->New->Project ,选择 Maven ,如下:
在这里插入图片描述
在这里插入图片描述

Maven目录
在这里插入图片描述

src/test/resources目录建立:

先在src/test目录下建立一个文件夹。右键test,选择New,选择Directory,命名为resources,然后右键resources文件夹,选择Mark Directoy as ,选择Resources Root。
在这里插入图片描述

target目录创建:

File——>settings——>Plugins——>先点击Marketplace——>再在搜索框中输入Maven Helper——>点击installed
在这里插入图片描述

安装完成后,在右边会有个Maven图标,点击图标,点击Lifecycle,点击install
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


目录目的
/src/main/java项目的java源代码
/src/main/resources项目的资源,比如说property文件,springmvc.xml
/src/test/java项目的测试类,比如说Junit代码
/src/test/resources测试用的资源
/target打包输出目录
/target/classes编译输出目录
/target/test-classes测试编译输出目录
Test.javaMaven只会自动运行符合该命名规则的测试类

idea中配置maven

在一个项目中,点击File->setting,找到如图并按图中配置
在这里插入图片描述


按前面顺序步骤操作完后:才可以添加依赖

添加依赖

从阿里云:https://maven.aliyun.com/mvn/search添加Maven依赖:
在这里插入图片描述

<dependency>
    <groupId>;.org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.0</version>
</dependency>

如果你就这样帮依赖复制到文件离去里面去,会报错,
在这里插入图片描述

错误提示的意思是:值为’; .org.apache.poi’的; .org.apache.poi:poi:jar的’dependencies.dependency.groupId’与有效的ID模式不匹配。

正确依赖为把 groupId标签里面的;去掉

<dependency>
    <groupId>.org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.0</version>
</dependency>

maven 坐标元素和依赖

一、坐标元素

Maven坐标为各种构件引入了秩序,任何一个构件都必须明确定义自己的坐标,而一组Maven坐标是通过一些元素定义的,它们是groupId、artifactId、version、packaging、classifier。

注意:

  • 上述5个元素中 groupId、artifactId、version 是必须定义的,packaging是可选的(默认为jar),而classifier是不能直接定义的。

  • 项目构件的文件名是与坐标相对应的,一般的规则为artifactId-version[-classifier].packaging,[-classifier]表示可选


1.groupId

定义当前Maven项目隶属的实际项目,groupId的表示方式与Java包名的表示方式类似,通常与域名反向一一对应。


2.artifactId

定义实际项目中的一个Maven项目(模块), 相 当 于 在 ⼀ 个 组 织 中 项 ⽬ 的 唯 ⼀ 标 识 符 。


3.version

定义Maven项目当前所处的版本,⼀ 个 项 ⽬ 的 版 本 。⼀ 个 项 ⽬ 的 话,可 能 会 有 多 个 版 本 。如 果 是 正 在 开 发 的 项 ⽬,我 们 可 以 给 版 本 号 加 上 ⼀ 个S N A P S H O T,表 ⽰ 这 是 ⼀ 个 快 照 版( 新 建 项 ⽬ 的 默 认 版 本 号 就 是 快 照 版 )


4.packaging

定义Maven项目的打包方式,使用构件的什么包。首先,打包方式通常与所生成构件的文件扩展名对应:定义该构件的打包方式.比如我们需要把项目打成jar包,采用 java -jar 去运行这个
jar包,那这个值为jar;若当前是一个web项目,需要打成war包部署到tomcat中,那这个值就是
war,可选(jar、war、ear、pom、maven-plugin),比较常用的是jar、war、pom,


5.classifier

用来帮助定义构建输出的一些附属构件。


二、依赖元素

根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个 dependency 就表示当前项目需要依赖的一个构件的信息。

每个依赖可以包含的元素有:

1.gav

groupId、artifactId和version:依赖的基本坐标

2.type

依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar。

3.scope

依赖的范围

依赖范围(Scope)对于编译classpath有效对于测试classpath有效对于运行时classpath有效典型的依赖案例
compileYYYspring-core
testYJUnit
providedYYservlet-api
runtimeYYJDBC驱动实现
systemYY

1)compile

编译依赖范围
如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。
典型的例子是spring-core,在编译、测试和运行的时候都需要使用该依赖。
(2)test

测试依赖范围。
使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。
典型的例子是JUnit,它只有在编译测试代码及运行测试的时候才需要。
(3)provided

已提供依赖范围。
使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。
典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍。
(4)runtime

运行时依赖范围。
使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。
典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
(5)system

系统依赖范围。
该依赖与三种classpath的关系,和provided依赖范围完全一致。但是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。
systemPath元素可以引用环境变量,

可以用来依赖本地jar,如:

	<dependency>
		<groupId>com.taobao</groupId>
		<artifactId>taobao-sdk-java-auto_1479188381469-20181016</artifactId>
		<version>4.0</version>
		<scope>system</scope>
		<systemPath>${project.basedir}/lib/taobao-sdk-java-auto_1479188381469-20181016.jar</systemPath>
	</dependency>

(6)import(Maven2.0.9及以上)

导入依赖范围。
该依赖范围不会对三种classpath产生实际的影响,

现实中可能存在这样的情况,A->B->C->Y(1.0),A->D->Y(2.0),此时Y出现了2个版本,1.0和2.0,此时
maven会选择Y的哪个版本?
解决这种问题,maven有2个原则:

依赖调解:

第一原则:路径最近者优先。

上面 A->B->C->Y(1.0),A->D->Y(2.0) ,Y的2.0版本距离A更近一些,所以maven会选择2.0。

第二原则:第一声明者优先。

但是如果出现了路径是一样的,如: A->B->Y(1.0),A->D->Y(2.0) ,谁的声明在最前面,就以谁的为主,比如 A->B 在前面,那么最后Y会选择1.0版本。

4.optional

optional标记依赖是否可选,该依赖只能在本项目中传递,不会传递到引用该项目的父项目中,父项目需要主动引用该依赖才行。

有这么一种情况:A->B中scope:compile   B->C中scope:compile

按照上面介绍的依赖传递性,C会传递给A,被A依赖。
假如B不想让CA自动依赖,可以怎么做呢?
dependency元素下面有个optional,是一个boolean值,表示是一个可选依赖 ,B->C时将这个值置为
true,那么C不会被A自动引入。

5,exclusions

exclusions用来排除传递性依赖

使用exclusions元素声明排除依赖,exclusions可以包含一个或者多个exclusion子元素,因此可以排除一个或者多个传递性依赖。需要注意的是,声明exclusion的时候只需要groupId和artifactId,而不需要version元素,

<dependencies>
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <groupId>sample.ProjectB</groupId>
          <artifactId>Project-B</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
</dependencies>

Maven 仓库

仓库的分类

本地仓库,远程仓库。
而远程仓库又分为:中央仓库、私服、其他公共远程仓库
在这里插入图片描述

当maven根据坐标寻找构件的时候,会首先查看本地仓库,如果本地仓库存在,则直接使用;如果本地不存在,maven会去远程仓库中查找,如果找到了,会将其下载到本地仓库中进行使用,如果本地和远程仓库都没有找到构件,maven会报错,构件只有在本地仓库中存在了,才能够被maven项目使用。

本地仓库

默认情况下,maven本地仓库默认地址是 ~/.m2/respository 目录,这个默认我们也可以在
~/.m2/settings.xml 文件中进行修改

我们之前修改过:

<localRepository>本地仓库地址</localRepository>

当我们使用maven的时候,依赖的构件都会从远程仓库下载到本地仓库目录中。

其他远程仓库

中央仓库是在国外的,访问速度不是特别快,所以有很多比较大的公司做了一些好事,自己搭建了一些maven仓库服务器,公开出来给其他开发者使用,比如像阿里、网易等等,他们对外提供了一些maven仓库给全球开发者使用,在国内的访问速度相对于maven中央仓库来说还是快了不少。

镜像的方式:

<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>

id:镜像的id,是一个标识
name:镜像的名称,这个相当于一个描述信息,方便大家查看
url:镜像对应的远程仓库的地址
mirrorOf:指定哪些远程仓库的id使用这个镜像,这个对应pom.xml文件中repository元素的id,
就是表示这个镜像是给哪些pom.xml文章中的远程仓库使用的,这里面需要列出远程仓库的id,多
个之间用逗号隔开, * 表示给所有远程仓库做镜像

私服

如果我们一个团队中有几百个人在开发一些项目,都是采用maven的方式来组织项目,那么我们每个人都需要从远程仓库中把需要依赖的构件下载到本地仓库,这对公司的网络要求也比较高,为了节省这个宽带和加快下载速度,我们在公司内部局域网内部可以架设一台服务器,这台服务器起到一个代理的作用,公司里面的所有开发者去访问这个服务器,这台服务器将需要的构件返回给我们,如果这台服务器中也没有我们需要的构件,那么这个代理服务器会去远程仓库中查找,然后将其先下载到代理服务器中,然后再返回给开发者本地的仓库。还有公司内部有很多项目之间会相互依赖,你可能是架构组的,你需要开发一些jar包给其他组使用,此时,我们可以将自己jar发布到私服中给其他同事使用,如果没有私服,可能需要我们手动发给别人或者上传到共享机器中,不过管理起来不是很方便。


Maven 常⽤命令

M a v e n 中 有 ⼀ 些 常 ⻅ 的 命 令,如 果 使 ⽤ E c l i p s e 需 要 ⼿ 动 敲 命 令,如 果 使 ⽤ I D E A 的 话,可 以 不 ⽤ 命 令,直 接 点 点 点 就 可 以 了

常⽤命令中⽂含义说明
mvn clean清理 这个命令可以⽤来清理已经编译好的⽂件
mvn compile编译 将 Java 代码编译成 Class ⽂件
mvn test测试 项⽬测试
mvn
package
打包
根据⽤⼾的配置,将项⽬打成 jar 包或者 war
mvn install安装 ⼿动向本地仓库安装⼀个 jar
mvn deploy上传 将 jar 上传到私服

这 ⾥ 需 要 注 意 的 是,这 些 命 令 都 不 是 独 ⽴ 运 ⾏ 的,它 有 ⼀ 个 顺 序 。举 个 简 单 例 ⼦ :
我 想 将 j a r 上 传 到 私 服,那 么 就 要 构 建 j a r,就 需 要 执 ⾏ p a c k a g e 命 令,要 打 包,当 然 也 需 要 测 试,那 就 要⾛ mvn test 命 令,要 测 试 就 要 先 编 译 . . . . .,因 此,最 终 所 有 的 命 令 都 会 执 ⾏ ⼀ 遍 。不 过,开 发 者 也 可 以 ⼿ 动配 置 不 执 ⾏ 某 ⼀ 个 命 令,这 就 是 跳 过 。⼀ 般 来 是,除 了 测 试,其 他 步 骤 都 不 建 议 跳 过
当 然,如 果 开 发 者 使 ⽤ 了 I D E A ,这 些 命 令 不 ⽤ ⼿ 动 敲,点 ⼀ 下 就 ⾏ :
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值