1. 为什么要使用Maven?

之前我们新建的项目,项目所要依赖的第三方jar包都在项目的类路径下(通常为lib目录),如下所示:

使用这种方式,我们无法知道第三方类库的依赖关系,比如导入一个特定的jar包时,可能此jar包还依赖于其他的jar包,其他的jar包又依赖于更多的jar包,这也是我们平常遇到的ClassNotFound异常的主要原因。

为了解决这个问题,我们急需引入一个项目构建工具。目前主流的项目构建工具有:Maven、Gradle等。

这里我们选择Maven作为项目构建工具。

2. Maven简介

Apache Maven是一个软件项目管理工具。

基于项目对象模型(Project Object Model,POM)的概念,Maven可用来管理项目的依赖、编译、文档等信息。

使用Maven管理项目时,项目依赖的jar包将不再包含在项目内,默认情况下集中放置在用户目录下的.m2文件夹下,不过这个路径可以自定义成自己喜欢的目录。

3. Maven安装

3.1 下载Maven

下载地址:http://maven.apache.org/

3.2 安装Maven

将下载好的apache-maven-3.6.0-bin.zip解压到自己喜欢的目录,我这边解压的目录为:E:\Program Files\apache-maven-3.6.0。

3.3 配置环境变量

环境变量弹窗打开方式:计算机--属性--高级系统设置--“高级”选项卡--环境变量。

1)新建系统环境变量MAVEN_HOME,值为:E:\Program Files\apache-maven-3.6.0(步骤2中解压的目录)

2)编辑系统变量Path,在最后增加:;%MAVEN_HOME%\bin

3.4 验证配置是否成功

打开cmd窗口,执行命令:mvn -version,如果能够正确的提示如下的版本信息,说明Maven配置成功。

3.5 修改Maven配置文件

打开maven下conf文件夹下的settings.xml文件,找到localRepository节点,配置本地Repository路径,我这里配置的是:E:\Java\MavenRepository。

<localRepository>E:/Java/MavenRepository</localRepository>

注意:文件中的路径和Windows下的路径不一样,拷贝过来后要将\替换为/,而且不能包含中文。

3.6 IDEA 配置Maven

打开IDEA后,依次打开File--Settings,然后按照如下图所示配置Maven:

注意:该设置仅针对当前项目。

4. Maven的pom文件

因为Maven是基于项目对象模型(Project Object Model,POM)的概念运作的,所以Maven的项目都有一个pom.xml文件用来管理项目的依赖以及项目的编译等功能。

4.1 dependencies元素

<dependencies>
</dependencies>

此元素包含项目需要依赖使用的多个<dependency></dependency>

4.2 dependency元素

<dependency></dependency>内部通过groupId、artifactId、version确定唯一的依赖,可以称这3个为坐标。

groupId:组织的唯一标识。

artifactId:项目的唯一标识。

version:项目的版本。

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

4.3 properties元素

<properties></properties>可以定义变量在dependency中引用,代码如下所示:

<properties>
<java.version>1.8</java.version>
<spring-framework.version>4.3.18.RELEASE</spring-framework.version>
</properties> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-framework.version}</version>
</dependency>

4.4 编译插件

Maven提供了编译插件,可在编译插件中设置Java的编译级别,代码如下:

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>

4.5 Maven运作方式

