Maven

1、使用Maven后每个jar包只在本地仓库中保存一份,需要jar包的工程只需要维护一个文本形式的jar包的引用——我们称之为“坐标”。

2、Maven就可以替我们自动的将当前jar包所依赖的其他所有jar包全部导入进来,无需人工参与,节约了我们大量的时间和精力。用实际例子来说明就是:通过Maven导入commons-fileupload-1.3.jar后,commons-io-2.0.1.jar会被自动导入,程序员不必了解这个依赖关系。

3、使用Maven就可以自动的处理jar包之间的冲突问题。因为Maven中内置了两条依赖原则:最短路径者优先和先声明者优先;

4、使用Maven我们可以享受到一个完全统一规范的jar包管理体系。你只需要在你的项目中以坐标的方式依赖一个jar包,Maven就会自动从中央仓库进行下载,并同时下载这个jar包所依赖的其他jar包——规范、完整、准确!一次性解决所有问题!

5、将项目拆分成多个工程模块;Maven的依赖管理机制。

上层模块依赖下层,所以下层模块中定义的API都可以为上层所调用和访问。

6、在实际生产环境中,项目规模增加到一定程度后,可能每个模块都需要运行在独立的服务器上,我们称之为分布式部署;

Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。在JavaEE开发的历

史上构建工具的发展也经历了一系列的演化和变迁:

Make→Ant→Maven→Gradle→其他……

通过浏览器访问Java程序时就必须将包含Java程序的Web工程编译的结果“拿”到服务器上的指定目录下,并启动服务器才行。这个“拿”的过程我们叫部署

我们可以将未编译的Web工程比喻为一只生的鸡,编译好的Web工程是一只煮熟的鸡,编译部署的过程就是将鸡炖熟。

Web工程和其编译结果的目录结构对比见下图:

构建就是以我们编写的Java代码、框架配置文件、国际化等其他资源文件、JSP页面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。

构建环节

1)         清理:删除以前的编译结果,为重新编译做好准备。

2)         编译:将Java源程序编译为字节码文件。

3)         测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。

4)         报告:在每一次测试后以标准的格式记录和展示测试结果。

5)         打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。

6)         安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。

7)         部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。

Maven的九个核心概念展开:

1) POM(Project Object Model:项目对象模型。);

2)约定的目录结构;

3)坐标;

使用如下三个向量在Maven的仓库中唯一的确定一个Maven工程。
[1]groupId:公司或组织的域名倒序+当前项目名称
[2]artifactId:当前项目的模块名称
[3]version:当前模块的版本
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>

4) 依赖管理;  5) 仓库管理;  6)生命周期;  7)插件和目标;   8)继承;  9) 聚合

Maven程序

1) 第一步:创建约定的目录结构(约定>配置>编码;Maven正是因为指定了特定文件保存的目录才能够对我们的Java工程进行自动化构建。)

Hello

src

——main(目录用于存放主程序。)

———— java(目录用于存放源代码文件。)

————resources(目录用于存放源代码文件。)

——test(目录用于存放测试程序。)

————java(目录用于存放源代码文件。)

————resources(目录用于存放源代码文件。)

pom.xml

2) 第二步:创建Maven的核心配置文件pom.xml

<?xml version="1.0" ?>
<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.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version> <name>Hello</name> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

3)  第三步:编写主代码

在src/main/java/com/atguigu/maven目录下新建文件Hello.java

package com.atguigu.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}

4) 第四步:编写测试代码

在/src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java

package com.atguigu.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("litingwei");
assertEquals("Hello litingwei!",results);
}
}

5) 第五步:运行几个基本的Maven命令

打开cmd命令行,进入Hello项目根目录(pom.xml文件所在目录)执行mvn compile命令,查看根目录变化
cmd 中继续录入mvn clean命令,然后再次查看根目录变化
cmd 中录入 mvn compile命令, 查看根目录变化
cmd 中录入 mvn test-compile命令, 查看target目录的变化
cmd 中录入 mvn test命令,查看target目录变化
cmd 中录入 mvn package命令,查看target目录变化
cmd 中录入 mvn install命令, 查看本地仓库的目录变化

本地仓库

1)    配置本地仓库
1) Maven的核心程序并不包含具体功能,仅负责宏观调度。具体功能由插件来完成。Maven核心程序会到本地仓库中查找插件。如果本地仓库中没有就会从远程中央仓库下载。此时如果不能上网则无法执行Maven的具体功能。为了解决这个问题,我们可以将Maven的本地仓库指向一个在联网情况下下载好的目录。
2) Maven默认的本地仓库:~\.m2\repository目录。
Tips:~表示当前用户的家目录。
3) Maven的核心配置文件位置:
解压目录\ D:\DevInstall\apache-maven-3.2.2\conf\settings.xml
4) 设置方式
<localRepository>以及准备好的仓库位置</localRepository>
<localRepository>D:\RepMaven</localRepository>

