命令行环境
Maven 中的坐标
1、向量:在 Maven 仓库中唯一地定位到一个 jar 包
(1)groupId:公司或组织的 id
(2)artifactld:一个项目或项目中的一个模块的 id
(3)version:版本号
2、取值方式
(1)groupld:公司或组织域名的倒序,通常加上项目名称
(2)artifactld:模块名称,作为 Maven 工程的工程名
(3)version:模块版本号,根据需要自定义
3、坐标与仓库中 jar 包的存储路径,存在对应关系
使用命令生成 Maven 工程
1、命令行转到工程目录
2、mvn archetype:generate
(1)mvn 为主命令
(2)插件与目标使用 : 分隔,子命令的插件可以有多个目标
3、定义
(1)Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7:(选择 archetype 模式,直接回车,默认值为 7)
(2)Define value for property 'groupId': 指定 groupld(无默认值)
(3)Define value for property 'artifactId': 指定 artifactld(无默认值)
(4)Define value for property 'version' 1.0-SNAPSHOT: : 指定版本号(直接回车,默认值为 1.0-SNAPSHOT)
(5)Define value for property 'package' 上文指定 groupId: : 指定包名(直接回车,默认值为上文指定 groupId)
4、确认
(1)Confirm properties configuration:
(2)groupId: 指定 groupId
(3)artifactId: 指定 artifactId
(4)version: 版本号
(5)package: 包名
(6)Y: :(直接回车,表示确认,若要重新输入,则输入 N,再回车)
调整
1、可以删除自动生成
(1)Maven 工程目录\src\main\java\包路径\cmd\App.java
(2)Maven 工程目录\src\test\java\包路径\cmd\AppTest.java
2、工程下的 pom.xml
(1)依赖 junit4
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
(2)改为依赖 junit5
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
工程目录
1、pom.xml:Maven 核心配置文件
<!-- project 标签:根标签,表示配置、管理当前工程 -->
<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 标签:从 Maven 2 开始,固定 4.0.0.0,代表当前 pom.xml 采用的标签结构 -->
<modelVersion>4.0.0</modelVersion>
<!-- 坐标信息 -->
<!-- groupId 标签:表示公司或组织开发的某个项目 -->
<groupId>com.king.cmd</groupId>
<!-- artifactId 标签:表示项目下的某个模块 -->
<artifactId>project01-maven-java</artifactId>
<!-- version 标签:表示当前模块版本 -->
<version>1.0-SNAPSHOT</version>
<!-- package 标签:表示当前模块打包方式,默认为 jar,表示 Java 工程;取值为 war,表示 Web 工程;取值 pom:说明该工程用于管理其他工程 -->
<packaging>jar</packaging>
<name>project01-maven-java</name>
<url>http://maven.apache.org</url>
<!-- 在 Maven 中定义属性值 -->
<properties>
<!-- 在构建过程中,读取源码时,所使用的字符集 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- depenencies 标签:配置具体依赖信息,可以包含多个 dependency 子标签 -->
<dependencies>
<!-- dependency 标签:配置一个具体依赖信息 -->
<dependency>
<!-- 根据坐标信息,定位、导入 jar 包 -->
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<!-- scope 标签:配置当前依赖范围 -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
(1)POM:Project Object Model,项目对象模型
(2)和 POM 类似:DOM:DocumentObjectModel,文档对象模型
(3)POM、DOM 都是模型化思想的具体体现
(4)模型化思想:POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型,这样就可以用程序来管理项目
(5)POM 理念集中体现在 Maven 工程根目录下 pom.xml 配置文件中
2、src 源码目录
(1)main(主体程序目录)-> java(Java 源代码)-> package 目录、resources(配置文件)
(2)test(测试程序目录)-> java(Java 源代码)-> package 目录、resources(配置文件)
3、target:存放构建操作输出结构结果
4、约定目录结构的意义:Maven 为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用
5、约定大于配置,配置大于编码:Maven 对于目录结构这个问题,没有采用配置的方式,而是基于约定,在开发过程中非常方便
Java 工程的 Maven 构建命令
1、要求:运行 Maven 构建操作相关的命令时,必须进入到 pom.xml 所在的目录
(1)如果没有在 pom.xml 所在的目录运行 Maven 的构建命令,出现错误信息:The goal you specified requires a project to execute but there is no POM in this directory
(2)mvn- v 命令和构建操作无关,只要正确配置 PATH,在任何目录下都可以执行
(3)构建相关命令要在 pom.xml 所在目录下运行,操作哪个工程,就进入该工程 pom.xml 目录
(3)可以复合操作
2、清理操作
(1)清理 target 目录:mvn clean
(2)清理该项目依赖的本地仓库中的 maven 包,清理 pom.xml 中的包,并重新下载,但不清理不在 pom.xml 中的依赖包:mvn dependency:purge-local-repository
(3)清除某个 jar:mvn dependency:purge-local-repository -DmanualInclude="groupId:artifactId"
(4)清除多个属于不同 groupId 的 jar:mvn dependency:purge-local-repository -DmanualInclude="groupId1:artifactId1,groupId2:artifactId2,……"
(5)阻止 Maven 对已删除的 jar 进行重新解析依赖关系:mvn dependency:purge-local-repository -DreResolve=false
(6)actTransitively 是否应该对所有传递依赖性起作用,默认值为true:mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false
(7)--fail-at-end 忽略错误,对于依赖关系混乱的项目,或依赖于一些内部的仓库:mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false --fail-at-end
(8)清理 Maven 本地仓库中下载失败的包 .bat文件
set REPOSITORY_PATH=本地仓库路径
# rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
del /s /q %%i
)
# rem 搜索完毕
pause
3、编译操作
(1)主程序编译:mvn compile
(2)测试程序编译:mvn test-compile
(3)主体程序编译结果存放目录:target/classes
(4)测试程序编译结果存放目录:target/test-classes
4、测试操作
(1)mvn test
(2)测试报告存放目录:target/surefire-reports
(3)测试之前,自动执行前置操作
(4)surefire-reports 目录:存放测试报告
5、打包操作
(1)mvn package
(2)存放目录:target
6、安装操作
(1)mvn install
(2)mvn clean install:先清理,后安装,确保按照最新源代码进行安装
(3)将本地构建过程中生成的 jar 包,存入 Maven 本地仓库,该 jar 包在 Maven 本地仓库中的路径是根据它的坐标生成的
(4)另外,安装操作还会将 pom.xml 文件,转换为 XXX.pom 文件,存入本地仓库,本质上是同一个文件
7、查看依赖:mvn dependency:list / mvn dependency:tree
创建 Maven 版 Web 工程
1、需要专门生成 Web 工程骨架的 archetype
(1)mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -Darchetypeversion=1.4
(2)注意,不能在一个非 pom 的工程下再创建其他工程,即不能在其他 Maven 工程目录下执行(1)
2、目录结构
(1)pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.king.cmd</groupId>
<artifactId>project02-maven-web</artifactId>
<!-- Web 工程以 war 格式打包 -->
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>project02-maven-web Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>project02-maven-web</finalName>
</build>
</project>
(2)src -> main -> webapp -> index.jsp、WEB-INF -> web.xml
3、定义
(1)Define value for property 'groupId': 指定 groupld(无默认值)
(2)Define value for property 'artifactId': 指定 artifactld(无默认值)
(3)Define value for property 'version' 1.0-SNAPSHOT: : 指定版本号(直接回车,默认值为 1.0-SNAPSHOT)
(4)Define value for property 'package' 上文指定 groupId: : 指定包名(直接回车,默认值为上文指定 groupId)
4、确认
(1)Confirm properties configuration:
(2)groupId: 指定 groupId
(3)artifactId: 指定 artifactId
(4)version: 版本号
(5)package: 包名
(6)Y: :(直接回车,表示确认,若要重新输入,则输入 N,再回车)
5、指定目录下
(1)创建 Servlet 类
(2)web.xml 注册 Servlet
(3)index.jsp 页面编写超链接
构建命令
1、编译操作
(1)编译前,pom.xml 手动导入 servlet-api 依赖
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
(2)mvn compile / mvn clean compile
2、打包操作:mvn package / mvn clean package
3、测试操作:mvn test
4、查看依赖:mvn dependency:list / mvn dependency:tree
部署 Web 工程
1、target 目录下存在 war 包,与war 包的解压目录
2、二选一,部署到 Tomcat 根目录下的 webapps 目录
使 Web 工程依赖 Java 工程
1、只有 Web 工程 / Java 工程依赖 Java 工程,Java 工程依赖 Web 工程
(1)本质上,Web 工程依赖的 Java 工程,就是 Web 工程里导入 jar 包
(2)Java 工程的 jar 包,部署在 Web 工程的 WEB-INF/lib 目录下
2、配置对 Java 工程依赖:Web 工程的 pom.xml 中,在 dependencies 标签导入 jar 坐标信息
3、测试
(1)Web 工程 src 目录下,创建 test\java\包路径 目录
(2)确认 Web 工程依赖 junit
(3)创建测试类
(4)mvn test
依赖范围
1、标签位置
<dependencies>
<dependency>
<scope>值</scope>
</dependency>
</dependencies>
2、可选值
(1)compile:默认值,第三方框架 jar 包,在项目实际运行时使用的 jar 包
(2)test:测试过程中使用的 jar 包
(3)provided:在开发过程中需要用到的服务器上的 jar 包,通常以 provided 修饰,provided 范围的 jar 包不参与部署,避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担
(4)system
(5)runtime
(6)import
3、不同值,表示引入的包,在不同范围下是否可用
main 目录(空间) | test 目录(空间) | 开发过程(时间) | 部署到服务器(时间) | |
compile | 有效 | 有效 | 有效 | 有效 |
test | 无效 | 有效 | 有效 | 无效 |
provided | 有效 | 有效 | 有效 | 无效 |
依赖的传递性
1、compile:可传递
2、test、provided:不可传递
依赖的排除
1、阻止某些 jar 包的传递
(1)避免不同版本传递的 jar 包冲突
(2)避免依赖循环 / 循环引用,报错信息:[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:
2、配置方式
(1)位置:pom.xml 的 dependency 标签中
(2)exclusions 标签配置排除依赖
<exclusions>
<!-- exclusion标签配置一个具体排除的依赖 -->
<exclusion>
<!-- 配置坐标信息,不需要version -->
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
继承
1、本质:子工程的 pom.xml 中的配置,继承父工程中 pom.xml 的配置
2、作用
(1)在父工程中统一管理项目中依赖信息的版本
(2)避免每个模块的依赖信息冲突
(3)同一个框架内的不同 jar 包,统一为同一个版本
(4)保证了整个项目使用规范、准确的 jar 包,节约时间
3、父工程
(1)修改打包方式:<packaging>pom</packaging>
(2)只有打包方式为 pom 的 Maven 工程,才能管理其他 Maven 工程
(3)不写业务代码,专门管理其他 Maven 工程
(4)modules 标签,聚合配置
<!-- 聚合的配置 -->
<modules>
<module>子工程的artifactId</module>
</modules>
(5)dependencyManagement 标签统一管理依赖信息
<!-- 被管理的依赖没有真正引入到子工程,需要在子工程明确配置具体依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<!-- 子模块坐标信息 -->
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
</dependencyManagement>
(6)properties 标签,创建自定义属性标签,引用属性表达式,动态变化 jar 包 version
(7)父工程 properties 格式
<properties>
<属性名>属性值</属性名>
<properties>
4、子工程
(1)位置:父工程的根目录
(2)创建命令:mvn archetype:generate
(3)子工程 pom.xml 查看父工程
<parent>
<!-- 父模块坐标信息,子工程、父工程的groupId、version,若相同,可以省略 -->
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</parent>
(4)对于已经在父工程进行管理的依赖,子工程引用时:可以省略 version,则采用父工程中的 version;配置与父工程 version 不一致,则采用子工程 version
(5)properties 标签,创建自定义属性标签,引用属性表达式,动态变化 jar 包 version
(6)子工程引用父工程 properties 格式
<version></version>
5、properties
(1)properties 的属性值可以通过使用符号 ${X} 在 POM 中的任何位置访问,其中 X 是属性名
(2)properties 标签,创建自定义属性标签,引用属性表达式,动态变化 jar 包 version
6、五种不同风格的 properties
(1)env.X:使用 env 来定义变量。将返回 shell 的环境变量。例如,${env.PATH} 包含 PATH 环境变量
(2)注意:虽然环境变量本身在 Windows 上不区分大小写,但查找属性区分大小写。换句话说,虽然 Windows shell 为 %PATH% 和 %Path% 返回相同的值,但 Maven 区分
(3)project.x:POM中的点(.)记号路径将包含相应元素的值。例如:可以通过 ${project.version} 访问 <project><version>1.0</version></project>
(4)settings.x:settings.xml 中的点(.)标注路径将包含相应的元素的值。例如:<settings><offline>false</offline></ settings> 可通过 ${settings.offline} 访问
(5)Java 系统属性:可通过 java.lang.System.getProperties() 访问的所有属性都可用作 POM 属性,如:${java.home}
(6)x:在 POM 中的 <properties />元素中设置。<properties><someVar>value</someVar></properties> 的值可以用作 ${someVar}
聚合
1、在父工程目录下,调用 mvn archetype:generate 创建模块工程,自动完成聚合配置
<!-- 聚合的配置 -->
<modules>
<module>子工程的artifactId</module>
</modules>
2、作用
(1)很多 Maven 构建命令都可以在总工程中一键执行,并自动按照正确顺序执行
(2)总工程中展示一个列表,总览各个模块工程
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战