一、 目标

Maven

构建Maven多模块功能

二、 什么是maven

Maven是一个跨平台的项目管理工具,主要用于基于java平台的项目构建,依赖管理。

解决的项目的问题

  1. 如果有好几个项目,这好几个项目中,需要用到很多相同的jar包,

能不能只建立一个仓库来解决这个问题?

  1. 测试方法能不能全部运行呢?

  2. 怎么样把一个模块的功能放入到仓库中

三、 Maven的安装与配置

Maven的安装 :

  1. Jdk必须1.6以上的版本
  2. 从http://maven.apache.org/官网上下载最新版本的maven

设定path路径 :

  1. 把下载下来的maven解压缩,然后有一个bin文件夹,这是一个bin的文件夹的目录F:\work\course\maven\maven\bin
  2. 把该目录追加到环境变量的path中。
  3. 输入mvn -v 查看版本

建库

  1. 打开路径C:\Users\Think.m2
  2. 把settings.xml文件复制到上述的路径中F:\work\course\maven\apache-maven-3.0.5-bin\apache-maven-3.0.5\conf有一个settings.xml文件,复制到C:\Users\Think.m2
  3. 修改settings.xml文件,F:/work/course/maven/mavenRepository/
  4. 指定仓库的路径(在这里mavenRepository就是仓库的路径)

maven配置:

maven的约定:

  1. src/main/java 存放项目的java文件
  2. src/main/resources 存放项目的资源文件,如spring,hibernate的配置文件
  3. src/test/java 存放所有的测试的java文件
  4. src/test/resources 存放测试用的资源文件
  5. target 项目输出位置
  6. pom.xml 文件

四、 maven项目

4.1 hello项目

4.1.1 新建maven项目

4.1.2 编写Hello类

public class Hello {
    public void hello(){
        System.out.println("我是maven项目....");
    }
}

在src/test/java中创建一个包cn.itcast.maven,创建一个测试类HelloTest

4.1.3 编辑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">
    <!--project:表示一个工程
    modelVersion:为版本号-->
    <!--maven版本 dtd对应-->
    <modelVersion>4.0.0</modelVersion>
    <!--组织 这是项目组的编号,这在组织或项目中通常是独一无二的。-->
    <groupId>com.scxd</groupId>
    <!--项目名字 这是项目的ID。这通常是项目的名称。-->
    <artifactId>mavendemo</artifactId>

    <!--版本 这是项目的版本。-->
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

4.1.4 maven命令

1. mvn compile 编译项目

target文件夹的变化

2. mvn clean 清除编译

target文件夹消失

3. mvn test 编译测试文件

说明:

  1. target/classes 存放编译后的类
  2. target/test-classes 存放编译后的测试类
  3. target/surefire-reports 存放测试报告

可以看出,只要进行测试,清理和编译可以自动执行了。

4. mvn package 根据pom中的package打包

说明:

  1. ​ target/classes 编译后的类的路径
  2. target/test-classes 编译后的测试类的路径
  3. target/surefire-reports 测试报告
  4. target/maven-archiver 执行package的归档
  5. Hello-0.0.1-SNAPSHOT.jar 执行完package命令后打成的jar包

5. mvn install 打包到mvn本地仓库

4.2 Hellofriend项目

4.2.1 建立HelloFriend项目工程

4.2.2 编写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>com.scxd</groupId>
    <artifactId>mavendemo02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--将打到本地的包导入-->
        <dependency>
            <groupId>com.scxd</groupId>
            <artifactId>mavendemo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

如果没有将hello项目打包的本地,执行mvncompile会报错,因为HelloFriend项目是建立在Hello项目基础之上的,但是现在工程中没有引入Hello.java这个类

解决方法:

  1. 打开命令行
  2. 把当前路径调节到Hello工程的根目录
  3. 执行mvn clean install命令,把Hello整个工程放入到仓库中
    执行mvn package命令打包HelloFriend工程

可以看到成功以后,在target目录下多了一个jar包

该jar包为当前工程的jar包。

4.2.3 编辑HelloFriend类

public class HelloFriend {
    public void helloFriend(){
        //导入mavendemo项目中的类
        Hello hello = new Hello();
        hello.hello();
    }

    public static void main(String[] args) {
        Hello hello = new Hello();
        hello.hello();
    }
}

运行测试 会打印:我是maven项目…

五、 maven的核心概念

5.1 项目对象模型

说明:

  1. maven根据pom.xml文件,把它转化成项目对象模型(POM),这个时候要解析依赖关系,然后去相对应的maven库中查找到依赖的jar包。
  2. 在clean,compile,test,package等阶段都有相应的Plug-in来做这些事情。
  3. 而这些plug-in会产生一些中间产物。

5.2 插件的位置

在maven解压后的位置maven有一个bin文件夹,里面有

一个文件m2.config文件其中settings.xml文件中

设置本地仓库位置:

<localRepository>G:\java_environment\idea\Repository</localRepository>

设置依赖下载地址:

<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
     <!-- 淘宝镜像-->
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

5.3 maven坐标

maven坐标的主要组成:

  1. groupId:定义当前maven项目属于哪个项目
  2. artifactId:定义实际项目中的某一个模块
  3. version:定义当前项目的当前版本
  4. packaging:定义当前项目的打包方式

