1.Maven简介

Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。是apache的一个顶级开源项目。 Maven基于约定优于配置的原则: 即使用最佳实践,减少配置。
Maven两大核心:

  1. 依赖管理: 依赖管理指的就是使用Maven来管理项目中使用到的jar包。Maven管理的方式就是:自动下载项目所需要的jar包,统一管理jar包之间的依赖关系。
  2. 项目构建: 这六个步骤就是一个项目的完整构建过程。
    Maven - 图1 理想的项目构建是高度自动化,跨平台,可重用的组件,标准化的,使用maven就可以帮我们完成上述所说的项目构建过程。

    2.Maven关键知识点

    2.1.Maven仓库

    Maven中的依赖管理就是用来管理项目中的jar包,而这些jar包存储在Maven仓库中。 Maven - 图2 默认的,本地所有Maven项目都共用一个本地仓库。本地仓库从中央仓库下载必要的构件。
    Maven仓库分类:

  3. 本地仓库 存放从中央仓库下载的依赖组件。 windows7默认地址:C:\user\xxx.m2\repository linux默认地址:~/.m2/repository

  4. 远程仓库 中央仓库:central repository(由Apache官方维护的组件库,组件可升级) 私有仓库(私服):机构自己搭建的远程仓库(适用于本机构内部各个项目组使用) 第三方公共库:比如国内阿里Maven镜像仓库

    附录:Maven中央仓库地址:

    1. http://mvnrepository.com/
    2. https://repo.maven.apache.org/maven2
    3. http://www.sonatype.org/nexus/

2.2.Maven坐标

Maven通过坐标对jar包进行唯一标识。坐标通过3个元素进行定义,groupId、artifactId、version。

  1. groupId:组织标识,一般为域名倒置。
  2. artifactId:项目名或模块名,是当前项目中的唯一标识。
  3. version:当前项目版本。

    3.Maven的安装与配置

  4. 安装jdk环境:maven的运行需要依赖jdk。

  5. 下载maven。官网下载:http://maven.apache.org/download.cgi
  6. 将下载的maven压缩包直接解压到本地磁盘即可。
  7. 配置环境变量: M2_HOME: maven安装目录 Path:%M2_HOME%/bin
  8. 测试是否安装成功。命令行输入:mvn -v
  9. 本地仓库配置 Maven本地仓库默认地址为:C:\user\xxx.m2\repository。 也可以改变本地仓库地址。 maven安装目录 -> conf文件夹 -> settings.xml配置文件

    1. <!-- localRepository
    2. | The path to the local repository maven will use to store artifacts.
    3. |
    4. | Default: ${user.home}/.m2/repository
    5. <localRepository>/path/to/local/repo</localRepository>
    6. -->
    7. <localRepository>E:\dev_software\repository</localRepository>
  10. 远程仓库配置 Maven远程仓库默认地址为:http://my.repository.com/repo/path。也可以改变远程仓库地址。 打开maven安装目录中的conf文件夹, maven安装目录 -> conf文件夹 -> settings.xml配置文件

    1. <mirror>
    2. <id>nexus-aliyun</id>
    3. <mirrorOf>central</mirrorOf>
    4. <name>Nexus aliyun</name>
    5. <url>http://maven.aliyun.com/nexus/content/repositories/central</url>
    6. </mirror>

    4.Maven项目标准目录结构

    一个Maven工程的目录结构,必须为下图所示:
    Maven - 图3
    下面使用记事本,手动创建一个Maven工程:

  11. 首先,在磁盘上创建如下目录结构:
    Maven - 图4

  12. pom.xml文件:maven核心配置文件。项目对象模型(Project Object Model,POM)

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0</modelVersion>
    6. <groupId>com.neusoft</groupId>
    7. <artifactId>hello</artifactId>
    8. <version>0.0.1-SNAPSHOT</version>
    9. <packaging>jar</packaging>
    10. <!-- 这里添加项目依赖的jar包 -->
    11. <dependencies>
    12. </dependencies>
    13. </project>
  13. modelVersion:Maven2.0版本以上必须这样写。 groupId:组织标识,也是本地仓库中的路径。 artifactId:项目或模块名称,是当前项目中的唯一标识。 version:当前项目版本(snapshot:开发板;即不稳定版)。 packaging:当前项目打包格式(jar、war、pom)(默认jar) dependencies:配置项目依赖的jar包

  14. 在src/main/java文件夹中创建的 com.neusoft.hello.Hello.java 文件:
    1. package com.neusoft.hello;
    2. public class Hello{
    3. public static void main(String[] args){
    4. System.out.println("hello world!");
    5. }
    6. }

    接下来,就可以使用下面的 Maven常用命令,来编译和运行此项目了。