解决maven test命令时console出现中文乱码乱码

<build>
<plugins>
<!-- 解决maven test命令时console出现中文乱码乱码 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.2</version>
<configuration>
<forkMode>once</forkMode><!--在一个进程中进行所有测试 ; 默认值:once -->
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
</plugins>
</build>

依赖管理

依赖的范围

1)  compile

[1]main目录下的Java代码可以访问这个范围的依赖

[2]test目录下的Java代码可以访问这个范围的依赖

[3]部署到Tomcat服务器上运行时放在WEB-INF的lib目录下

例如:对Hello的依赖。主程序、测试程序和服务器运行时都需要用到。

2)  test

[1]main目录下的Java代码不能访问这个范围的依赖

[2]test目录下的Java代码可以访问这个范围的依赖

[3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下

例如:对junit的依赖。仅仅是测试程序部分需要。

3) provided

[1]main目录下的Java代码可以访问这个范围的依赖

[2]test目录下的Java代码可以访问这个范围的依赖

[3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下

例如:servlet-api在服务器上运行时,Servlet容器会提供相关API,所以部署的时候不需要。

4) 其他:runtime、import、system等。

各个依赖范围的作用可以概括为下图:

依赖的传递性

当存在间接依赖的情况时,主工程对间接依赖的jar可以访问吗?这要看间接依赖的jar包引入时的依赖范围——只有依赖范围为compile时可以访问。

Maven工程    依赖范围    对A的可见性
A B C compile √
D test ×
E provided ×

比如

      <dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope> <!-- 默认是可传递的,可不写 -->
</dependency>
       <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope> --->>不具备传递性,所以每个pom.xml里面都要写。
</dependency>

依赖的原则:解决jar包冲突

1)  路径最短者优先

A依赖B,B依赖C; 则优先使用B中的jar包;

2) 路径相同时先声明者优先

A依赖B,B依赖C,

A依赖D; B和D都是直接依赖,谁先在dependency标签中声明,优先引用谁的jar包。

这里“声明”的先后顺序指的是dependency标签配置的先后顺序。

依赖的排除

有的时候为了确保程序正确可以将有可能重复的间接依赖排除。请看如下的例子:

假设当前工程为public,直接依赖environment。

environment依赖commons-logging的1.1.1对于public来说是间接依赖。

当前工程public直接依赖commons-logging的1.1.2

加入exclusions配置后可以在依赖environment的时候排除版本为1.1.1的commons-logging的间 接依赖

<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>Environment</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 依赖排除,排除commons-logging的所有版本,不加的话你直接引用1.1.2的版本,那么其他间接引用的版本也会加到下面 -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 加上你所要引用的版本, -->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.2</version>
</dependency>

统一管理目标jar包的版本

如果我们想要将这些jar包的版本统一升级为4.1.1,是不是要手动一个个修改呢?显然,我们有统一配置的方式:

把version自动动态的获取获取

<properties>
<spring.version>4.1.1.RELEASE</spring.version>
</properties>
把下面用到的用${ }加上去

  <version>${spring.version}</version>

继承

由于非compile范围的依赖信息是不能在“依赖链”中传递的,所以有需要的工程只能单独配置。例如:junit的test

此时如果项目需要将各个模块的junit版本统一为4.9,那么到各个工程中手动修改无疑是非常不可取的。使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。

创建父工程和创建一般的Java工程操作一致,唯一需要注意的是:打包方式处要设置为pom。

在子工程中引用父工程;在父工程中管理依赖 

<!-- 在父工程中统一管理jar包管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement> 在子工程的pom.xml中
<!-- 配置父工程 -->
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 从当前子工程的pom.xml出发,查找父工程的pom.xml的路径 -->
<relativePath>../Parent/pom.xml</relativePath> </parent>

聚合

将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行clean操作。而使用了聚合之后就可以批量进行Maven工程的安装、清理工作。

<!-- 聚合 -->
<modules>
<!-- 配置各个模块的相对路径 -->
<module>../MakeFriend</module>
<module>../OurFriend</module>
<module>../HelloFriend</module>
<module>../Hello</module>
</modules> [INFO] Parent ............................................. SUCCESS [ 0.402 s]
[INFO] Hello .............................................. SUCCESS [ 5.143 s]
[INFO] HelloFriend ........................................ SUCCESS [ 2.329 s]
[INFO] OurFriend .......................................... SUCCESS [ 0.124 s]
[INFO] MakeFriend ......................................... SUCCESS [ 0.069 s]

WebMaven工程

创建简单的Maven工程,打包方式选war包

在Idea中的配置:

Maven酷站

我们可以到http://mvnrepository.com/搜索需要的jar包的依赖信息。

http://search.maven.org/

Maven报错信息收集:

