自学内容网 自学内容网

Maven-课堂笔记

课程地址

资料地址

Maven基本概念

会oh

Maven的作用:

项目构建:提供标准的,跨平台的自动化项目构建方式
依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
统一开发结构:提供标准的、统一的项目结构

安装 Maven:下载压缩包解压即可使用,配置环境变量 MAVEN_HOME 指向 Maven 的安装目录,并且在 PATH 中添加一个指向 maven/bin 目录的项(命令对应的可执行文件)

仓库

存储jar包资源

在这里插入图片描述

坐标

仓库中的资源进行定位

Maven坐标的组成:

  • groupId:当前Maven项目隶属组织名称(通常是域名的反写,例如org.mybatis)
  • artifactId:当前Maven项目的名称(通常是模块名称,例如CRM,SMS)
  • version:当前项目版本号
  • packaing:该项目的打包方式,web工程打包为war,java工程打包为jar
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

作用:使用唯一标识,定位资源位置,通过该标识可以将资源的识别和下载交给机器完成


仓库配置

为了防止将资源存储在C盘占用系统空间,我们可以修改D:\ProgramFiles\apache-maven-3.8.6\conf\settings.xml的配置,添加本地仓库位置:

<localRepository>D:\ProgramFiles\apache-maven-3.8.6\repository</localRepository>

添加远程镜像仓库,同样修改D:\ProgramFiles\apache-maven-3.8.6\conf\settings.xml的配置:

 <!-- 阿里云仓库 -->
        <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        </mirror>

        <!-- 中央仓库1 -->
        <mirror>
            <id>repo1</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo1.maven.org/maven2/</url>
        </mirror>

        <!-- 中央仓库2 -->
        <mirror>
            <id>repo2</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo2.maven.org/maven2/</url>
        </mirror>

上面配置的是全局setting,在C:\Users\Daniel\.m2也能有一个每个用户的局部setting文件


第一个Maven项目

手工创建

meven项目结构:

在这里插入图片描述
两个源代码文件如下:

//Demo.java
package com.itheima;
public class Demo {
public String say(String name) {
System.out.println("hello " + name);
return "hello " + name;
}
}

//DemoTest.java
package com.itheima;

import org.junit.Test;
import org.junit.Assert;

public class DemoTest {
@Test
public void sayTest() {
Demo d = new Demo();
String ret = d.say("maven");
Assert.assertEquals("hello maven", ret);
}
}

一个基本的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itheima</groupId>
    <artifactId>mvn-demo</artifactId>
    <version>1.0.0</version>
    <name>mvn-demo</name>
    <description>mvn-demo</description>
    <packaging>jar</packaging>

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

    <build>
   </build>

</project>

构建命令:

mvn complie
mvn clean
mvn test#运行单元测试,生成测试报告
mvn package#打包,在target目录生成本项目的jar包。包含了前面的 compile 和 test 步骤
mvn install#安装到本地仓库,在本地仓库maven\repository下生成本项目的jar包

如果编译时报错不再支持源选项 5。请使用 7 或更高版本。,请在setting.xml中升级jdk版本:

        <profile>
            <id>jdk-17</id>  
            <activation>  
                <activeByDefault>true</activeByDefault>  
                <jdk>17</jdk>  
            </activation>
            <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <maven.compiler.source>17</maven.compiler.source>  
                <maven.compiler.target>17</maven.compiler.target>   
            </properties>   
        </profile>

上面创建工程目录的过程可以通过工具自动完成:

mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false

生成一个java工程:

mvn archetype:generate -DgroupId=com.itheima -DartifactId=demo2 -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false

生成一个web工程:

mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false

IDEA创建

在这里插入图片描述

可以在Edit Configurations处配置快捷操作:

在这里插入图片描述
添加tomcat插件:

在pom文件中添加如下内容:

  <build>
    <finalName>demo3</finalName>
    <plugins>
      <plugin>
        <!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.1</version>
          <configuration>
            <port>80</port>
            <path>/</path>
          </configuration>
      </plugin>
    </plugins>
  </build>

依赖管理

依赖是指当前项目需要的jar包:

  <!--设置当前项目所依赖的所有jar-->
  <dependencies>
    <!--设置具体的依赖-->
    <dependency>
      <!--依赖所属群组id-->
      <groupId>junit</groupId>
      <!--依赖所属项目id-->
      <artifactId>junit</artifactId>
      <!--依赖版本号-->
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