5.Maven常用命令

  1. 编译:mvn compile 将java文件编译成class文件,必须在项目目录下运行该命令。

    1. D:\hello>mvn compile
  2. 运行:mvn exec 执行main方法。

    1. D:\hello>mvn exec:java -Dexec.mainClass="com.neusoft.hello.Hello"
  3. 打包:mvn package 将项目打包到target目录下。

  4. 安装:mvn install 打包到本地仓库。解决本地多个项目共用某个jar包的问题。
  5. 建立目录结构:mvn archetype:generate
  6. 清理:mvn clean 将项目根目录下的target目录删除。
  7. 单元测试:mvn test 执行src/test/java目录下的单元测试类。 注意:单元测试类名规范:XXXTest.java,并且要在pom.xml中依赖junit包。

    6.在STS中使用maven

    6.1.在STS中配置maven

  8. 在STS中打开 Window -> Preferences -> Maven -> Installations。

  9. 在 Installations 窗口中点击 “Add…” 按钮 ,选择 Maven 安装路径,然后点击 “Apply” 按钮。
  10. 再次选择:Windows –> Prefrences –> Maven –> User Settings –> Browse。选择maven安装路径下conf文件夹中的settings.xml ,然后点击 “Apply” 按钮。

    6.2.在STS中创建maven工程

    6.2.1.创建javaSE工程

  11. 在新建中选择maven工程,然后点击 “Next”:
    Maven - 图5

  12. 将第一个选项选中,然后点击下一步
    Maven - 图6
  13. 添加各种信息(包括坐标与版本,Packaging 处选择 jar),然后点击完成
    Maven - 图7
  14. pom.xml文件中添加jar包依赖。

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0</modelVersion>
    5. <groupId>com.neusoft</groupId>
    6. <artifactId>hello1</artifactId>
    7. <version>0.0.1-SNAPSHOT</version>
    8. <dependencies>
    9. <!-- 这里添加jar包依赖(比如:添加mysql驱动包) -->
    10. <dependency>
    11. <groupId>mysql</groupId>
    12. <artifactId>mysql-connector-java</artifactId>
    13. <version>5.1.6</version>
    14. </dependency>
    15. </dependencies>
    16. </project>
  15. 基于 Maven 的 javaSE 工程就创建好了。之后,就可以在 src/main/java 下创建包和类了。

    6.2.2.创建javaWeb工程

  16. 在新建中选择maven工程,然后点击 “Next”:
    Maven - 图8

  17. 将第一个选项选中,然后点击下一步
    Maven - 图9
  18. 添加各种信息(包括坐标与版本,Packaging 处选择 war),然后点击完成
    Maven - 图10
  19. 打开 src -> main -> webapp 文件夹,手动添加 WEB-INF 文件夹和 web.xml 配置文件。
    Maven - 图11
  20. pom.xml文件中添加jar包依赖。

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0</modelVersion>
    5. <groupId>com.neusoft</groupId>
    6. <artifactId>hello1</artifactId>
    7. <version>0.0.1-SNAPSHOT</version>
    8. <dependencies>
    9. <dependency>
    10. <groupId>javax.servlet</groupId>
    11. <artifactId>javax.servlet-api</artifactId>
    12. <version>4.0.0</version>
    13. <scope>provided</scope>
    14. </dependency>
    15. <!-- 其他jar包依赖 -->
    16. ... ...
    17. </dependencies>
    18. </project>
  21. 基于 Maven 的 javaEE 工程就创建好了。之后,就可以在 src/main/java 下创建Servlet了。

    1. package com.neusoft;
    2. import javax.servlet.http.HttpServlet;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import java.io.IOException;
    6. import java.io.PrintWriter;
    7. import javax.servlet.ServletException;
    8. import javax.servlet.annotation.WebServlet;
    9. @WebServlet("/hello")
    10. public class HelloServlet extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. PrintWriter out = resp.getWriter();
    14. out.print("hello...");
    15. out.close();
    16. }
    17. @Override
    18. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    19. doGet(req, resp);
    20. }
    21. }
  22. 将工程添加到Tomcat中并启动测试。

    7.Maven中的jdk版本配置

    Maven默认的jdk版本配置是1.5,所以在开发中,一般都需要修改jdk版本的配置。 可以进行全局配置,也可以进行局部配置。

    7.1.局部配置jdk版本

    配置局部的 jdk 版本只针对具体某个项目进行配置,在当前项目的 pom.xml 文件中添加build元素

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0</modelVersion>
    5. <groupId>com.neusoft</groupId>
    6. <artifactId>hello2</artifactId>
    7. <version>0.0.1-SNAPSHOT</version>
    8. <packaging>war</packaging>
    9. <!-- 第一种方式 -->
    10. <!-- build标签用于编译设置 -->
    11. <build>
    12. <plugins>
    13. <!-- 设置jdk版本 -->
    14. <plugin>
    15. <groupId>org.apache.maven.plugins</groupId>
    16. <artifactId>maven-compiler-plugin</artifactId>
    17. <configuration>
    18. <source>1.8</source>
    19. <target>1.8</target>
    20. <encoding>utf-8</encoding>
    21. </configuration>
    22. </plugin>
    23. </plugins>
    24. </build>
    25. <!-- 第二种方式 -->
    26. <!-- properties标签用于设置Maven属性,或自定义属性 -->
    27. <!--
    28. <properties>
    29. <maven.compiler.source>1.8</maven.compiler.source>
    30. <maven.compiler.target>1.8</maven.compiler.target>
    31. </properties>
    32. -->
    33. </project>

    7.2.全局配置jdk版本

    打开 settings.xml 配置文件,找到 profiles 这个标签,在这里添加如下代码:

    1. <profiles>
    2. <profile>
    3. <id>jdk-1.8</id>
    4. <activation>
    5. <activeByDefault>true</activeByDefault>
    6. <jdk>1.8</jdk>
    7. </activation>
    8. <properties>
    9. <maven.compiler.source>1.8</maven.compiler.source>
    10. <maven.compiler.target>1.8</maven.compiler.target>
    11. <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    12. </properties>
    13. </profile>
    14. ...
    15. </profiles>

    8.Maven中的依赖

    8.1.依赖范围

    maven 项目在不同的阶段引入到classpath中的依赖是不同的。常用依赖范围有四种:

  23. compile:编译依赖范围,在编译,测试,运行时都需要。
    比如:log4j(常用日志jar包)

  24. test: 测试依赖范围,测试时需要。编译和运行不需要。
    比如:junit(常用测试jar包)
  25. runtime: 运行时依赖范围,测试和运行时需要。编译不需要。
    比如:jdbc驱动jar包
  26. provided:已提供依赖范围,编译和测试时需要。运行时不需要。
    比如:servlet-api

