网站主机建设方案,seo查询工具精准,获取整个网站源码工具,wordpress注册邮件问题一.Maven简介
Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。
一个 Maven 工程有约定的目录结构#xff0c;约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环#xff0c;就拿自动编译来说#xff0c;Maven 必须 能…一.Maven简介
Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。
一个 Maven 工程有约定的目录结构约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环就拿自动编译来说Maven 必须 能找到 Java 源文件下一步才能编译而编译之后也必须有一个准确的位置保持编译得到的字节码文件。 我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪那么基本上就是两种方式
通过配置的形式明确告诉它基于第三方工具或框架的约定 Maven 对工程目录结构的要求 在没有maven前 在有了maven后 1.maven特点
1标准化的项目结构
不同IDE之间的项目结构不同会导致IDE之间不通用而maven就解决了这个问题 2标准化的构建流程
每一个项目都会经过,编译,测试,打包,发布,利用简单的命令就能完成一些大型项目 3依赖管理机制
管理你项目所依赖的第三方资源(因为如果项目较大,那jar包也会很多得去一个一个的去网上找资源下载jar包而maven就解决了这个问题,给一个坐标的配置就能轻松导入jar包) 2.maven运行架构 1.项目对象模型:每个jar包的唯一标识 2.仓库maven去哪调用了这些jar包呢是去仓库找到了jar包
二.Maven仓库 因为国外的中央仓库访问速度比较慢还有一些jar包有版权找不到所以国内或企业就建立了私服远程仓库
三.Maven 开发环境配置
1.下载安装
首页Maven – Welcome to Apache Maven
下载页面Maven – Download Apache Maven 2. 指定本地仓库
本地仓库默认值用户家目录/.m2/repository。由于本地仓库的默认位置是在用户的家目录下而家目录往往是在 C 盘也就是系统盘。将来 Maven 仓库中 jar 包越来越多仓库体积越来越大可能会拖慢 C 盘运行速度影响系统性能。所以建议将 Maven 的本地仓库放在其他盘符下。配置方式如下
!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
localRepository/path/to/local/repo/localRepository
--
localRepositoryD:\software\maven-repository/localRepository本地仓库这个目录我们手动创建一个空的目录即可。
记住一定要把 localRepository 标签从注释中拿出来。
注意本地仓库本身也需要使用一个非中文、没有空格的目录。
3.配置阿里云提供的镜像仓库
Maven 下载 jar 包默认访问境外的中央仓库而国外网站速度很慢。改成阿里云提供的镜像仓库访问国内网站可以让 Maven 下载 jar 包的时候速度更快。配置的方式是
将原有的例子配置注释掉
!-- mirroridmaven-default-http-blocker/idmirrorOfexternal:http:*/mirrorOfnamePseudo repository to mirror external repositories initially using HTTP./nameurlhttp://0.0.0.0//urlblockedtrue/blocked
/mirror --加入自己的配置
mirroridnexus-aliyun/idmirrorOfcentral/mirrorOfnameNexus aliyun/nameurlhttp://maven.aliyun.com/nexus/content/groups/public/url
/mirror4.配置基础 JDK 版本
如果按照默认配置运行Java 工程使用的默认 JDK 版本是 1.5而我们熟悉和常用的是 JDK 1.8 版本。修改配置的方式是将 profile 标签整个复制到 settings.xml 文件的 profiles 标签内。
profileidjdk-1.8/idactivationactiveByDefaulttrue/activeByDefaultjdk1.8/jdk/activationpropertiesmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.targetmaven.compiler.compilerVersion1.8/maven.compiler.compilerVersion/properties
/profile四.Maven 的使用
1.核心概念坐标
数学中的坐标使用 x、y、z 三个『向量』作为空间的坐标系可以在『空间』中唯一的定位到一个『点』。 Maven中的坐标使用三个『向量』在『Maven的仓库』中唯一的定位到一个『jar』包。
**groupId**公司或组织的 id即公司或组织域名的倒序通常也会加上项目名称
例如groupIdcom.javatv.maven
**artifactId**一个项目或者是项目中的一个模块的 id即模块的名称将来作为 Maven 工程的工程名
例如artifactIdauth
**version**版本号参数版本之类
例如version1.0.0
提示坐标和仓库中 jar 包的存储路径之间的对应关系如下
groupIdjavax.servlet/groupId
artifactIdservlet-api/artifactId
version2.5/version上面坐标对应的 jar 包在 Maven 本地仓库中的位置
Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar2.pom.xml
**POMProject Object Model项目对象模型。**和 POM 类似的是DOMDocument Object Model文档对象模型。它们都是模型化思想的具体体现。POM 表示将工程抽象为一个模型再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。我们在开发过程中最基本的做法就是将现实生活中的事物抽象为模型然后封装模型相关的数据作为一个对象这样就可以在程序中计算与现实事物相关的数据。
POM 理念集中体现在 Maven 工程根目录下 pom.xml 这个配置文件中。所以这个 pom.xml 配置文件就是 Maven 工程的核心配置文件。其实学习 Maven 就是学这个文件怎么配置各个配置有什么用。
!-- 当前Maven工程的坐标 --
groupIdcom.example/groupId
artifactIddemo/artifactId
version0.0.1-SNAPSHOT/version
namedemo/name
descriptionDemo project for Spring Boot/description
!-- 当前Maven工程的打包方式可选值有下面三种 --
!-- jar表示这个工程是一个Java工程 --
!-- war表示这个工程是一个Web工程 --
!-- pom表示这个工程是“管理其他工程”的工程 --
packagingjar/packaging
properties!-- 工程构建过程中读取源码时使用的字符集 --project.build.sourceEncodingUTF-8/project.build.sourceEncoding
/properties
!-- 当前工程所依赖的jar包 --
dependencies!-- 使用dependency配置一个具体的依赖 --dependency!-- 在dependency标签内使用具体的坐标依赖我们需要的一个jar包 --groupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version!-- scope标签配置依赖的范围 --scopetest/scope/dependency
/dependencies3.Maven生命周期 4.Maven分模块开发与设计
1分模块开发的意义
目的项目的扩展性变强了方便其他项目引用相同的功能。 将原始模块按照功能拆分成若干个子模块方便模块间的相互调用接口共享 具体来说
解耦模块化和复用性 将系统分解为模块可以提高代码的模块化程度每个模块专注于特定的功能或业务逻辑。这种模块化的设计有利于提高代码的复用性可以更方便地在不同的系统中重用模块。
简化开发和维护 分模块开发可以让团队成员专注于各自模块的开发工作减少了开发过程中的复杂性。此外当系统需要维护或进行扩展时可以更容易地定位和修改特定模块而不影响其他部分的代码。
团队协作和并行开发 通过划分模块不同的开发人员可以独立负责不同的模块从而实现并行开发。这有助于提高团队的协作效率同时也可以缩短软件开发周期。
提高系统的可维护性和可扩展性 由于各个模块之间的相对独立性当需要对系统进行扩展或修改时可以更容易地理解和管理各个模块降低了对整个系统的影响。
降低风险和便于测试 各个模块相对独立对于系统进行单元测试、集成测试和功能测试时可以更加简便同时在部署和故障排查时可以更容易地定位问题范围。
2如何进行分模块开发
首先明白模块之间怎么联系对于从中央仓库或私服仓库导入的插件或jar先是通过从中央仓库或私服下载到本地仓库中再导入到该项目所以多模块开发就是将相应的jar包导入本地仓库供其他模块使用其groupId便是本地仓库的文件目录而maven就提供了直接打jar包并放入本地仓库的插件
mvn install注意事项
团队内部开发需要发布模块功能到团队内部可共享的仓库中私服
5.依赖管理
1依赖范围
上面说到我们使用 Maven 最主要的就是使用它的依赖管理功能引入依赖存在一个范围maven的依赖范围包括 compileprovideruntimetestsystem。
**compile**表示编译范围指 A 在编译时依赖 B该范围为默认依赖范围。编译范围的依赖会用在编译测试运行由于运行时需要所以编译范围的依赖会被打包。**provided**provied 依赖只有当 jdk 或者一个容器已提供该依赖之后才使用。provide 依赖在编译和测试时需要在运行时不需要。例如servlet api被Tomcat容器提供了。**runtime**runtime 依赖在运行和测试系统时需要但在编译时不需要。例如jdbc 的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。**test**test 范围依赖在编译和运行时都不需要只在测试编译和测试运行时需要。例如Junit。由于运行时不需要所以 test 范围依赖不会被打包。**system**system 范围依赖与 provide 类似但是必须显示的提供一个对于本地系统中 jar 文件的路径。一般不推荐使用。
依赖范围编译测试运行时是否会被打入jar包compile√√√√provided√√××runtime×√√√test×√××system√√×√
而在实际开发中我们常用的就是 compile、test、provided 。
2依赖的传递
A 依赖 BB 依赖 C那么在 A 没有配置对 C 的依赖的情况下A 里面能不能直接使用 C
再以上的前提下C 是否能够传递到 A取决于 B 依赖 C 时使用的依赖范围。
B 依赖 C 时使用 compile 范围可以传递B 依赖 C 时使用 test 或 provided 范围不能传递所以需要这样的 jar 包时就必须在需要的地方明确配置依赖才可以。
依赖冲突的优先级
直接依赖在当前项目中通过依赖配置建立的依赖关系间接依赖被资源的资源如果依赖其他资源当前项目间接依赖其他资源特殊优先当同级配置了相同资源的不同版本后配置的覆盖先配置的 该pom文件下相同jar包自下而上不同家族同层自上而下 3可选依赖
A依赖BB依赖CB不想被A依赖可以选择false隐藏
可选依赖指对外隐藏当前所依赖的资源————不透明
dependencygroupIdcom.itheima/groupIdartifactIdmaven_B_pojo/artifactIdversion1.0-SNAPSHOT/version!--可选依赖是隐藏当前工程所依赖的资源隐藏后对应资源将不具有依赖传递性--optionalfalse/optional
/dependency4排除依赖
A依赖BB依赖CA不想依赖B可以选择在A中排除B 排除依赖指主动断开依赖的资源被排除的资源无需指定版本————不需要排除依赖资源仅指定GA即可无需指定V
一般通过使用excludes标签配置依赖的排除
dependency
dependencygroupIdcom.itheima/groupIdartifactIdmaven_04_dao/artifactIdversion1.0-SNAPSHOT/version!--排除依赖是隐藏当前资源对应的依赖关系--exclusionsexclusiongroupIdlog4j/groupIdartifactIdlog4j/artifactId/exclusionexclusiongroupIdorg.mybatis/groupIdartifactIdmybatis/artifactId/exclusion/exclusions
/dependency5可选依赖和排除依赖的区别 6.聚合
1聚合工程
什么叫聚合 聚合将多个模块组织成一个整体同时进行项目构建的过程称为聚合就是如果B依赖C但是C改了其中影响B的量那么错误难以排除但是聚合就可以统一对模块进行构建编译等操作等一个jar改变时直接提醒报错。 聚合工程通常是一个不具有业务功能的”空“工程有且仅有一个pom文件 作用使用聚合工程可以将多个工程编组通过对聚合工程进行构建实现对所包含的模块进行同步构建 当工程中某个模块发生更新变更时必须保障工程中与已更新模块关联的模块同步更新此时可以使用聚合工程来解决批量模块同步构建的问题 2聚合工程开发
2.1 创建Maven模块设置打包类型为pom
packagingpom/packaging注意事项
每个maven工程都有对应的打包方式默认为jarweb工程打包方式为war
2.2 设置当前聚合工程所包含的子模块名称
modulesmodule../maven_ssm/modulemodule../maven_pojo/modulemodule../maven_dao/module
/modules注意事项
聚合工程中所包含的模块在进行构建时会根据模块间的依赖关系设置构建顺序与聚合工程中模块的配置书写位置无关。参与聚合的工程无法向上感知是否参与聚合只能向下配置哪些模块参与本工程的聚合。
用一个空模块来进行聚合
7.继承
1概念
Maven工程之间A 工程继承 B 工程
B 工程父工程A 工程子工程
本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置。
通常是一个不具有业务功能的”空“工程有且仅有一个pom文件与继承一样
2作用
在父工程中统一管理项目中的依赖信息具体来说是管理依赖信息的版本。 需求一这三个项目都需要spring包
需求二前两个需要test
它背后的需求是
在每一个 module 中各自维护各自的依赖信息很容易发生出入不易统一管理。使用同一个框架内的不同 jar 包它们应该是同一个版本所以整个项目中使用的框架版本需要统一。使用框架时所需要的 jar 包组合或者说依赖信息组合需要经过长期摸索和反复调试最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。
3继承关系开发
3.1 创建Maven模块设置打包类型为pom
packagingpom/packaging注意事项
建议父工程打包方式设置为pom
3.2 在父工程的pom文件中配置依赖关系子工程将沿用父工程中的依赖关系
dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.2.10.RELEASE/version/dependency……
/dependencies3.3 在父工程的pom文件中配置子工程中可选的依赖关系
此为可选依赖当继承此工程时如果加上该名jar包而不写版本便是该工程版本完成需求二
dependencyManagementdependenciesdependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.16/version/dependency……/dependencies
/dependencyManagement3.4 在子工程中配置当前工程所继承的父工程
完成需求一
!--定义该工程的父工程--
parentgroupIdcom.itheima/groupIdartifactIdmaven_parent/artifactIdversion1.0-SNAPSHOT/version!--填写父工程的pom文件根据实际情况填写加速找到--relativePath../maven_parent/pom.xml/relativePath
/parent3.5 在子工程中配置使用父工程中可选依赖的坐标
dependenciesdependency!--不需要加版本因为是继承的工程--groupIdcom.alibaba/groupIdartifactIddruid/artifactId/dependency
/dependencies注意事项
子工程中使用父工程中的可选依赖时仅需要提供群组id和项目id无需提供版本版本由父工程统一提供避免版本冲突子工程中还可以定义父工程中没有定义的依赖关系
8.聚合与继承的区别
聚合和继承的作用
作用 聚合用于快速统一修改构建项目继承用于快速统一配置项目 相同点 聚合与继承的pom.xml文件打包方式均为pom可以将两种关系制作到同一个pom文件中聚合与继承均属于设计型模块并无实际的模块内容 不同点 聚合是在当前模块中配置关系聚合可以感知到参与聚合的模块有哪些继承是在子模块中配置关系父模块无法感知哪些子模块继承了自己
五.属性管理
1.属性
属性具体来说就是一个变量定义属性有什么好处通过改变一个来统一改变简化开发 1 属性配置与使用
1.1 定义属性
可以通过控制父类继承再控制全部
!--定义自定义属性--
propertiesspring.version5.2.10.RELEASE/spring.versionjunit.version4.12/junit.version
/properties1.2 引用属性
dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion${spring.version}/version
/dependency2资源文件引用属性
2.1 定义属性
!--定义自定义属性--
propertiesspring.version5.2.10.RELEASE/spring.versionjunit.version4.12/junit.versionjdbc.urljdbc:mysql://127.0.0.1:3306/ssm_db/jdbc.url
/properties2.2 配置文件中引用属性
jdbc.drivercom.mysql.jdbc.Driver
jdbc.url${jdbc.url}
jdbc.usernameroot
jdbc.passwordroot2.3 开启资源文件目录加载属性的过滤器
就是让此resources下的文件去识别pom文件中的变量能够使用${}
buildresourcesresourcedirectory${project.basedir}/src/main/resources/directoryfilteringtrue/filtering/resource/resources
/build2.4 配置maven打war包时忽略web.xml检查
plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-war-plugin/artifactIdversion3.2.3/versionconfigurationfailOnMissingWebXmlfalse/failOnMissingWebXml/configuration
/plugin3其他属性了解
自上而下的优先级
属性列表 自定义属性常用内置属性Setting属性Java系统属性环境变量属性 可以通过上述命令去找到变量都有啥。
2. 版本管理
项目开发的版本可以分为哪几种
1工程版本
SNAPSHOT快照版本 项目开发过程中临时输出的版本称为快照版本快照版本会随着开发的进展不断更新 RELEASE发布版本 项目开发到进入阶段里程碑后向团队外部发布较为稳定的版本这种版本所对应的构件文件是稳定的即便进行功能的后续开发也不会改变当前发布版本内容这种版本称为发布版本
2发布版本
alpha版beta版纯数字版 六.多环境配置与应用
1. 多环境配置作用
maven提供配置多种环境的设定帮助开发者使用过程中快速切换环境 2. 多环境配置步骤
1 定义多环境
!--定义多环境--
profile!--定义具体的环境生产环境--profile!--定义环境对应的唯一名称--idenv_dep/id!--定义环境中专用的属性值--propertiesjdbc.urljdbc:mysql://127.0.0.1:3306/ssm_db/jdbc.url/properties!--设置默认启动--activationactiveByDefaulttrue/activeByDefault/activation/profile!--定义具体的环境开发环境--profileidenv_pro/id……/profile
/profiles2 使用多环境构建过程
【命令】
mvn 指令 –P 环境定义id【范例】
mvn install –P pro_env3.跳过测试了解
因为在构建过程中你只想测试某个功能即使你知道有些功能没有完善会报错因此跳过测试这些错误直接打jar包就是跳过测试
1应用场景
功能更新中并且没有开发完毕快速打包……
2跳过测试命令
mvn install –D skipTests
注意事项
执行的项目构建指令必须包含测试生命周期否则无效果。例如执行compile生命周期不经过test生命周期。
3细粒度控制跳过测试
pluginartifactIdmaven-surefire-plugin/artifactIdversion2.22.1/versionconfigurationskipTeststrue/skipTests!--设置跳过测试--includes!--包含指定的测试用例--include**/User*Test.java/include/includesexcludes!--排除指定的测试用例--exclude**/User*TestCase.java/exclude/excludes/configuration
/plugin七.私服
1.私服介绍
1介绍 团队开发现状分析 私服是一台独立的服务器用于解决团队内部的资源共享与资源同步问题 Nexus Sonatype公司的一款maven私服产品下载地址https://help.sonatype.com/repomanager3/download 2Nexus安装与启动 启动服务器命令行启动 nexus.exe /run nexus 访问服务器默认端口8081 http://localhost:8081 修改基础配置信息 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息例如默认访问端口。 修改服务器运行配置信息 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息例如默认占用内存空间。
3私服资源操作流程分析 2. 私服仓库分类 宿主仓库是用于存储和管理开发团队自主研发的软件包、库和资源的地方。它提供了版本控制、权限管理和发布功能使团队成员可以上传、下载和管理这些软件包和资源。宿主仓库可以包含自己开发的代码、库和工具以及第三方的软件包方便团队内部统一管理和使用。 代理仓库充当了中间缓存的角色用于在使用外部或公共的远程仓库时加快访问速度。代理仓库会缓存从远程仓库下载的软件包以便下次请求时可以直接从缓存中获取从而提高软件包下载的效率。这样可以减少对远程仓库的依赖加快构建过程并提供离线访问的能力 仓库组是一个逻辑组合将多个宿主仓库和代理仓库组合成一个统一的仓库。仓库组可以由多个宿主仓库和代理仓库组成并提供单一的访问点。这样开发人员可以从仓库组中获取所需的软件包和资源而无需关心具体的底层仓库。仓库组能够简化依赖管理并提供对多个仓库的透明访问。
3.资源上传与下载
往私服上传资源是否需要身份认证在哪里设置认证信息 1从私服中下载依赖
【第一步】在maven的settings.xml中mirrors标签中配置此时就需要注释掉aliyun的配置。
mirroridnexus-heima/idmirrorOf*/mirrorOfurlhttp://localhost:8081/repository/maven-public//url
/mirror【第二步】在nexus中设置允许匿名下载如果不允许将不会从私服中下载依赖 如果私服中没有对应的jar会去中央仓库下载速度很慢。可以配置让私服去阿里云中下载依赖。 2上传依赖到私服中
【第一步】配置本地仓库访问私服的权限在maven的settings.xml的servers标签中配置
server!--id任意多个server的id不重复就行后面会用到--idheima-nexus/idusernameadmin/usernamepassword123456/password!--填写自己nexus设定的登录秘密--
/server【第一步】配置当前项目访问私服上传资源的保存位置项目的pom.xml文件中配置
distributionManagementrepository!--和maven/settings.xml中server中的id一致表示使用该id对应的用户名和密码--idheima-nexus/id!--如果jar的版本是release版本那么就上传到这个仓库根据自己情况修改--urlhttp://localhost:8081/repository/heima-releases//url/repositorysnapshotRepository!--和maven/settings.xml中server中的id一致表示使用该id对应的用户名和密码--idheima-nexus/id!--如果jar的版本是snapshot版本那么就上传到这个仓库根据自己情况修改--urlhttp://localhost:8081/repository/heima-snapshots//url/snapshotRepository
/distributionManagement注意要和maven的settings.xml中server中定义的idheima-nexus/id对应
【第三步】发布资源到私服命令
mvn deployheima-nexus admin 123456 【第一步】配置当前项目访问私服上传资源的保存位置项目的pom.xml文件中配置xml
distributionManagementrepository!--和maven/settings.xml中server中的id一致表示使用该id对应的用户名和密码--idheima-nexus/id!--如果jar的版本是release版本那么就上传到这个仓库根据自己情况修改--urlhttp://localhost:8081/repository/heima-releases//url/repositorysnapshotRepository!--和maven/settings.xml中server中的id一致表示使用该id对应的用户名和密码--idheima-nexus/id!--如果jar的版本是snapshot版本那么就上传到这个仓库根据自己情况修改--urlhttp://localhost:8081/repository/heima-snapshots//url/snapshotRepository
/distributionManagement注意要和maven的settings.xml中server中定义的idheima-nexus/id对应
【第三步】发布资源到私服命令
mvn deploy