依赖传递:你的项目的依赖的依赖,在你的当前项目中可以直接使用

例如下面的2个项目中,project2 依赖于 project3,所以 project3 依赖的 log4j:log4j:1.2.14 也出现在了 project2 的依赖列表中

在这里插入图片描述

直接依赖:在当前项目中通过依赖配置建立的依赖关系,例如上面 log4j:log4j:1.2.13 就是 project2 的直接依赖

间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源,例如上面 log4j:log4j:1.2.14 就是 project2 的间接依赖

依赖传递冲突问题:

在这里插入图片描述

隐藏(可选)依赖

对外隐藏当前项目所依赖的资源,这样当你的项目被当作 jar 包被其他项目引用时,就能够确保其他人看不到你依赖的资源

    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
      <optional>true</optional><!--可选依赖,不可见-->
    </dependency>

在这里插入图片描述

排除依赖

主动断开依赖的资源,被排除的资源无需执行版本

    <dependency>
      <groupId>com.itheima</groupId>
      <artifactId>demo3</artifactId>
      <version>1.0-SNAPSHOT</version>
      <exclusions><!--排除依赖-->
        <exclusion>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

依赖范围 scope

在这里插入图片描述

生命周期与插件

一个 java 项目构建的生命周期:编译-测试-打包-部署

  • compile
  • test
  • package:打成 jar 包
  • install:安装到本地仓库

maven 对项目构建的生命周期划分为3套:

  • clean:清理工作。细分为 pre-clean、clean、post-clean
  • default:核心工作,包含上面的编译、测试、打包、部署等
  • site:产生报告,发布站点等。细分为 pre-site、site、post-site、site-deploy

default 构建生命周期包含的内容比较多:

在这里插入图片描述

其中每一项都需要在前面的所有项都完成才能够执行

生命周期中的所有动作都是靠插件完成的

插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能

默认maven在各个生命周期上绑定有预设的功能

通过插件可以自定义其他功能

在这里插入图片描述

例如上图引入了一个打包源码的插件,配置了它在 generate-test-resources 阶段运行(在 test 之前)

则点击 test Lifecycle 之后,就会在 target 目录下生成源码包

分模块开发与设计

资料中提供了下面项目的源代码

下面将一个项目中的各个包拆分到不同的项目中,根目录为 ssm_modules

在这里插入图片描述

拆分 pojo 模块

创建模块 ssm_pojo,然后将 springmvc_ssm 中的 User 类放在 ssm_pojo 的 com.itheima.domain 包中。项目结构如下:

在这里插入图片描述

它的 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.itheima</groupId>
    <artifactId>ssm_pojo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

拆分 dao 模块

创建模块 ssm_dao,然后将 springmvc_ssm 中的 UserDao 类放在 ssm_dao 的 com.itheima.domain 包中,并拷贝必要的资源文件。项目结构如下:

在这里插入图片描述
编辑 pom 剔除不必要的依赖项,并添加 User 类的依赖,并且需要 mvn install ssm_pojo:

        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>ssm_pojo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

拆分 service 模块

在这里插入图片描述
创建模块 ssm_service,然后将 springmvc_ssm 中的 UserService 接口及其实现类放在 ssm_service 的 com.itheima.service 包中,并拷贝必要的资源文件。项目结构如下:

在这里插入图片描述

编辑 pom 剔除不必要的依赖项,并添加 UserDao 类的依赖,并且需要 mvn install ssm_domain:

        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>ssm_domain</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

拆分 controller 模块

在这里插入图片描述

聚合

将原始项目拆分为多个模块后,每个模块单独开发,因为模块之间的层层依赖,可能导致某一个模块更新后,其他模块没有更新对应的依赖

例如下图中 ssm_dao 模块更新后,ssm_servicessm_controller 可能没有更新对应的依赖

这就需要用一个外层模块统一管理所有子模块,统一构建

在这里插入图片描述
新建一个模块(聚合项目),专门用于模块管理,其 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.itheima</groupId>
    <artifactId>ssm</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--定义该工程用于进行构建管理-->
    <packaging>pom</packaging>

    <!--管理的工程列表-->
    <modules>
        <!--具体的工程名称-->
        <module>../ssm_controller</module>
        <module>../ssm_service</module>
        <module>../ssm_dao</module>
        <module>../ssm_pojo</module>
    </modules>