Maven - 图12
在Maven中,使用 scope 标签来表示依赖范围。

  1. <dependencies>
  2. <dependency>
  3. <groupId>javax.servlet</groupId>
  4. <artifactId>javax.servlet-api</artifactId>
  5. <version>4.0.0</version>
  6. <scope>provided</scope>
  7. </dependency>
  8. <dependency>
  9. <groupId>mysql</groupId>
  10. <artifactId>mysql-connector-java</artifactId>
  11. <version>5.1.6</version>
  12. <!-- 通常情况下,runtime都使用compile替代 -->
  13. <scope>runtime</scope>
  14. </dependency>
  15. </dependencies>

8.2.传递依赖

在 Maven 的 pom.xml 中书写的 jar 包中,如果存在直接依赖关系,或者是传递依赖关系,那么Maven也会将所依赖的jar包一同导入。 比如: A -> B: A包依赖B包,这是直接依赖。 A -> B -> C: A包依赖B包,B包又依赖C包,这是传递依赖。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.neusoft</groupId>
  6. <artifactId>elm</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>war</packaging>
  9. <properties>
  10. <maven.compiler.source>1.8</maven.compiler.source>
  11. <maven.compiler.target>1.8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>mysql</groupId>
  16. <artifactId>mysql-connector-java</artifactId>
  17. <version>5.1.6</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>com.fasterxml.jackson.core</groupId>
  21. <artifactId>jackson-databind</artifactId>
  22. <version>2.11.0</version>
  23. </dependency>
  24. </dependencies>
  25. </project>

注意: jackson 需要三个包:core、databind、annotations。但是,在pom.xml中只写了一个依赖:core 和 databind。 那是因为,databind 包依赖于 core 和 annotations ,所以 Maven 也会将 core 和 annotations 包一同导入。

Maven - 图13

作业:

  1. Maven 是什么,说出5点主要功能?
  2. 项目为什么选用 Maven 进行构建?
  3. 简述Maven 规约是什么(默认约定的工程目录结构)?
  4. 简述Maven 常用命令?
  5. 简述/Maven 坐标的含义:groupId 、artifactId 、version 、packaging?
  6. Maven中 中属性有哪些,各个属性的功能是什么?