长沙行业网站建设费用标准,php网站开发外文文献,做一网站要学些什么软件,消防微型建设标准的网站是多少Maven
一#xff1a;什么是Maven#xff1a;
Maven是一个项目管理工具#xff0c;用于构建和管理Java项目。它可以帮助开发人员自动化构建过程#xff0c;管理项目依赖关系#xff0c;并协助项目的发布和部署。通过Maven#xff0c;开发人员可以定义项目的结构、依赖关…Maven
一什么是Maven
Maven是一个项目管理工具用于构建和管理Java项目。它可以帮助开发人员自动化构建过程管理项目依赖关系并协助项目的发布和部署。通过Maven开发人员可以定义项目的结构、依赖关系和构建过程简化项目的管理和维护。
Maven通过一个项目对象模型Project Object ModelPOM文件来描述项目的结构和配置信息。开发人员可以在POM文件中定义项目的元数据、依赖关系、构建插件等信息然后使用Maven命令来执行各种构建任务例如编译、打包、测试、部署等。
Maven还提供了丰富的插件和生命周期概念使得开发人员可以轻松地扩展和定制构建过程。同时Maven还支持集成各种仓库管理工具方便管理项目依赖的第三方库。
总的来说Maven是一个功能强大的项目管理工具可以帮助开发人员更高效地构建、管理和发布Java项目。
二工程创建
2.1.GAVP
Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写其中前三个是必要的而 Packaging 属性为可选项。这四个属性主要为每个项目在maven仓库总做一个标识类似人的《姓-名》。有了具体标识方便maven软件对项目进行管理和互相引用
GAV遵循一下规则
1 GroupID 格式com.{公司/BU }.业务线.[子业务线]最多 4 级。
说明{公司/BU} 例如alibaba/taobao/tmall/aliexpress 等 BU 一级子业务线可选。正例com.taobao.tddl 或 com.alibaba.sourcing.multilang com.atguigu.java2 ArtifactID 格式产品线名-模块名。语义不重复不遗漏先到仓库中心去查证一下。
正例tc-client / uic-api / tair-tool / bookstore3 Version版本号格式推荐主版本号.次版本号.修订号 1.0.0
1 主版本号当做了不兼容的 API 修改或者增加了能改变产品方向的新功能。2 次版本号当做了向下兼容的功能性新增新增类、接口等。3 修订号修复 bug没有修改方法签名的功能加强保持 API 兼容性。例如 初始→1.0.0 修改bug → 1.0.1 功能调整 → 1.1.1等Packaging定义规则
指示将项目打包为什么类型的文件idea根据packaging值识别maven项目类型
packaging 属性为 jar默认值代表普通的Java工程打包以后是.jar结尾的文件。
packaging 属性为 war代表Java的web工程打包以后.war结尾的文件。
packaging 属性为 pom代表不会打包用来做继承的父工程。
例如创建一个新模块 上面是在电脑中的搜索路径下面是在Maven中的搜索注意此处省略了version直接给了一个默认值 version1.0-SNAPSHOT /version。 在XML中可以改写这些配置。
2.2.WEB项目创建
2.2.1.手动 2.2.2.插件创建 下载插件并且右键即可 2.3.Maven工程项目结构说明
Maven 是一个强大的构建工具它提供一种标准化的项目结构可以帮助开发者更容易地管理项目的依赖、构建、测试和发布等任务。以下是 Maven Web 程序的文件结构及每个文件的作用
|-- pom.xml # Maven 项目管理文件
|-- src|-- main # 项目主要代码| |-- java # Java 源代码目录| | -- com/example/myapp # 开发者代码主目录| | |-- controller # 存放 Controller 层代码的目录| | |-- service # 存放 Service 层代码的目录| | |-- dao # 存放 DAO 层代码的目录| | -- model # 存放数据模型的目录| |-- resources # 资源目录存放配置文件、静态资源等| | |-- log4j.properties # 日志配置文件| | |-- spring-mybatis.xml # Spring Mybatis 配置文件| | -- static # 存放静态资源的目录| | |-- css # 存放 CSS 文件的目录| | |-- js # 存放 JavaScript 文件的目录| | -- images # 存放图片资源的目录| -- webapp # 存放 WEB 相关配置和资源| |-- WEB-INF # 存放 WEB 应用配置文件| | |-- web.xml # Web 应用的部署描述文件| | -- classes # 存放编译后的 class 文件| -- index.html # Web 应用入口页面-- test # 项目测试代码|-- java # 单元测试目录-- resources # 测试资源目录pom.xmlMaven 项目管理文件用于描述项目的依赖和构建配置等信息。src/main/java存放项目的 Java 源代码。src/main/resources存放项目的资源文件如配置文件、静态资源等。src/main/webapp/WEB-INF存放 Web 应用的配置文件。src/main/webapp/index.htmlWeb 应用的入口页面。src/test/java存放项目的测试代码。src/test/resources存放测试相关的资源文件如测试配置文件等。
三Maven核心功能依赖和构建管理
3.1 依赖管理和配置
Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中避免出现版本冲突和依赖缺失等问题。
我们通过定义 POM 文件Maven 能够自动解析项目的依赖关系并通过 Maven 仓库自动下载和管理依赖从而避免了手动下载和管理依赖的繁琐工作和可能引发的版本冲突问题。
maven项目信息属性配置和读取
!-- 模型版本 --
modelVersion4.0.0/modelVersion
!-- 公司或者组织的唯一标志并且配置时生成的路径也是由此生成 如com.companyname.project-groupmaven会将该项目打成的jar包放本地路径/com/companyname/project-group --
groupIdcom.companyname.project-group/groupId
!-- 项目的唯一ID一个groupId下面可能多个项目就是靠artifactId来区分的 --
artifactIdproject/artifactId
!-- 版本号 --
version1.0.0/version!--打包方式默认jarjar指的是普通的java项目打包方式 项目打成jar包war指的是web项目打包方式项目打成war包pom不会讲项目打包这个项目作为父工程被其他工程聚合或者继承后面会讲解两个概念
--
packagingjar/pom/war/packaging依赖管理和添加
!-- 通过编写依赖jar包的gav必要属性引入第三方依赖scope属性是可选的可以指定依赖生效范围依赖信息查询方式1. maven仓库信息官网 https://mvnrepository.com/2. mavensearch插件搜索--
dependencies!-- 引入具体的依赖包 --dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version!--生效范围- compile main目录 test目录 打包打包 [默认]- providedmain目录 test目录 Servlet- runtime 打包运行 MySQL- test: test目录 junit--scoperuntime/scope/dependency/dependencies我们可以通过以下方法获取第三方依赖信息 注意如果不会使用scope那就直接默认值。
依赖版本提取和维护:
!--声明版本--
properties!--命名随便,内部制定版本号即可--junit.version4.11/junit.version!-- 也可以通过 maven规定的固定的key配置maven的参数如下配置编码格式--project.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncoding
/propertiesdependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactId!--引用properties声明版本 --version${junit.version}/version/dependency
/dependencies3.2依赖传递和冲突
依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B而 B 又依赖于模块或库 C那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。当我们引入一个库或框架时构建工具如 Maven、Gradle会自动解析和加载其所有的直接和间接依赖确保这些依赖都可用。
依赖传递的作用是
减少重复依赖当多个项目依赖同一个库时Maven 可以自动下载并且只下载一次该库。这样可以减少项目的构建时间和磁盘空间。自动管理依赖: Maven 可以自动管理依赖项使用依赖传递简化了依赖项的管理使项目构建更加可靠和一致。确保依赖版本正确性通过依赖传递的依赖之间都不会存在版本兼容性问题确实依赖的版本正确性
依赖传递演示
项目中需要导入jackson相关的依赖通过之前导入经验jackson需要导入三个依赖分别为 通过查看网站介绍的依赖传递特性data-bind中依赖其他两个依赖 最佳导入直接可以导入data-bind自动依赖传递需要的依赖
!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.15.0/version
/dependency依赖冲突演示
当直接引用或者间接引用出现了相同的jar包! 这时呢一个项目就会出现相同的重复jar包这就算作冲突依赖冲突避免出现重复依赖并且终止依赖传递 maven自动解决依赖冲突问题能力会按照自己的原则进行重复依赖选择。同时也提供了手动解决的冲突的方式不过不推荐
解决依赖冲突如何选择重复依赖方式 自动选择原则 短路优先原则第一原则 A—B—C—D—E—X(version 0.0.1) A—F—X(version 0.0.2) 则A依赖于X(version 0.0.2)。 依赖路径长度相同情况下则“先声明优先”第二原则 A—E—X(version 0.0.1) A—F—X(version 0.0.2) 在 depencies /depencies中先声明的路径相同会优先选择
小思考:
前提A 1.1 - B 1.1 - C 1.1 F 2.2 - B 2.2 pom声明F 2.2A 1.1 B 2.2 3.3 依赖导入失败场景和解决方案
在使用 Maven 构建项目时可能会发生依赖项下载错误的情况主要原因有以下几种
下载依赖时出现网络故障或仓库服务器宕机等原因导致无法连接至 Maven仓库从而无法下载依赖。依赖项的版本号或配置文件中的版本号错误或者依赖项没有正确定义导致 Maven 下载的依赖项与实际需要的不一致从而引发错误。本地 Maven 仓库或缓存被污染或损坏导致 Maven 无法正确地使用现有的依赖项并且也无法重新下载
解决方案 检查网络连接和 Maven 仓库服务器状态。 确保依赖项的版本号与项目对应的版本号匹配并检查 POM 文件中的依赖项是否正确。 清除本地 Maven 仓库缓存lastUpdated 文件因为只要存在lastupdated缓存文件刷新也不会重新下载。本地仓库中根据依赖的gav属性依次向下查找文件夹最终删除内部的文件刷新重新下载即可 例如 pom.xml依赖
dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.2.8/version
/dependency文件
脚本使用
使用记事本打开 set REPOSITORY_PATHD:\repository 改成你本地仓库地址即可 点击运行脚本即可自动清理本地错误缓存文件
3.4 扩展构建管理和插件配置
构建概念:
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
主动触发场景
重新编译 : 编译不充分, 部分文件没有被编译!打包 : 独立部署到外部服务器软件,打包部署部署本地或者私服仓库 : maven工程加入到本地或者私服仓库,供其他工程使用
命令方式构建:
语法: mvn 构建命令 构建命令…
命令描述mvn clean清理编译或打包后的项目结构,删除target文件夹mvn compile编译项目生成target文件mvn test执行测试源码 (测试)mvn site生成一个项目依赖信息的展示页面mvn package打包项目生成war / jar 文件mvn install打包后上传到maven本地仓库(本地部署)mvn deploy只打包上传到maven私服仓库(私服部署)
可视化方式构建: 我在进行打war包时提示出错找了好久最后在pom中加上
buildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-war-plugin/artifactIdversion3.2.2/version/plugin/plugins/build并且mvn dependency:purge-local-repository就好了。
但是如果是jar包就不需要该操作。
构建命令周期:
构建生命周期可以理解成是一组固定构建命令的有序集合触发周期后的命令会自动触发周期前的命令也是一种简化构建的思路! 清理周期主要是对项目编译生成文件进行清理 包含命令clean 默认周期定义了真正构件时所需要执行的所有步骤它是生命周期中最核心的部分 包含命令compile - test - package - install / deploy 报告周期 包含命令site 打包: mvn clean package 本地仓库: mvn clean install
最佳使用方案:
打包: mvn clean package
重新编译: mvn clean compile
本地部署: mvn clean install 周期命令和插件:
周期→包含若干命令→包含若干插件!
使用周期命令构建简化构建过程
最终进行构建的是插件
插件配置:
这是web工程的配置
build!-- jdk17 和 war包版本插件不匹配 --pluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-war-plugin/artifactIdversion3.2.2/version/plugin/plugins
/build我还能说什么…
四、Maven继承和聚合特性
4.1 Maven工程继承关系
在实际开发中可能会遇到以下问题 继承概念 Maven 继承是指在 Maven 的项目中让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息简化项目的管理和维护工作。 继承作用 作用在父工程中统一管理项目中的依赖信息,进行统一版本管理! 它的背景是 对一个比较大型的项目进行了模块拆分。一个 project 下面创建了很多个 module。每一个 module 都需要配置自己的依赖信息。 它背后的需求是 多个模块要使用同一个框架它们应该是同一个版本所以整个项目中使用的框架版本需要统一管理。使用框架时所需要的 jar 包组合或者说依赖信息组合需要经过长期摸索和反复调试最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。 通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包又能够将以往的经验沉淀下来节约时间和精力。 继承语法 父工程
groupIdcom.atguigu.maven/groupId
artifactIdpro03-maven-parent/artifactId
version1.0-SNAPSHOT/version
!-- 当前工程作为父工程它要去管理子工程所以打包方式必须是 pom --
packagingpom/packaging
注意父工程一般 packagingpom /packaging。
子工程
!-- 使用parent标签指定当前工程的父工程 --
parent!-- 父工程的坐标 --groupIdcom.atguigu.maven/groupIdartifactIdpro03-maven-parent/artifactIdversion1.0-SNAPSHOT/version
/parent!-- 子工程的坐标 --
!-- 如果子工程坐标中的groupId和version与父工程一致那么可以省略 --
!-- groupIdcom.atguigu.maven/groupId --
artifactIdpro04-maven-module/artifactId
!-- version1.0-SNAPSHOT/version --父工程依赖统一管理 父工程声明版本
!-- 使用dependencyManagement标签配置对依赖的管理 --
!-- 被管理的依赖并没有真正被引入到工程 --
dependencyManagementdependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion4.0.0.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-beans/artifactIdversion4.0.0.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion4.0.0.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-expression/artifactIdversion4.0.0.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion4.0.0.RELEASE/version/dependency/dependencies
/dependencyManagement - 子工程引用版本
!-- 子工程引用父工程中的依赖信息时可以把版本号去掉。 --
!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 --
!-- 具体来说是由父工程的dependencyManagement来决定。 --
dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactId/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-beans/artifactId/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactId/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-expression/artifactId/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactId/dependency
/dependencies注意子工程会覆盖父工程。
4.2 Maven工程聚合关系 聚合概念 Maven 聚合是指将多个项目组织到一个父级项目中通过触发父工程的构建,统一按顺序触发子工程构建的过程!! 聚合作用 统一管理子项目构建通过聚合可以将多个子项目组织在一起方便管理和维护。优化构建顺序通过聚合可以对多个项目进行顺序控制避免出现构建依赖混乱导致构建失败的情况。 聚合语法 父项目中包含的子项目列表。
projectgroupIdcom.example/groupIdartifactIdparent-project/artifactIdpackagingpom/packagingversion1.0.0/versionmodulesmodulechild-project1/modulemodulechild-project2/module/modules
/project聚合演示 通过触发父工程构建命令、引发所有子模块构建产生反应堆
注意继承和聚合并不是严格的捆绑关系而是可以灵活的变化比如通过删除module就可以去除聚合但是继承依然存在。