</project>

聚合项目的打包方式是 pom

对于一般的项目,默认的打包方式是 jar。对于 web 项目,默认的打包方式是 war

继承

在一个聚合项目中,子模块可能依赖于不同版本的资源,造成了管理混乱

可以通过继承的方式统一在父工程中管理这些模块。例如下面的 ssm_servicessm_dao 都依赖于 spring-context,则将其配置在父工程方便做版本控制
在这里插入图片描述

通过继承可以实现在子工程中沿用父工程的配置(依赖)。在子工程中声明继承关系:

<parent>
<groupId>com.itheima</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 填写父工程的 pom 文件-->
<relativePath>../ssm/pom.xml</relativePath>
</parent>

原则上子工程的 groupIdversion 应该与父工程保持一致(parent 中声明的),所以可以省略

在父工程中声明依赖管理

<!-- 声明此处进行依赖管理 -->
<dependencyManagement>
<!-- 具体的依赖 -->
<dependencies>
<!--spring 环境 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependencies>
<dependencyManagement>

继承依赖的使用:在子工程中定义依赖关系,无需声明版本,它会参考父工程中依赖的版本

<dependencies>
<!--spring 环境 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>

同样的,插件也可以通过 pluginManagement 实现继承

在这里插入图片描述

属性

属性相当于变量,一处定义,处处复用,统一维护

属性包括5种:

  • 自定义属性
  • 内置属性
  • setting 属性
  • java 系统属性
  • 环境变量属性

自定义属性

定义格式:

<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>

调用格式:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>

内置属性

maven 的内置属性。调用格式:

${basedir}
${version}

例如下图中三个依赖的版本都跟 ssm 的 version 保持一致

在这里插入图片描述

setting 属性

maven 配置文件 setting.xml 中的标签属性,用于动态配置

${settings.localRepository}

Java 系统属性

${user.home}

环境变量属性

${env.JAVA_HOME}

版本管理

工程版本分为2类:快照版本和发布版本

在这里插入图片描述

资源配置

资源配置主要是针对 properties 文件的管理,例如 jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db
jdbc.username=root
jdbc.password=itheima

将他的 url 抽取到 pom 的属性中,并在 build 中配置资源文件对应的信息:

<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>

    <build>
        <!--配置资源文件对应的信息-->
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <!--配置测试资源文件对应的信息-->
        <testResources>
            <testResource>
                <directory>${project.basedir}/src/test/resources</directory>
                <filtering>true</filtering>
            </testResource>
        </testResources>
    </build>

那么在 properties 文件中就可以直接引用这个属性值:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=itheima

多环境配置

    <!--创建多环境-->
    <profiles>
        <!--定义具体的环境:生产环境-->
        <profile>
            <!--定义环境对应的唯一名称-->
            <id>pro_env</id>
            <!--定义环境中换用的属性值-->
            <properties>
                <jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
            </properties>
            <!--设置默认启动-->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <!--定义具体的环境:开发环境-->
        <profile>
            <id>dep_env</id>
            <properties>
                <jdbc.url>jdbc:mysql://127.2.2.2:3306/ssm_db</jdbc.url>
            </properties>
        </profile>
    </profiles>

加载指定环境:

# mvn 指令 -P 环境id
mvn install -P pro_env

跳过测试

使用命令跳过测试

执行的指令生命周期必须包含测试环节

mvn 指令 -D skipTests

使用界面操作跳过测试

在这里插入图片描述

使用配置跳过测试

测试阶段是由插件完成的,所以可以通过配置对应的插件来跳过部分测试

<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests><!-- 设置跳过测试 -->
<includes> <!-- 包含指定的测试用例 -->
<include>**/User*Test.java</include>
</includes>
<excludes><!-- 排除指定的测试用例 -->
<exclude>**/User*TestCase.java</exclude>
</excludes>
</configuration>
</plugin>

私服

nexus 是 Sonatype 公司的一款 maven 私服产品

D:\ProgramFiles\nexus-3.74.0-05-java17-win64\nexus-3.74.0-05\bin 目录下启动 nexus 服务器:

nexus.exe /run nexus

访问地址是 localhost:8081

私服资源获取:

在这里插入图片描述

在这里插入图片描述


原文地址:https://blog.csdn.net/DanielSYC/article/details/127944462

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!