欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > Maven-课堂笔记

Maven-课堂笔记

2024/11/30 17:24:40 来源:https://blog.csdn.net/DanielSYC/article/details/127944462  浏览:    关键词: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 {@Testpublic 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

私服资源获取:

在这里插入图片描述

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com