5.4 依赖管理

<dependencies>
    <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
    </dependency>
</dependencies>

5.5 继承管理

5.5.1 创建项目

5.5.2 编写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.scxd</groupId>
    <artifactId>maven_parent_hello</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--<packaging>pom</packaging>  父类型都为pom类型
        <packaging>jar</packaging>  内部调用或者是作服务使用
        <packaging>war</packaging>  需要部署的项目-->
    <packaging>pom</packaging>
    <dependencies>
        <dependency>
            <groupId>com.scxd</groupId>
            <artifactId>maven_hello</artifactId>
            <version>1</version>
        </dependency>
    </dependencies>
</project>

5.6 仓库管理

可以根据maven坐标定义每一个jar包在仓库中的存储位置

大致为:groupId/artifactId/version/artifactId-version.packaging

5.6.1 仓库的分类

本地仓库

每一个用户也可以拥有一个本地仓库(~/.m2/repository/)

远程仓库

  1. 中央仓库:Maven默认的远程仓库(http://repo1.maven.org/maven2)
  2. 私服:是一种特殊的远程仓库,它是架设在局域网内的仓库
  3. 镜像:用来替代中央仓库,速度一般比中央仓库快

六、 maven的应用

6.1 环境配置

6.2 配置settings.xml文件

上面有

6.3. 配置私服的路径

上面有

如果不想连接私服,可以直接连接互联网。只需要把连接私服的所有的路径去掉即可。

6.4 创建maven工程

6.4.1 创建java project

  1. 选择Maven Project

  2. 选择快速创建maven-archetype-quickstart

  3. 填写group ID,Artiface Id,Version,Package属性

  4. 然后点击finish就可以了

6.4.2 创建web project

  1. 选择创建maven-archetype-webapps

其他一样

  1. 完成后,得到的目录树是没有java代码目录的,也没有测试代码目录和resources目录,都需要自己配所以可以学习自定义骨架)

  2. 选择 File -> Project Structure

  3. 选择左边的Moduels, 子窗口选择Sources, 这就是项目目录,选择对中间的目录鼠标右键新建即可,然后 src/main/java设置为蓝色(就选中这个目录时,点击上面的Marks as -> Resources[blue]), 还有测试绿色,资源是resources.

  4. 配置服务容器tomcat或者jetty

七、 Maven建立(聚合)多模块功能

1. 创建空项目

file–>new project–>Empty project

创建父模块

file–>new–>Moudle–>Maven–>下图父工程(pom)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gHORPzZB-1590572234917)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200121134023778.png)]

2.创建java项目子模块

file–>new–>Moudle–>Maven–>上图java工程(jar)

3.创建web项目子模块

file–>new–>Moudle–>Maven–>上图web工程(war)
在将parent中的src删除

4.目录结构

maven-parent 父工程

maven-service 业务逻辑层

maven-web web层

5.启动方式

添加tomat启动即可

八、 Maven打包原理

8.1 Maven中央存储库

当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定有哪些依赖下载。

首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如果没有找到,然后把它会从默认的 Maven 中央存储库http://search.maven.org/查找下载。

在Maven中,当你声明的库不存在于本地存储库中,也没有不存在于Maven中心储存库,该过程将停止并将错误消息输出到 Maven 控制台。

8.2 添加远程仓库

默认情况下,Maven从Maven中央仓库下载所有依赖关系。但是,有些库丢失在中央存储库,只有在Java.net或JBoss的储存库远程仓库中能找到。

现在,Maven的依赖库查询顺序更改为:

在 Maven 本地资源库中搜索,如果没有找到,进入下一步,否则退出。

在 Maven 中央存储库搜索,如果没有找到,进入下一步,否则退出。

在Maven的远程存储库搜索,如果没有找到,提示错误信息,否则退出。

九、 常用错误

错误原因①:

pom.xml报错:web.xml is missing and is set to true

解决办法:

出现这个错误的原因是Maven不支持缺少web.xml的web项目

添加Web模块,对项目右键->****Java EE**** Tools->Generate Deployment Descriptor Stub,这样就在

src\main\webapp下面生成了WEB-INF文件夹和web.xml,问题解决.

错误原因②

‘parent.relativePath’ and ‘parent.relativePath’ points at wrong local POM @ line 4, column 10

在应用parent工程中加上

<relativePath>../maven-parent/pom.xml</relativePath>

<parent>

<groupId>com.itmayiedu</groupId>

<artifactId>itmayiedu-parent</artifactId>

<version>0.0.1-SNAPSHOT</version>

<relativePath>../itmayiedu-parent/pom.xml</relativePath>

</parent>

错误原因③:

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

错误原因②

‘parent.relativePath’ and ‘parent.relativePath’ points at wrong local POM @ line 4, column 10

在应用parent工程中加上

<relativePath>../maven-parent/pom.xml</relativePath>

<parent>

<groupId>com.itmayiedu</groupId>

<artifactId>itmayiedu-parent</artifactId>

<version>0.0.1-SNAPSHOT</version>

<relativePath>../itmayiedu-parent/pom.xml</relativePath>

</parent>

错误原因③:

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

解决办法 更换为自己本地的jdk即可

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