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 文件:
    package com.neusoft.hello;
    public class Hello{
     public static void main(String[] args){
         System.out.println("hello world!");
     }
    }
    

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

5.Maven常用命令

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

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

    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包依赖。

    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.neusoft</groupId>
     <artifactId>hello1</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <dependencies>
         <!-- 这里添加jar包依赖(比如:添加mysql驱动包) -->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.6</version>
         </dependency>
     </dependencies>
    </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包依赖。

    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.neusoft</groupId>
     <artifactId>hello1</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <dependencies>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
             <version>4.0.0</version>
             <scope>provided</scope>
         </dependency>
         <!-- 其他jar包依赖 -->
         ... ...
     </dependencies>
    </project>
    
  21. 基于 Maven 的 javaEE 工程就创建好了。之后,就可以在 src/main/java 下创建Servlet了。

    package com.neusoft;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    @WebServlet("/hello")
    public class HelloServlet extends HttpServlet {
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         PrintWriter out = resp.getWriter();
         out.print("hello...");
         out.close();
     }
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         doGet(req, resp);
     }
    }
    
  22. 将工程添加到Tomcat中并启动测试。

    7.Maven中的jdk版本配置

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

    7.1.局部配置jdk版本

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

    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.neusoft</groupId>
     <artifactId>hello2</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <packaging>war</packaging>
     <!-- 第一种方式 -->
     <!-- build标签用于编译设置 -->
     <build>
         <plugins>
             <!-- 设置jdk版本 -->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <configuration>
                     <source>1.8</source>
                     <target>1.8</target>
                     <encoding>utf-8</encoding>
                 </configuration>
             </plugin>
         </plugins>
     </build>
     <!-- 第二种方式 -->
     <!-- properties标签用于设置Maven属性,或自定义属性 -->
     <!--
     <properties>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
     </properties>
     -->
    </project>
    

    7.2.全局配置jdk版本

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

    <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>
     ...
    </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 标签来表示依赖范围。

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
        <!-- 通常情况下,runtime都使用compile替代 -->
        <scope>runtime</scope>
    </dependency>
</dependencies>

8.2.传递依赖

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

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.neusoft</groupId>
    <artifactId>elm</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.0</version>
        </dependency>
    </dependencies>
</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中 中属性有哪些,各个属性的功能是什么?