maven项目添加pom依赖后,一直不能正常导入所依赖的jar包,并且报错“ Auto build completed with errors”

工具Maven的更多相关文章

  1. 项目管理及自动构建工具Maven

    项目管理及自动构建工具Maven 一.Maven安装.目录结构.cmd命令1.下载安装apache-maven-3.2.3-bin.zip下载:http://maven.apache.org/down ...

  2. 构建工具maven

     构建工具maven  =UTF-8''Gradle Effective Implementation Guide.pdf: http://www.t00y.com/file/76854506 b ...

  3. idea工具maven生命周期clean,compile,install,package区别

    idea工具maven projects里面有9种生命周期,今天刚好遇到,顺便分享下自己的理解.生命周期是包含在一个项目构建中的一系列有序的阶段.最常用的两种打包方法:一:clean,package( ...

  4. ③---Java项目管理工具MAVEN安装与配置

    Java项目管理工具MAVEN安装配置以下将为大家介绍Java项目管理工具MAVEN安装及其配置. 一.下载MAVEN安装文件 maven下载地址:https://maven.apache.org/d ...

  5. idea工具maven生命周期clean,install,package等区别

    idea工具maven projects里面有9种生命周期,生命周期是包含在一个项目构建中的一系列有序的阶段. 一.最常用的两种打包方法: 1.clean,package(如果报错,很可能就是jar依 ...

  6. 着重基础之—构建工具—Maven的依赖管理

    着重基础之—构建工具—Maven的依赖管理 项目构建利器Maven给我们开发人员带来了极大的便利,从繁琐的jar包管理中脱身的程序员终于可以有时间再进入另一个坑了. 我今天要给大家分享的内容是我在实际 ...

  7. Java项目工程化之项目构建工具Maven

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  8. 项目管理构建工具——Maven(基础篇)

    项目管理构建工具--Maven(基础篇) 在前面的内容中我们学习了JDBC并且接触到了jar包概念 在后面我们的实际开发中会接触到很多jar包,jar包的导入需要到互联网上进行就会导致操作繁琐 Mav ...

  9. 项目管理构建工具——Maven(高阶篇)

    项目管理构建工具--Maven(高阶篇) 我们在之前的文章中已经基本了解了Maven,但也仅仅只止步于了解 Maven作为我们项目管理构建的常用工具,具备许多功能,在这篇文章中我们来仔细介绍 分模块开 ...

  10. 向西项目管理工具Maven一片

    前言 相信仅仅要做过 Java 开发的童鞋们,对 Ant 想必都不陌生,我们往往使用 Ant 来构建项目,尤其是涉及到特别繁杂的工作量.一个 build.xml 可以完毕编译.測试.打包.部署等非常多 ...

随机推荐

  1. LuoGu P2783 有机化学之神偶尔会做作弊

    题目传送门 人生第一道黑题呢,虽然这题是黑题中的水题并且我调了一整节课,但是我还是很兴奋啊.毕竟人生第一道黑题啊 这个题根据题意,先把整个图进行tarjan缩点,建出一棵树,对于每一组询问,两点之间的 ...

  2. js——正则表达式

    1. 创建一个正则表达式 var patt=new RegExp(pattern,modifiers);var patt=/pattern/modifiers; var index = str.sea ...

  3. android经典源码,很不错的开源框架

    高仿最美应用项目源码 项目介绍 这是仿最美应用开发的基于mvp+rxjava+retrofit的项目,很值得学   github地址: https://github.com/JJOGGER/Beaut ...

  4. Confluence 6 SQL Server 问题解决

    如果你收到了下面的错误信息,检查你给出的 confluenceuser 用户具有所有需要的数据库权限,当你使用 localhost 进行连接的时候. Could not successfully te ...

  5. java web----URL

     简单使用 import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; im ...

  6. poj2116 模拟题

    不知道错在哪里 /* 给定两个斐波那契表示数,要求用标准化表达方式表达 然后将这两个数加起来,和也用标准化方式表达 思路:显然要将这两个数先用十进制表示,和也用十进制表示 然后在转化成二进制即可 1 ...

  7. ATM机模拟系统

    实验要求 https://pan.baidu.com/s/1Sq5joWyVsNhY8DYiyI4UmQ 源代码 /*信1705-1 20173458 王嘉梁*/ package atm; impor ...

  8. python unittest框架装饰器

    要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单 ...

  9. Java+selenium之WebDriver页面元素的操作(三)

    1. 输入框(text field or textarea) WebElement we = driver.findElement(By.id("id")); //将输入框清空 w ...

  10. 【C++ Primer | 15】访问控制与继承、继承中的类作用域

    1. 只有D继承B的方式是public时,用户代码才能使用派生类向基类的转换:如果D继承B的方式是受保护的或者私有的,则用户代码不能使用该转换. 2. 不论D以什么方式继承B,D的成员函数和友员函数都 ...