Maven会自动根据dependency中的依赖配置,直接通过互联网在Maven中心库(https://mvnrepository.com/)下载相关依赖包到本地Maven库,本地Maven库默认是用户目录的.m2目录,但上面我们已经把本地Maven库修改为了:E:\Java\MavenRepository。

如果你不知道你所依赖的jar包的dependency怎么写的话,可以到https://mvnrepository.com/网站检索。

5. 使用Maven管理Spring项目

5.1 项目添加Maven依赖

在IDEA中,选中项目根目录,依次点击右键-->Add Framework Support,然后在弹出的界面中选中Maven:

此时项目目录下,会生成一个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>groupId</groupId>
<artifactId>spring-action</artifactId>
<version>1.0-SNAPSHOT</version> </project>

这里,我将groupId的值修改成自己域名:com.zwwhnly。

<groupId>com.zwwhnly</groupId>
<artifactId>spring-action</artifactId>
<version>1.0-SNAPSHOT</version>

5.2 配置文件迁移

将之前的spring-config.xml配置文件迁移至src/main/resources目录下。

5.3 pom文件添加jar包依赖

打开File-->Project Structure-->Modules,将之前方式引入的第三方jar包删除:

然后通过pom文件添加jar包依赖:

<dependencies>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>com.github.stefanbirkner</groupId>
<artifactId>system-rules</artifactId>
<version>1.16.0</version>
</dependency>
</dependencies>

修改完pom文件记得点击“Import Changes”:

导入完成后的项目结构图为:

可以看出和之前的区别,现在的jar包都由Maven来管理,也可以查看项目的依赖树:

5.4 最终的pom文件

<?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>com.zwwhnly</groupId>
<artifactId>spring-action</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<java.version>1.8</java.version>
<spring-framework.version>4.3.18.RELEASE</spring-framework.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>com.github.stefanbirkner</groupId>
<artifactId>system-rules</artifactId>
<version>1.16.0</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

上面讲解的方式适用于新建项目时不是Maven项目,后续转为Maven项目的操作步骤。

其实,我们可以通过IDEA,直接新建Maven项目,然后修改pom文件为以上内容引入Spring等依赖(推荐该方式):

6. 源码及参考

源码地址:https://github.com/zwwhnly/spring-action.git,欢迎下载。

使用IntelliJ IDEA 配置Maven(入门)

[Java] Maven 安装和配置

用IDEA将普通Web项目转Maven项目

汪云飞《Java EE开发的颠覆者:Spring Boot实战》

Spring入门(四):使用Maven管理Spring项目的更多相关文章

  1. 使用Maven管理Spring

    原文链接: Spring with Maven原文日期: 2013年04月17日翻译日期: 2014年06月29日翻译人员: 铁锚 1. 概述本教程向您展示怎样通过 Maven 管理 Spring 的 ...

  2. 使用Maven管理Spring[转]

    原文链接: Spring with Maven 原文日期: 2013年04月17日 翻译日期: 2014年06月29日 翻译人员: 铁锚 翻译原文连接:http://blog.csdn.net/ren ...

  3. maven管理的项目出现Error configuring application listener of class org.springframework.web.context.ContextL

    eclipse里用maven管理的项目,在运行的时候出现 Error configuring application listener of class org.springframework.web ...

  4. 【Spring Framework】Spring入门教程(八)Spring的事务管理

    事务是什么? 事务:指单个逻辑操作单元的集合. 在操作数据库时(增删改),如果同时操作多次数据,我们从业务希望,要么全部成功,要么全部失败.这种情况称为事务处理. 例如:A转账给B. 第一步,扣除A君 ...

  5. [Spring Boot 系列] 集成maven和Spring boot的profile 专题

    maven中配置profile节点: <project> .... <profiles> <profile> <!-- 生产环境 --> <id& ...

  6. [Spring Boot 系列] 集成maven和Spring boot的profile功能

    由于项目的需要, 今天给spirng boot项目添加了profile功能.再网上搜索了一圈,也没有找到满意的参考资料,其实配置并不难,就是没有一个one stop(一站式)讲解的地方,所以有了写这篇 ...

  7. Spring系列(四) 面向切面的Spring

    除了IOC外, AOP是Spring的另一个核心. Spring利用AOP解决应用横切关注点(cross-cutting concern)与业务逻辑的分离, 目的是解耦合. 横切关注点是指散布于代码多 ...

  8. Spring学习(四)--面向切面的Spring

    一.Spring--面向切面 在软件开发中,散布于应用中多处的功能被称为横切关注点(cross- cutting concern).通常来讲,这些横切关注点从概念上是与应用的业 务逻辑相分离的(但是往 ...

  9. 对于Maven管理的项目制定虚拟目录

    基于Maven管理的web项目结构: target目录是用来存放项目打包之后生成的文件的目录,此目录中的文件必须调用mvn clean package后才能生成, 如果把虚拟目录设置在此目录中,则每次 ...

随机推荐

  1. iOS移动开发周报-第19期

    iOS移动开发周报-第19期 前言 欢迎国内的iOS同行或技术作者向我提交周报线索,线索可以是新闻.教程.开发工具或开源项目,将相关文章的简介和链接在微博上发布并 @唐巧_boy 即可. [摘要]:本 ...

  2. Linux中的du和df命令

    现在也将前阵子学习到du/df两个命令总结一下吧.前阵子测试工作中有遇到过由于磁盘空间满导致程序无法执行到情况,所以使用了df和du两个命令. du查看目录大小,df查看磁盘使用情况.我常使用的命令( ...

  3. js thiskeyword

    相信大家都接触过this了,那么 this究竟是什么意思呢?看其字面意思就是个代词.指代其它的一些东西. 那么我们在程序其中,事实上也是一样.this也是个代词. 比方我们在java其中,this的k ...

  4. 继承的文本框控件怎么响应EN_CHANGE等消息

    继承的文本框控件如何响应EN_CHANGE等消息?我从CEdit继承了一个CMyEdit类,想在这个类里填写它的一些消息.我在消息映射表里写的是MESSAGE_HANDLER(EN_CHANGE, O ...

  5. 基于注解的Sping AOP详解

    一.创建基础业务 package com.kang.sping.aop.service; import org.springframework.stereotype.Service; //使用注解@S ...

  6. 在yum出问题的情况下安装某个rpm包的方法

    1 核心命令 rpm -i 2 方法 centos镜像站去找到所有的rpm包. 安装这个rpm包,发现有一个依赖没有安装,就去下载安装.因为整体的包是有限的,因此终会收敛的. 比如安装rpmbuild ...

  7. throws ? catch checked unchecked

    ThrowableClass Error  (unchecked) Exception IOException (checked) RuntimeException (unchecked) publi ...

  8. spark 划分stage Wide vs Narrow Dependencies 窄依赖 宽依赖 解析 作业 job stage 阶段 RDD有向无环图拆分 任务 Task 网络传输和计算开销 任务集 taskset

    每个job被划分为多个stage.划分stage的一个主要依据是当前计算因子的输入是否是确定的,如果是则将其分在同一个stage,从而避免多个stage之间的消息传递开销. http://spark. ...

  9. AndroidSlideTest.java

    以下代码使用ApiDemos-debug.apk进行测试 package com.saucelabs.appium; import io.appium.java_client.AppiumDriver ...

  10. Juery插件-- jquery.cookie.js

    1.引入jquery <script src="scripts/jquery-1.8.8.js" type="text/javascript">&l ...