精华内容
下载资源
问答
  • Maven中版本号定义及规范(官方)

    千次阅读 2020-12-18 11:58:04
    经常听到升版本,升版本,却不知道版本号的具体使用规则,特意查了下maven中版本的控制。 官方说明 语义化版本控制2.0.0添加链接描述 语义化版本 2.0.0 摘要 版本格式:主版本号.次版本号.修订号,版本号递增...

    经常听到升版本,升版本,却不知道版本号的具体使用规则,特意查了下maven中版本的控制。

    官方说明
    在这里插入图片描述
    语义化版本控制2.0.0传送门
    在这里插入图片描述

    语义化版本 2.0.0

    摘要

    版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

    1. 主版本号:当你做了不兼容的 API 修改,
    2. 次版本号:当你做了向下兼容的功能性新增,
    3. 修订号:当你做了向下兼容的问题修正。

    先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

    简介

    在软件管理的领域里存在着被称作“依赖地狱”的死亡之谷,系统规模越大,加入的包越多,你就越有可能在未来的某一天发现自己已深陷绝望之中。

    在依赖高的系统中发布新版本包可能很快会成为噩梦。如果依赖关系过高,可能面临版本控制被锁死的风险(必须对每一个依赖包改版才能完成某次升级)。而如果依赖关系过于松散,又将无法避免版本的混乱(假设兼容于未来的多个版本已超出了合理数量)。当你专案的进展因为版本依赖被锁死或版本混乱变得不够简便和可靠,就意味着你正处于依赖地狱之中。

    作为这个问题的解决方案之一,我提议用一组简单的规则及条件来约束版本号的配置和增长。这些规则是根据(但不局限于)已经被各种封闭、开放源码软件所广泛使用的惯例所设计。为了让这套理论运作,你必须先有定义好的公共 API 。这可以透过文件定义或代码强制要求来实现。无论如何,这套 API 的清楚明了是十分重要的。一旦你定义了公共 API,你就可以透过修改相应的版本号来向大家说明你的修改。考虑使用这样的版本号格式:X.Y.Z (主版本号.次版本号.修订号)修复问题但不影响API 时,递增修订号;API 保持向下兼容的新增及修改时,递增次版本号;进行不向下兼容的修改时,递增主版本号。

    我称这套系统为“语义化的版本控制”,在这套约定下,版本号及其更新方式包含了相邻版本间的底层代码和修改内容的信息。

    语义化版本控制规范(SemVer)

    以下关键词 MUST、MUST NOT、REQUIRED、SHALL、SHALL NOT、SHOULD、SHOULD NOT、 RECOMMENDED、MAY、OPTIONAL 依照 RFC 2119 的叙述解读。(译注:为了保持语句顺畅, 以下文件遇到的关键词将依照整句语义进行翻译,在此先不进行个别翻译。)

    1. 使用语义化版本控制的软件必须(MUST)定义公共 API。该 API 可以在代码中被定义或出现于严谨的文件内。无论何种形式都应该力求精确且完整。

    2. 标准的版本号必须(MUST)采用 X.Y.Z 的格式,其中 X、Y 和 Z 为非负的整数,且禁止(MUST NOT)在数字前方补零。X 是主版本号、Y 是次版本号、而 Z 为修订号。每个元素必须(MUST)以数值来递增。例如:1.9.1 -> 1.10.0 -> 1.11.0。

    3. 标记版本号的软件发行后,禁止(MUST NOT)改变该版本软件的内容。任何修改都必须(MUST)以新版本发行。

    4. 主版本号为零(0.y.z)的软件处于开发初始阶段,一切都可能随时被改变。这样的公共 API 不应该被视为稳定版。

    5. 1.0.0 的版本号用于界定公共 API 的形成。这一版本之后所有的版本号更新都基于公共 API 及其修改内容。

    6. 修订号 Z(x.y.Z | x > 0)必须(MUST)在只做了向下兼容的修正时才递增。这里的修正指的是针对不正确结果而进行的内部修改。

    7. 次版本号 Y(x.Y.z | x > 0)必须(MUST)在有向下兼容的新功能出现时递增。在任何公共 API 的功能被标记为弃用时也必须(MUST)递增。也可以(MAY)在内部程序有大量新功能或改进被加入时递增,其中可以(MAY)包括修订级别的改变。每当次版本号递增时,修订号必须(MUST)归零。

    8. 主版本号 X(X.y.z | X > 0)必须(MUST)在有任何不兼容的修改被加入公共 API 时递增。其中可以(MAY)包括次版本号及修订级别的改变。每当主版本号递增时,次版本号和修订号必须(MUST)归零。

    9. 先行版本号可以(MAY)被标注在修订版之后,先加上一个连接号再加上一连串以句点分隔的标识符来修饰。标识符必须(MUST)由 ASCII 字母数字和连接号 [0-9A-Za-z-] 组成,且禁止(MUST NOT)留白。数字型的标识符禁止(MUST NOT)在前方补零。先行版的优先级低于相关联的标准版本。被标上先行版本号则表示这个版本并非稳定而且可能无法满足预期的兼容性需求。范例:1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92。

    10. 版本编译元数据可以(MAY)被标注在修订版或先行版本号之后,先加上一个加号再加上一连串以句点分隔的标识符来修饰。标识符必须(MUST)由 ASCII 字母数字和连接号 [0-9A-Za-z-] 组成,且禁止(MUST NOT)留白。当判断版本的优先层级时,版本编译元数据可(SHOULD)被忽略。因此当两个版本只有在版本编译元数据有差别时,属于相同的优先层级。范例:1.0.0-alpha+001、1.0.0+20130313144700、1.0.0-beta+exp.sha.5114f85。

    11. 版本的优先层级指的是不同版本在排序时如何比较。判断优先层级时,必须(MUST)把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较(版本编译元数据不在这份比较的列表中)。由左到右依序比较每个标识符,第一个差异值用来决定优先层级:主版本号、次版本号及修订号以数值比较,例如:1.0.0 < 2.0.0 < 2.1.0 < 2.1.1。当主版本号、次版本号及修订号都相同时,改以优先层级比较低的先行版本号决定。例如:1.0.0-alpha < 1.0.0。有相同主版本号、次版本号及修订号的两个先行版本号,其优先层级必须(MUST)透过由左到右的每个被句点分隔的标识符来比较,直到找到一个差异值后决定:只有数字的标识符以数值高低比较,有字母或连接号时则逐字以 ASCII 的排序来比较。数字的标识符比非数字的标识符优先层级低。若开头的标识符都相同时,栏位比较多的先行版本号优先层级比较高。范例:1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0。

    为什么要使用语义化的版本控制?

    这并不是一个新的或者革命性的想法。实际上,你可能已经在做一些近似的事情了。问题在于只是“近似”还不够。如果没有某个正式的规范可循,版本号对于依赖的管理并无实质意义。将上述的想法命名并给予清楚的定义,让你对软件使用者传达意向变得容易。一旦这些意向变得清楚,弹性(但又不会太弹性)的依赖规范就能达成。

    举个简单的例子就可以展示语义化的版本控制如何让依赖地狱成为过去。假设有个名为“救火车”的函式库,它需要另一个名为“梯子”并已经有使用语义化版本控制的包。当救火车创建时,梯子的版本号为 3.1.0。因为救火车使用了一些版本 3.1.0 所新增的功能, 你可以放心地指定依赖于梯子的版本号大等于 3.1.0 但小于 4.0.0。这样,当梯子版本 3.1.1 和 3.2.0 发布时,你可以将直接它们纳入你的包管理系统,因为它们能与原有依赖的软件兼容。

    作为一位负责任的开发者,你理当确保每次包升级的运作与版本号的表述一致。现实世界是复杂的,我们除了提高警觉外能做的不多。你所能做的就是让语义化的版本控制为你提供一个健全的方式来发行以及升级包,而无需推出新的依赖包,节省你的时间及烦恼。

    如果你对此认同,希望立即开始使用语义化版本控制,你只需声明你的函式库正在使用它并遵循这些规则就可以了。请在你的 README 文件中保留此页连结,让别人也知道这些规则并从中受益。

    FAQ

    在 0.y.z 初始开发阶段,我该如何进行版本控制?

    最简单的做法是以 0.1.0 作为你的初始化开发版本,并在后续的每次发行时递增次版本号。

    如何判断发布 1.0.0 版本的时机?

    当你的软件被用于正式环境,它应该已经达到了 1.0.0 版。如果你已经有个稳定的 API 被使用者依赖,也会是 1.0.0 版。如果你很担心向下兼容的问题,也应该算是 1.0.0 版了。

    这不会阻碍快速开发和迭代吗?

    主版本号为零的时候就是为了做快速开发。如果你每天都在改变 API,那么你应该仍在主版本号为零的阶段(0.y.z),或是正在下个主版本的独立开发分支中。

    对于公共 API,若即使是最小但不向下兼容的改变都需要产生新的主版本号,岂不是很快就达到 42.0.0 版?

    这是开发的责任感和前瞻性的问题。不兼容的改变不应该轻易被加入到有许多依赖代码的软件中。升级所付出的代价可能是巨大的。要递增主版本号来发行不兼容的改版,意味着你必须为这些改变所带来的影响深思熟虑,并且评估所涉及的成本及效益比。

    为整个公共 API 写文件太费事了!

    为供他人使用的软件编写适当的文件,是你作为一名专业开发者应尽的职责。保持专案高效一个非常重要的部份是掌控软件的复杂度,如果没有人知道如何使用你的软件或不知道哪些函数的调用是可靠的,要掌控复杂度会是困难的。长远来看,使用语义化版本控制以及对于公共 API 有良好规范的坚持,可以让每个人及每件事都运行顺畅。

    万一不小心把一个不兼容的改版当成了次版本号发行了该怎么办?

    一旦发现自己破坏了语义化版本控制的规范,就要修正这个问题,并发行一个新的次版本号来更正这个问题并且恢复向下兼容。即使是这种情况,也不能去修改已发行的版本。可以的话,将有问题的版本号记录到文件中,告诉使用者问题所在,让他们能够意识到这是有问题的版本。

    如果我更新了自己的依赖但没有改变公共 API 该怎么办?

    由于没有影响到公共 API,这可以被认定是兼容的。若某个软件和你的包有共同依赖,则它会有自己的依赖规范,作者也会告知可能的冲突。要判断改版是属于修订等级或是次版等级,是依据你更新的依赖关系是为了修复问题或是加入新功能。对于后者,我经常会预期伴随着更多的代码,这显然会是一个次版本号级别的递增。

    如果我变更了公共 API 但无意中未遵循版本号的改动怎么办呢?(意即在修订等级的发布中,误将重大且不兼容的改变加到代码之中)

    自行做最佳的判断。如果你有庞大的使用者群在依照公共 API 的意图而变更行为后会大受影响,那么最好做一次主版本的发布,即使严格来说这个修复仅是修订等级的发布。记住, 语义化的版本控制就是透过版本号的改变来传达意义。若这些改变对你的使用者是重要的,那就透过版本号来向他们说明。

    我该如何处理即将弃用的功能?

    弃用现存的功能是软件开发中的家常便饭,也通常是向前发展所必须的。当你弃用部份公共 API 时,你应该做两件事:(1)更新你的文件让使用者知道这个改变,(2)在适当的时机将弃用的功能透过新的次版本号发布。在新的主版本完全移除弃用功能前,至少要有一个次版本包含这个弃用信息,这样使用者才能平顺地转移到新版 API。

    语义化版本对于版本的字串长度是否有限制呢?

    没有,请自行做适当的判断。举例来说,长到 255 个字元的版本已过度夸张。再者,特定的系统对于字串长度可能会有他们自己的限制。

    关于

    语义化版本控制的规范是由 Gravatars 创办者兼 GitHub 共同创办者 Tom Preston-Werner 所建立。

    如果您有任何建议,请到 GitHub 上提出您的问题

    许可证

    知识共享 署名 3.0 (CC BY 3.0)

    展开全文
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    文章目录 Java面试总结 基础知识 Java概述 基础语法 面向对象 集合框架 IO流 网络编程 常用API 日期时间API 常用工具类库 单元测试 异常 日志 Java8新特性 工具 IDEA Eclipse & STS Maven Docker Git GitLab Git...

    更新于2021-08-13 22:55:12

    欢迎关注微信公众号【技术人成长之路】

    【技术人成长之路】,助力技术人成长!更多精彩文章第一时间在公众号发布哦!

    本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽

    整理的Java知识体系主要包括基础知识,工具,并发编程,数据结构与算法,数据库,JVM,架构设计,应用框架,中间件,微服务架构,分布式架构,程序员的一些思考,团队与项目管理,运维,权限,推荐书籍,云计算,区块链等,包含了作为一个Java工程师在开发工作学习中需要用到或者可能用到的绝大部分知识。千里之行始于足下,希望大家根据自己的薄弱点,查缺补漏,根据自己感兴趣的方面多学习,学的精通一点,从现在开始行动起来。路漫漫其修远兮,吾将上下而求索,不管编程开发的路有多么难走,多么艰辛,我们都将百折不挠,不遗余力地去追求和探索

    文章目录

    Java面试总结

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…

    序号内容链接地址
    1Java基础知识面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390612
    2Java集合容器面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588551
    3Java异常面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390689
    4并发编程面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104863992
    5JVM面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390752
    6Spring面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397516
    7Spring MVC面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397427
    8Spring Boot面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397299
    9Spring Cloud面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397367
    10MyBatis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/101292950
    11Redis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/103522351
    12MySQL数据库面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104778621
    13消息中间件MQ与RabbitMQ面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588612
    14Dubbo面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390006
    15Linux面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588679
    16Tomcat面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397665
    17ZooKeeper面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397719
    18Netty面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104391081
    19架构设计&分布式&数据结构与算法面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/105870730

    基础知识

    Java概述

    序号内容链接地址
    1Java简介https://thinkwon.blog.csdn.net/article/details/94353575
    2Java发展历程https://thinkwon.blog.csdn.net/article/details/94353653
    3Java语言特点https://thinkwon.blog.csdn.net/article/details/94354013
    4JDK安装与环境变量配置https://thinkwon.blog.csdn.net/article/details/94353907
    5JVM、JRE和JDK的关系https://thinkwon.blog.csdn.net/article/details/101369973
    6Java是编译型还是解释型语言https://thinkwon.blog.csdn.net/article/details/108678327

    基础语法

    大部分已完成

    待整理:

    Java开发必会的反编译知识(附支持对Lambda进行反编译的工具)

    一文读懂什么是Java中的自动拆装箱

    Java的枚举类型用法介绍

    类、枚举、接口、数组、可变参数

    泛型、序列化

    序号内容链接地址
    1Java标识符https://thinkwon.blog.csdn.net/article/details/101637454
    2Java关键字(Java 8版本)https://thinkwon.blog.csdn.net/article/details/101642385
    3Java注释https://thinkwon.blog.csdn.net/article/details/101643185
    4Java访问修饰符https://thinkwon.blog.csdn.net/article/details/101643412
    5Java分隔符https://thinkwon.blog.csdn.net/article/details/101643617
    6Java转义字符https://thinkwon.blog.csdn.net/article/details/101643769
    7Java进制https://thinkwon.blog.csdn.net/article/details/101643936
    8Java流程控制语句https://thinkwon.blog.csdn.net/article/details/101645978
    9Java流程控制语句-顺序结构https://thinkwon.blog.csdn.net/article/details/101644820
    10Java流程控制语句-分支结构https://thinkwon.blog.csdn.net/article/details/101645224
    11Java流程控制语句-循环结构https://thinkwon.blog.csdn.net/article/details/101645757
    12Java表达式https://thinkwon.blog.csdn.net/article/details/101648114
    13Java运算符https://thinkwon.blog.csdn.net/article/details/101649002
    14Java变量https://thinkwon.blog.csdn.net/article/details/101649292
    15Java常量https://thinkwon.blog.csdn.net/article/details/101649446
    16Java数据类型https://thinkwon.blog.csdn.net/article/details/101649568
    17Java反射https://thinkwon.blog.csdn.net/article/details/100128361
    18Java语法糖https://thinkwon.blog.csdn.net/article/details/100103689
    19Java注解https://thinkwon.blog.csdn.net/article/details/100178709
    20JSON简介https://thinkwon.blog.csdn.net/article/details/100642585
    21Properties类简介https://thinkwon.blog.csdn.net/article/details/100667783
    22XML简介https://thinkwon.blog.csdn.net/article/details/100642425
    23YML简介https://thinkwon.blog.csdn.net/article/details/100642870
    24Java8新特性-Lambda表达式https://thinkwon.blog.csdn.net/article/details/100642932
    25Java基础语法https://thinkwon.blog.csdn.net/article/details/94354151

    面向对象

    待整理:

    抽象

    继承、封装、多态

    接口、抽象类、内部类

    序号内容链接地址
    1什么是面向对象https://thinkwon.blog.csdn.net/article/details/100667386

    集合框架

    迭代器、增强for、泛型

    序号内容链接地址
    1Java集合框架总结https://thinkwon.blog.csdn.net/article/details/98844796
    2ArrayList(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/98845119
    3HashMap(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/98845487
    4LinkedHashMap(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/102574293
    5LinkedList(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/102573923
    6TreeMap(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/102571883

    IO流

    待整理:

    File、递归

    字节流、字节缓冲流

    编码表、编码方式、转换流、序列化、序列化流、打印流、commons-io

    网络编程

    网络概述、网络模型

    Socket原理机制

    UDP

    TCP/IP

    协议、OSI 七层协议、HTTP、HTTP2.0、HTTPS

    网络安全

    ​ XSS、CSRF、SQL注入、Hash Dos、脚本注入、漏洞扫描工具、验证码

    ​ DDoS防范、用户隐私信息保护、序列化漏洞

    ​ 加密解密、对称加密、哈希算法、非对称加密

    ​ 服务安全、数据安全、数据备份

    ​ 网络隔离、登录跳板机、非外网分离

    ​ 认证、授权

    常用API

    String、StringBuffer、StringBuilder、正则表达式

    Number、Radom、Math、System、包装类

    Arrays、Collections

    日期时间API

    序号内容链接地址
    1Java7日期时间APIhttps://thinkwon.blog.csdn.net/article/details/110777654
    2史上最全Java7日期时间工具类https://thinkwon.blog.csdn.net/article/details/110779441
    3Java8日期时间APIhttps://thinkwon.blog.csdn.net/article/details/111087199
    4史上最全Java8日期时间工具类https://thinkwon.blog.csdn.net/article/details/111116600

    常用工具类库

    待整理:OkHttp、commons-lang3

    序号内容链接地址
    1HttpClient工具类https://thinkwon.blog.csdn.net/article/details/101391489
    2WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换https://thinkwon.blog.csdn.net/article/details/101392187
    3Lombok简介、使用、工作原理、优缺点https://thinkwon.blog.csdn.net/article/details/101392808
    4Java几种常用JSON库性能比较https://thinkwon.blog.csdn.net/article/details/94354358

    单元测试

    JUnit

    异常

    序号内容链接地址
    1Java异常总结https://thinkwon.blog.csdn.net/article/details/94346911
    2Java异常架构与异常关键字https://thinkwon.blog.csdn.net/article/details/101676779
    3Java异常处理流程https://thinkwon.blog.csdn.net/article/details/101677638
    4如何选择异常类型https://thinkwon.blog.csdn.net/article/details/94346911
    5Java异常常见面试题https://thinkwon.blog.csdn.net/article/details/101681073
    6Java异常处理最佳实践https://thinkwon.blog.csdn.net/article/details/94347002

    日志

    序号内容链接地址
    1常用日志框架Log4j,Logback,Log4j2性能比较与日志门面SLF4J简介https://thinkwon.blog.csdn.net/article/details/101621135
    2日志作用https://thinkwon.blog.csdn.net/article/details/101619725
    3Apache Log4j2详解https://thinkwon.blog.csdn.net/article/details/95043111
    4Log4j2同步日志,混合日志和异步日志配置详解https://thinkwon.blog.csdn.net/article/details/101625124
    5Log4j2配置文件详解https://thinkwon.blog.csdn.net/article/details/101629302
    6Log4j2的Appenders配置详解https://thinkwon.blog.csdn.net/article/details/101625820
    7Log4j2的Filters配置详解https://thinkwon.blog.csdn.net/article/details/101627162
    8Log4j2的Policy触发策略与Strategy滚动策略配置详解https://thinkwon.blog.csdn.net/article/details/101628222
    9Log4j2的Loggers配置详解https://thinkwon.blog.csdn.net/article/details/101628736

    Java8新特性

    序号内容链接地址
    1Java8新特性-Lambda表达式https://thinkwon.blog.csdn.net/article/details/113764085
    2Java8新特性-Optionalhttps://thinkwon.blog.csdn.net/article/details/113791796
    3Java8新特性-Streamhttps://thinkwon.blog.csdn.net/article/details/113798096
    4Java8新特性-Base64https://thinkwon.blog.csdn.net/article/details/113798575
    5Java8新特性-日期时间APIhttps://thinkwon.blog.csdn.net/article/details/111087199

    工具

    IDEA

    序号内容链接地址
    1IDEA常用配置和常用插件https://thinkwon.blog.csdn.net/article/details/101020481
    2IDEA中Maven依赖下载失败解决方案https://thinkwon.blog.csdn.net/article/details/101312918
    3在IDEA中使用Linux命令https://thinkwon.blog.csdn.net/article/details/106320360

    Eclipse & STS

    序号内容链接地址
    1Eclipse & Spring Tool Suite常用配置https://thinkwon.blog.csdn.net/article/details/101025543

    Maven

    序号内容链接地址
    1Maven简介https://thinkwon.blog.csdn.net/article/details/94346090
    2Maven安装与配置https://thinkwon.blog.csdn.net/article/details/94346569
    3Maven依赖冲突https://thinkwon.blog.csdn.net/article/details/101483020
    4手动安装Maven依赖https://thinkwon.blog.csdn.net/article/details/101483478
    5Maven部署jar包到远程仓库https://thinkwon.blog.csdn.net/article/details/101483769
    6Maven私服Nexus安装与使用https://thinkwon.blog.csdn.net/article/details/94346681

    Docker

    序号内容链接地址
    1使用Docker安装GitLabhttps://thinkwon.blog.csdn.net/article/details/95042797
    2虚拟机和容器有什么不同https://thinkwon.blog.csdn.net/article/details/107476886
    3Docker 从入门到实践系列一 - 什么是Dockerhttps://thinkwon.blog.csdn.net/article/details/107477065
    4Docker 从入门到实践系列二 - Docker 安装https://thinkwon.blog.csdn.net/article/details/117638107
    5Docker 从入门到实践系列三 - Docker 常用命令https://thinkwon.blog.csdn.net/article/details/117638128
    6Docker 从入门到实践系列四 - Docker 容器编排利器 Docker Composehttps://thinkwon.blog.csdn.net/article/details/119511551

    Git

    序号内容链接地址
    1Git简介https://thinkwon.blog.csdn.net/article/details/94346816
    2版本控制https://thinkwon.blog.csdn.net/article/details/101449228
    3Git忽略文件.gitignore详解https://thinkwon.blog.csdn.net/article/details/101447866
    4Git与SVN的区别https://thinkwon.blog.csdn.net/article/details/101449611
    5常用Git命令https://thinkwon.blog.csdn.net/article/details/101450420
    6Git,GitHub与GitLab的区别https://thinkwon.blog.csdn.net/article/details/101470086

    GitLab

    GitKraken

    Navicat

    并发编程

    基础知识

    序号内容链接地址
    1并发编程的优缺点https://thinkwon.blog.csdn.net/article/details/102020811
    2线程的状态和基本操作https://thinkwon.blog.csdn.net/article/details/102027115
    3进程和线程的区别(超详细)https://thinkwon.blog.csdn.net/article/details/102021274
    4创建线程的四种方式https://thinkwon.blog.csdn.net/article/details/102021143

    并发理论

    序号内容链接地址
    1Java内存模型https://thinkwon.blog.csdn.net/article/details/102073578
    2重排序与数据依赖性https://thinkwon.blog.csdn.net/article/details/102073858
    3as-if-serial规则和happens-before规则的区别https://thinkwon.blog.csdn.net/article/details/102074107
    4Java并发理论总结https://thinkwon.blog.csdn.net/article/details/102074440

    并发关键字

    序号内容链接地址
    1Java并发关键字-synchronizedhttps://thinkwon.blog.csdn.net/article/details/102243189
    2Java并发关键字-volatilehttps://thinkwon.blog.csdn.net/article/details/102243670
    3Java并发关键字-finalhttps://thinkwon.blog.csdn.net/article/details/102244477

    Lock体系

    待整理:

    公平锁 & 非公平锁

    乐观锁 & 悲观锁

    可重入锁 & 不可重入锁

    互斥锁 & 共享锁

    死锁

    序号内容链接地址
    1Lock简介与初识AQShttps://thinkwon.blog.csdn.net/article/details/102468837
    2AQS(AbstractQueuedSynchronizer)详解与源码分析https://thinkwon.blog.csdn.net/article/details/102469112
    3ReentrantLock(重入锁)实现原理与公平锁非公平锁区别https://thinkwon.blog.csdn.net/article/details/102469388
    4读写锁ReentrantReadWriteLock源码分析https://thinkwon.blog.csdn.net/article/details/102469598
    5Condition源码分析与等待通知机制https://thinkwon.blog.csdn.net/article/details/102469889
    6LockSupport详解https://thinkwon.blog.csdn.net/article/details/102469993

    并发容器

    序号内容链接地址
    1并发容器之ConcurrentHashMap详解(JDK1.8版本)与源码分析https://thinkwon.blog.csdn.net/article/details/102506447
    2并发容器之ConcurrentLinkedQueue详解与源码分析https://thinkwon.blog.csdn.net/article/details/102508089
    3并发容器之CopyOnWriteArrayList详解https://thinkwon.blog.csdn.net/article/details/102508258
    4并发容器之ThreadLocal详解https://thinkwon.blog.csdn.net/article/details/102508381
    5ThreadLocal内存泄漏分析与解决方案https://thinkwon.blog.csdn.net/article/details/102508721
    6并发容器之BlockingQueue详解https://thinkwon.blog.csdn.net/article/details/102508901
    7并发容器之ArrayBlockingQueue与LinkedBlockingQueue详解https://thinkwon.blog.csdn.net/article/details/102508971

    线程池

    序号内容链接地址
    1线程池ThreadPoolExecutor详解https://thinkwon.blog.csdn.net/article/details/102541900
    2Executors类创建四种常见线程池https://thinkwon.blog.csdn.net/article/details/102541990
    3线程池之ScheduledThreadPoolExecutor详解https://thinkwon.blog.csdn.net/article/details/102542299
    4FutureTask详解https://thinkwon.blog.csdn.net/article/details/102542404

    原子操作类

    序号内容链接地址
    1原子操作类总结https://thinkwon.blog.csdn.net/article/details/102556910

    并发工具

    序号内容链接地址
    1并发工具之CountDownLatch与CyclicBarrierhttps://thinkwon.blog.csdn.net/article/details/102556958
    2并发工具之Semaphore与Exchangerhttps://thinkwon.blog.csdn.net/article/details/102557034

    并发实践

    序号内容链接地址
    1实现生产者消费者的三种方式https://thinkwon.blog.csdn.net/article/details/102557126

    数据结构与算法

    数据结构

    序号内容链接地址
    1红黑树详细分析(图文详解),看了都说好https://thinkwon.blog.csdn.net/article/details/102571535
    1、数组
    2、栈
    3、队列
    4、链表
    5、树
    	二叉树
        完全二叉树
        平衡二叉树
        二叉查找树(BST)
        红黑树
        B,B+,B*树
        LSM 树
    
    字段是不是数据结构
    

    算法

    语言只是编程工具,算法才是编程之魂!

    1、排序算法:快速排序、归并排序、计数排序
    2、搜索算法:回溯、递归、剪枝
    3、图论:最短路径、最小生成树、网络流建模
    4、动态规划:背包问题、最长子序列、计数问题
    5、基础技巧:分治、倍增、二分法、贪心算法
    
    宽度优先搜索
    深度优先搜索
    广度优先
    双指针
    扫描线
    
    朴素贝叶斯
    推荐算法
    

    排序算法

    序号内容链接地址
    1史上最全经典排序算法总结(Java实现)https://thinkwon.blog.csdn.net/article/details/95616819
    2冒泡排序(Bubble Sort)https://thinkwon.blog.csdn.net/article/details/101534473
    3选择排序(Selection Sort)https://thinkwon.blog.csdn.net/article/details/101534721
    4插入排序(Insertion Sort)https://thinkwon.blog.csdn.net/article/details/101537804
    5希尔排序(Shell Sort)https://thinkwon.blog.csdn.net/article/details/101538166
    6归并排序(Merge Sort)https://thinkwon.blog.csdn.net/article/details/101538756
    7快速排序(Quick Sort)https://thinkwon.blog.csdn.net/article/details/101543580
    8堆排序(Heap Sort)https://thinkwon.blog.csdn.net/article/details/101543941
    9计数排序(Counting Sort)https://thinkwon.blog.csdn.net/article/details/101544159
    10桶排序(Bucket Sort)https://thinkwon.blog.csdn.net/article/details/101544356
    11基数排序(Radix Sort)https://thinkwon.blog.csdn.net/article/details/101545529

    LeetCode

    序号内容链接地址
    1LeetCode第1题 两数之和(Two Sum)https://thinkwon.blog.csdn.net/article/details/103113049
    2LeetCode第3题 无重复字符的最长子串(Longest Substring Without Repeating Characters)https://thinkwon.blog.csdn.net/article/details/103113969
    3LeetCode第7题 整数反转(Reverse Integer)https://thinkwon.blog.csdn.net/article/details/103113167
    4LeetCode第9题 回文数(Palindrome Number)https://thinkwon.blog.csdn.net/article/details/103113151
    5LeetCode第13题 罗马数字转整数(Roman to Integer)https://thinkwon.blog.csdn.net/article/details/103113519
    6LeetCode第14题 最长公共前缀(Longest Common Prefix)https://thinkwon.blog.csdn.net/article/details/103113700
    7LeetCode第20题 有效的括号(Valid Parentheses)https://thinkwon.blog.csdn.net/article/details/103113848
    8LeetCode第26题 删除排序数组中的重复项(Remove Duplicates from Sorted Array)https://thinkwon.blog.csdn.net/article/details/103113097

    数据库

    Oracle

    MySQL

    数据库基础知识

    序号内容链接地址
    1MySQL语句分类https://thinkwon.blog.csdn.net/article/details/106610851
    2MySQL插入语句insert into,insert ignore into,insert into … on duplicate key update,replace into-解决唯一键约束https://thinkwon.blog.csdn.net/article/details/106610789
    3MySQL复制表的三种方式https://thinkwon.blog.csdn.net/article/details/106610810
    4MySQL删除表的三种方式https://thinkwon.blog.csdn.net/article/details/106610831
    5MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别https://thinkwon.blog.csdn.net/article/details/106610859

    数据类型

    引擎

    索引

    三大范式

    常用SQL语句

    存储过程与函数

    视图

    MySQL优化

    事务

    数据备份与还原

    Redis

    序号内容链接地址
    1Redis总结https://thinkwon.blog.csdn.net/article/details/99999584
    2Redis使用场景https://thinkwon.blog.csdn.net/article/details/101521497
    3Redis数据类型https://thinkwon.blog.csdn.net/article/details/101521724
    4Redis持久化https://thinkwon.blog.csdn.net/article/details/101522209
    5Redis过期键的删除策略https://thinkwon.blog.csdn.net/article/details/101522970
    6Redis数据淘汰策略https://thinkwon.blog.csdn.net/article/details/101530624
    7Redis与Memcached的区别https://thinkwon.blog.csdn.net/article/details/101530406
    8Redis常见面试题(精简版)https://thinkwon.blog.csdn.net/article/details/103522351
    9Redis中缓存雪崩、缓存穿透等问题的解决方案https://thinkwon.blog.csdn.net/article/details/103402008
    10阿里云Redis开发规范学习总结https://thinkwon.blog.csdn.net/article/details/103400250
    11Redis开发常用规范https://thinkwon.blog.csdn.net/article/details/103401781
    12这可能是最中肯的Redis规范了https://thinkwon.blog.csdn.net/article/details/103401978

    Java虚拟机

    深入理解Java虚拟机

    序号内容链接地址
    1深入理解Java虚拟机-走近Javahttps://thinkwon.blog.csdn.net/article/details/103804387
    2深入理解Java虚拟机-Java内存区域与内存溢出异常https://thinkwon.blog.csdn.net/article/details/103827387
    3深入理解Java虚拟机-垃圾回收器与内存分配策略https://thinkwon.blog.csdn.net/article/details/103831676
    4深入理解Java虚拟机-虚拟机执行子系统https://thinkwon.blog.csdn.net/article/details/103835168
    5深入理解Java虚拟机-程序编译与代码优化https://thinkwon.blog.csdn.net/article/details/103835883
    6深入理解Java虚拟机-高效并发https://thinkwon.blog.csdn.net/article/details/103836167

    架构设计

    高可用架构

    高并发架构

    可伸缩架构

    集群

    设计模式

    常用设计模式

    创建型:
    单例模式、工厂模式、抽象工厂模式

    结构型:
    适配器模式、外观模式、代理模式、装饰器模式

    行为型:
    观察者模式、策略模式、模板模式

    序号内容链接地址
    1设计模式https://thinkwon.blog.csdn.net/article/details/96829572

    创建型模式

    序号内容链接地址
    1抽象工厂模式https://thinkwon.blog.csdn.net/article/details/101382584
    2单例模式https://thinkwon.blog.csdn.net/article/details/101382855
    3工厂模式https://thinkwon.blog.csdn.net/article/details/101383285
    4建造者模式https://thinkwon.blog.csdn.net/article/details/101383401
    5原型模式https://thinkwon.blog.csdn.net/article/details/101383491

    结构型模式

    序号内容链接地址
    1代理模式https://thinkwon.blog.csdn.net/article/details/101384436
    2过滤器模式https://thinkwon.blog.csdn.net/article/details/101384514
    3桥接模式https://thinkwon.blog.csdn.net/article/details/101384584
    4适配器模式https://thinkwon.blog.csdn.net/article/details/101384619
    5外观模式https://thinkwon.blog.csdn.net/article/details/101384676
    6享元模式https://thinkwon.blog.csdn.net/article/details/101384716
    7装饰器模式https://thinkwon.blog.csdn.net/article/details/101384753
    8组合模式https://thinkwon.blog.csdn.net/article/details/101384786

    行为型模式

    序号内容链接地址
    1备忘录模式https://thinkwon.blog.csdn.net/article/details/101383582
    2策略模式https://thinkwon.blog.csdn.net/article/details/101383647
    3迭代器模式https://thinkwon.blog.csdn.net/article/details/101383722
    4访问者模式https://thinkwon.blog.csdn.net/article/details/101383780
    5观察者模式https://thinkwon.blog.csdn.net/article/details/101383872
    6解释器模式https://thinkwon.blog.csdn.net/article/details/101383930
    7空对象模式https://thinkwon.blog.csdn.net/article/details/101384001
    8命令模式https://thinkwon.blog.csdn.net/article/details/101384090
    9模板模式https://thinkwon.blog.csdn.net/article/details/101384138
    10责任链模式https://thinkwon.blog.csdn.net/article/details/101384195
    11中介者模式https://thinkwon.blog.csdn.net/article/details/101384251
    12状态模式https://thinkwon.blog.csdn.net/article/details/101384315

    J2EE模式

    序号内容链接地址
    1MVC模式https://thinkwon.blog.csdn.net/article/details/101381701
    2传输对象模式https://thinkwon.blog.csdn.net/article/details/101382134
    3服务定位器模式https://thinkwon.blog.csdn.net/article/details/101382179
    4拦截过滤器模式https://thinkwon.blog.csdn.net/article/details/101382210
    5前端控制器模式https://thinkwon.blog.csdn.net/article/details/101382247
    6数据访问对象模式https://thinkwon.blog.csdn.net/article/details/101382287
    7业务代表模式https://thinkwon.blog.csdn.net/article/details/101382356
    8组合实体模式https://thinkwon.blog.csdn.net/article/details/101382390

    实践应用

    序号内容链接地址
    1业务复杂=if else?刚来的大神竟然用策略+工厂彻底干掉了他们!https://thinkwon.blog.csdn.net/article/details/102924813

    应用框架

    如何学习一个框架或者技术

    • 是什么,简介,概述

    • 有什么用,用途,使用场景

    • 怎么用,在实际开发中的应用,注意事项

    • 优缺点

    • 框架原理,工作流程,工作原理

    • 常见面试题

    • 源码分析,核心类,核心方法,设计模式

    • 发布博客,在开发和实践中,博客反馈中持续改进

    • 与同事朋友交流,技术论坛,技术分享中持续丰富知识

    常用框架

    • 集成开发工具(IDE):Eclipse、MyEclipse、Spring Tool Suite(STS)、Intellij IDEA、NetBeans、JBuilder、JCreator

    • JAVA服务器:tomcat、jboss、websphere、weblogic、resin、jetty、apusic、apache

    • 负载均衡:nginx、lvs

    • web层框架:Spring MVC、Struts2、Struts1、Google Web Toolkit(GWT)、JQWEB

    • 服务层框架:Spring、EJB

    • 持久层框架:Hibernate、MyBatis、JPA、TopLink

    • 数据库:Oracle、MySql、MSSQL、Redis

    • 项目构建:maven、ant

    • 持续集成:Jenkins

    • 版本控制:SVN、CVS、VSS、GIT

    • 私服:Nexus

    • 消息组件:IBM MQ、RabbitMQ、ActiveMQ、RocketMq

    • 日志框架:Commons Logging、log4j 、slf4j、IOC

    • 缓存框架:memcache、redis、ehcache、jboss cache

    • RPC框架:Hessian、Dubbo

    • 规则引擎:Drools

    • 工作流:Activiti

    • 批处理:Spring Batch

    • 通用查询框架:Query DSL

    • JAVA安全框架:shiro、Spring Security

    • 代码静态检查工具:FindBugs、PMD

    • Linux操作系统:CentOS、Ubuntu、SUSE Linux、

    • 常用工具:PLSQL Developer(Oracle)、Navicat(MySql)、FileZilla(FTP)、Xshell(SSH)、putty(SSH)、SecureCRT(SSH)、jd-gui(反编译)

    Spring

    序号内容链接地址
    1Spring简介、设计理念、优缺点、应用场景https://thinkwon.blog.csdn.net/article/details/102810748
    2Spring模块组成(框架组成、整体架构、体系架构、体系结构)https://thinkwon.blog.csdn.net/article/details/102810819
    3Spring容器中bean的生命周期https://thinkwon.blog.csdn.net/article/details/102866432
    4控制反转(IoC)与依赖注入(DI)详解https://thinkwon.blog.csdn.net/article/details/102912332

    《Spring实战》读书笔记

    序号内容链接地址
    1《Spring实战》读书笔记-第1章 Spring之旅https://thinkwon.blog.csdn.net/article/details/103097364
    2《Spring实战》读书笔记-第2章 装配Beanhttps://thinkwon.blog.csdn.net/article/details/103527675
    3《Spring实战》读书笔记-第3章 高级装配https://thinkwon.blog.csdn.net/article/details/103536621
    4《Spring实战》读书笔记-第4章 面向切面的Springhttps://thinkwon.blog.csdn.net/article/details/103541166
    5《Spring实战》读书笔记-第5章 构建Spring Web应用程序https://thinkwon.blog.csdn.net/article/details/103550083
    6《Spring实战》读书笔记-第6章 渲染Web视图https://thinkwon.blog.csdn.net/article/details/103559672
    7《Spring实战》读书笔记-第7章 Spring MVC的高级技术https://thinkwon.blog.csdn.net/article/details/103562467

    Spring MVC

    MyBatis

    序号内容链接地址
    1MyBatis官方文档https://thinkwon.blog.csdn.net/article/details/100887995
    2MyBatis官方文档-简介https://thinkwon.blog.csdn.net/article/details/100887076
    3MyBatis官方文档-入门https://thinkwon.blog.csdn.net/article/details/100887176
    4MyBatis官方文档-XML 配置https://thinkwon.blog.csdn.net/article/details/100887349
    5MyBatis官方文档-XML 映射文件https://thinkwon.blog.csdn.net/article/details/100887478
    6MyBatis官方文档-动态 SQLhttps://thinkwon.blog.csdn.net/article/details/100887702
    7MyBatis官方文档-Java APIhttps://thinkwon.blog.csdn.net/article/details/100887746
    8MyBatis官方文档-SQL 语句构建器类https://thinkwon.blog.csdn.net/article/details/100887821
    9MyBatis官方文档-日志https://thinkwon.blog.csdn.net/article/details/100887951
    10MyBatis功能架构https://thinkwon.blog.csdn.net/article/details/101295025
    11MyBatis工作原理https://thinkwon.blog.csdn.net/article/details/101293609
    12MyBatis核心类https://thinkwon.blog.csdn.net/article/details/101293216
    13MyBatis面试宝典https://thinkwon.blog.csdn.net/article/details/101292950
    14MyBatis实现一对一,一对多关联查询https://thinkwon.blog.csdn.net/article/details/101322334
    15MyBatis缓存https://thinkwon.blog.csdn.net/article/details/101351212

    MyBatis 源码分析

    序号内容链接地址
    1MyBatis 源码分析 - MyBatis入门https://thinkwon.blog.csdn.net/article/details/114808852
    2MyBatis 源码分析 - 配置文件解析过程https://thinkwon.blog.csdn.net/article/details/114808962
    3MyBatis 源码分析 - 映射文件解析过程https://thinkwon.blog.csdn.net/article/details/115423167
    4MyBatis 源码分析 - SQL 的执行过程https://thinkwon.blog.csdn.net/article/details/115603376
    5MyBatis 源码分析 - 内置数据源https://thinkwon.blog.csdn.net/article/details/116331419
    6MyBatis 源码分析 - 缓存原理https://thinkwon.blog.csdn.net/article/details/116809942
    7MyBatis 源码分析 - 插件机制https://thinkwon.blog.csdn.net/article/details/116809961

    Quartz

    序号内容链接地址
    1Quartz简介https://thinkwon.blog.csdn.net/article/details/109936696

    Hibernate

    Shiro

    Spring Security

    Netty

    搜索引擎

    Lucene/Solr

    Elasticsearch

    ELK

    中间件

    消息中间件

    RabbitMQ

    RocketMQ

    ActiveMQ

    Kafka

    远程过程调用中间件

    Dubbo

    数据访问中间件

    Sharding JDBC

    MyCat

    Web应用服务器

    Tomcat

    待整理:Tomcat各组件作用 Tomcat集群 Tomcat面试题

    序号内容链接地址
    1Win10安装Tomcat服务器与配置环境变量https://thinkwon.blog.csdn.net/article/details/102622905
    2Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项https://thinkwon.blog.csdn.net/article/details/102717537
    3Tomcat与JDK版本对应关系,Tomcat各版本特性https://thinkwon.blog.csdn.net/article/details/102622738
    4Tomcat目录结构https://thinkwon.blog.csdn.net/article/details/102619466
    5Tomcat乱码与端口占用的解决方案https://thinkwon.blog.csdn.net/article/details/102622824
    6Tomcat系统架构与请求处理流程https://thinkwon.blog.csdn.net/article/details/102676442
    7史上最强Tomcat8性能优化https://thinkwon.blog.csdn.net/article/details/102744033

    Nginx

    缓存

    本地缓存

    客户端缓存

    服务端缓存

    ​ web缓存,Redis,Memcached,Ehcache

    其他

    Zookeeper

    微服务与分布式

    Spring Boot

    序号内容链接地址
    1application.yml与bootstrap.yml的区别https://thinkwon.blog.csdn.net/article/details/100007093
    2一分钟了解约定优于配置https://thinkwon.blog.csdn.net/article/details/101703815

    Spring Cloud

    序号内容链接地址
    1Spring Cloud入门-十分钟了解Spring Cloudhttps://thinkwon.blog.csdn.net/article/details/103715146
    2Spring Cloud入门-Eureka服务注册与发现(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103726655
    3Spring Cloud入门-Ribbon服务消费者(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103729080
    4Spring Cloud入门-Hystrix断路器(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103732497
    5Spring Cloud入门-Hystrix Dashboard与Turbine断路器监控(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103734664
    6Spring Cloud入门-OpenFeign服务消费者(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103735751
    7Spring Cloud入门-Zuul服务网关(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103738851
    8Spring Cloud入门-Config分布式配置中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103739628
    9Spring Cloud入门-Bus消息总线(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103753372
    10Spring Cloud入门-Sleuth服务链路跟踪(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103753896
    11Spring Cloud入门-Consul服务注册发现与配置中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103756139
    12Spring Cloud入门-Gateway服务网关(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103757927
    13Spring Cloud入门-Admin服务监控中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103758697
    14Spring Cloud入门-Oauth2授权的使用(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103761687
    15Spring Cloud入门-Oauth2授权之JWT集成(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103763364
    16Spring Cloud入门-Oauth2授权之基于JWT完成单点登录(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103766368
    17Spring Cloud入门-Nacos实现注册和配置中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103769680
    18Spring Cloud入门-Sentinel实现服务限流、熔断与降级(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103770879
    19Spring Cloud入门-Seata处理分布式事务问题(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103786102
    20Spring Cloud入门-汇总篇(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103786588

    服务注册发现

    服务配置

    负载均衡

    服务调用

    服务限流

    熔断降级

    网关路由

    服务权限

    链路追踪

    分布式事务

    分布式缓存

    分布式会话

    日志收集

    服务监控

    消息驱动

    数据处理流

    自动化测试与部署

    第三方支持

    分布式协调服务Zookeeper

    程序员的一些思考

    序号内容链接地址
    1程序员写个人技术博客的价值与意义https://thinkwon.blog.csdn.net/article/details/102980571
    2Java知识体系最强总结(2020版)https://thinkwon.blog.csdn.net/article/details/103592572
    3博客之星,有你的鼓励更精彩https://thinkwon.blog.csdn.net/article/details/112517796

    团队与项目管理

    需求调研

    项目管理

    序号内容链接地址
    1Worktile、Teambition与Tower项目管理软件对比https://thinkwon.blog.csdn.net/article/details/106064807

    代码管理

    文档管理

    序号内容链接地址
    1几款常见接口管理平台对比https://thinkwon.blog.csdn.net/article/details/106064883
    2Swagger2常用注解说明https://thinkwon.blog.csdn.net/article/details/107477801

    测试

    Python

    序号内容链接地址
    1Win10安装Python3.9https://thinkwon.blog.csdn.net/article/details/112411897
    2Anaconda安装https://thinkwon.blog.csdn.net/article/details/112412165
    3PyCharm2020.3.2安装https://thinkwon.blog.csdn.net/article/details/112412497
    4PyCharm常用配置和常用插件https://thinkwon.blog.csdn.net/article/details/112412783

    运维

    常规监控

    APM

    持续集成(CI/CD):Jenkins,环境分离

    自动化运维:Ansible,puppet,chef

    测试:TDD 理论,单元测试,压力测试,全链路压测,A/B 、灰度、蓝绿测试

    虚拟化:KVM,Xen,OpenVZ

    容器技术:Docker

    云技术:OpenStack

    DevOps

    操作系统

    计算机操作系统

    计算机原理

    Linux

    CPU

    进程,线程,协程

    CentOS8

    序号内容链接地址
    1VMware Workstation Pro 16搭建CentOS8虚拟机集群https://thinkwon.blog.csdn.net/article/details/115058171
    2CentOS8安装Dockerhttps://thinkwon.blog.csdn.net/article/details/115056214
    3CentOS8搭建Nacos1.4.0集群https://thinkwon.blog.csdn.net/article/details/115056401
    4CentOS8安装GitLab13.7.2https://thinkwon.blog.csdn.net/article/details/115056528
    5CentOS8安装MySQL8https://thinkwon.blog.csdn.net/article/details/115055934

    推荐书籍

    序号内容链接地址
    1读书清单-计算机https://thinkwon.blog.csdn.net/article/details/108077754

    读书笔记

    序号内容链接地址
    1高效休息法-读书笔记https://thinkwon.blog.csdn.net/article/details/118638191
    2斯坦福高效睡眠法-读书笔记https://thinkwon.blog.csdn.net/article/details/108349844
    3高效能人士的七个习惯-读书笔记https://thinkwon.blog.csdn.net/article/details/108941111
    4富爸爸穷爸爸-读书笔记https://thinkwon.blog.csdn.net/article/details/109261723
    5如何阅读一本书-读书笔记https://thinkwon.blog.csdn.net/article/details/115422659
    6人性的弱点-读书笔记https://thinkwon.blog.csdn.net/article/details/116809824
    7麦肯锡极简工作法-读书笔记https://thinkwon.blog.csdn.net/article/details/118638191

    云计算

    IaaS、SaaS、PaaS、虚拟化技术、openstack、Serverlsess

    搜索引擎

    Solr、Lucene、Nutch、Elasticsearch

    权限管理

    Shiro、Spring Security

    区块链

    哈希算法、Merkle树、公钥密码算法、共识算法、Raft协议、Paxos 算法与 Raft 算法、拜占庭问题与算法、消息认证码与数字签名

    展开全文
  • Maven约定大于配置(遵循Maven约定)

    千次阅读 2015-10-08 16:06:51
    Q群,426554356 java技术,美女HR欢迎你的加入。。。。把妹,看你本事 (本文主要概述出Maven的约定大于配置) ...Maven当然还不能和这些既成功又成熟的技术 相比,但所有Maven的用户都应该清楚,...

    Q群,426554356 java技术,美女HR欢迎你的加入。。。。把妹,看你本事

    (本文主要概述出Maven的约定大于配置)

    首先想象一下如果不是所有人都基于HTTP开发WEB应用,这个世界会乱成怎样。

    JAVA成功的原因之一就是由于它能屏蔽大部分操作系统的差异,XML流行的原因之一是所有语言都接受它。Maven当然还不能和这些既成功又成熟的技术 相比,但所有Maven的用户都应该清楚,Maven提倡的是“约定优于配置(Convention Over Configuration)”,这是Maven最核心的理念之一。

     

    Maven是服务于项目生命周期的(有些人说它是build工具,但build只是生命周期的一部分),它试图抽象整个项目生命周期,实际上它也做 到了。几乎所有的项目都离不开Mave所定义的生命周期阶段(clean compile test package site...)。不止如此,基于这些阶段,Maven通过插件提供了绝大部分的默认实现,它们不用做任何配置(或者仅需要很少的配置),就能帮你完成你 的工作。

     

    先看一个简单的基于Ant的build.xml文件。(在Maven之前,你在使用Ant,对吧?连Ant都没用,那就更糟了)

        <project name="my-project" default="dist" basedir=".">  
            <description>  
                simple example build file  
            </description>  
          <!-- set global properties for this build -->  
          <property name="src" location="src/main/java"/>  
          <property name="build" location="target/classes"/>  
          <property name="dist"  location="target"/>  
          
          <target name="init">  
            <!-- Create the time stamp -->  
            <tstamp/>  
            <!-- Create the build directory structure used by compile -->  
            <mkdir dir="${build}"/>  
          </target>  
          
          <target name="compile" depends="init"  
                description="compile the source " >  
            <!-- Compile the java code from ${src} into ${build} -->  
            <javac srcdir="${src}" destdir="${build}"/>  
          </target>  
          
          <target name="dist" depends="compile"  
                description="generate the distribution" >  
            <!-- Create the distribution directory -->  
            <mkdir dir="${dist}/lib"/>  
          
            <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->  
            <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>  
          </target>  
          
          <target name="clean"  
                description="clean up" >  
            <!-- Delete the ${build} and ${dist} directory trees -->  
            <delete dir="${build}"/>  
            <delete dir="${dist}"/>  
          </target>  
        </project>  

     

    这段代码做的事情是清除目录,创建目录,编译源文件,复制依赖至目标目录。这已经十分简单了,但是,为此你还是需要做一些配置:指定源码目录,指定 编译字节码目录,指定目标目录,你还需要记住一些ant的配置命令,如delete, mkdir, javac, jar。这看起来没什么问题,至少目前是这样。

     

    可能还有用shell脚本在做build这件事情,那么配置可能会比这个复杂一点(笔者不熟悉shell,如果有能将上述代码用shell重写一遍,笔者将不甚感激)。

     

    现在说说Ant或shell/bat存在的问题,首先,有很多配置需要你填写,源码目录,字节码目录……,每一个项目,你都要重复这些劳动;第二, 也是更重要的一点,你根本无法保证N个项目的ant配置(或shell)配置使用了相同的风格,后果是,每接受一个项目,开发者都要去学习这份脚本,以了 解如何构建项目。如果第一个原因只是为了技术的简化的话,第二个原因更是软件工程的因素,我们不是一个人在开发项目,不是只开发一个项目,所以应该时刻谨 记为了别人,为了将来。

     

    现在看看使用Maven我们需要什么配置,就一个pom.xml文件:

    <project>  
      <modelVersion>4.0.0</modelVersion>  
      <groupId>org.sonatype.mavenbook</groupId>  
      <artifactId>my-project</artifactId>  
      <version>1.0</version>  
    </project>

     

    不用惊讶,Maven不会变魔术,它能做到这么简单,是有条件的,条件就是你要遵守Maven约定。pom.xml所在的目录应为项目的根目录,假设该目录为${proj-dir},那么Maven有以下假设:

    • ${proj-dir}/src/main/java —— 存放项目的.java文件。
    • ${proj-dir}/src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件。
    • ${proj-dir}/src/test/jave —— 存放所有测试.java文件,如JUnit测试类。
    • ${proj-dir}/src/test/resources —— 测试资源文件。
    • ${proj-dir}/target —— 项目输出位置。

    运行一条mvn clean package命令,Maven会帮你清除target目录,重新建一个空的,编译src/main/java类至target/classes,复制 src/main/resources的文件至target/classes,编译src/test/java至target/test- classes,复制src/test/resources的文件至target/test-classes;然后运行所有测试;测试通过后,使用jar 命令打包,存储于target目录。Maven做的事情一点也不少,只是都对用户隐蔽起来了,它只要求你遵循它的约定。

     

    这么做有什么好处呢?第一,显而易见,配置大量减少了,随着项目变得越复杂,这种优势就越明显。第二,我这里要强调的是,对于软件工程来说,所有使 用Maven的项目,对外都暴露统一的命令集。如mvn clean install。只要项目被正确配置好了,任何一个新人,输入一行Maven命令,就能将项目构建起来了,这大大减少了交流学习的时间。

     

    这时可能会有人说,我不想遵守这种约定呢?我要把源码放在${proj-dir}/src/code目录下。首先,问自己三遍,你真的需要这样做么?如果仅仅是因为喜好,那么别耍个性,个性意味着牺牲通用性,意味着增加无谓的复杂度。以下是一个“个性”的例子:

        <project>  
          <modelVersion>4.0.0</modelVersion>  
          <groupId>org.sonatype.mavenbook</groupId>  
          <artifactId>my-project</artifactId>  
          <version>1.0</version>  
          <build>  
            <sourceDirectory>src/java</sourceDirectory>  
            <testSourceDirectory>src/test</testSourceDirectory>  
            <outputDirectory>output/classes</outputDirectory>  
            <testOutputDirectory>output/test-classes</testOutputDirectory>  
            <directory>target/jar</directory>  
          </build>  
        </project>  

     

    很显然,Maven允许你自定义,比如这个例子中,Maven就被配置成从src/java目录寻找源码,编译class文件至output /classes,从src/test寻找测试源码,编译至output/test-classes目录,最后,打包jar文件至target/jar目 录。Maven允许你这么做,但不推荐你这么做。因为一旦你使用这种自定义,习惯Maven约定的人一开始会觉得奇怪,src/main/java目录去 哪里了?target下面怎么没有我要的jar文件?这些都造成了无谓的交流成本提高。只有一些特殊的情况,这些自定义手段能帮你解决实际的问题,比如你 在处理遗留代码,你没办法改变源码目录结构,这个时候只有让Maven妥协。

     

    下面总结一些Maven的默认值,也就是说,虽然你没做什么配置,但是你应该知道Maven假设它们成立,也就是所谓的“约定”:

    Maven约定

    目录src/main/javajava源码目录
    目录src/main/resources资源文件目录
    目录src/test/java测试java源码目录
    目录src/test/resources测试资源文件目录
    目录target打包输出目录
    目录target/classes编译输出目录
    目录target/test-classes测试编译输出目录
    目录target/site项目site输出目录
    目录src/main/webappweb应用文件目录(当打包为war时),如WEB-INF/web.xml
    jar默认打包格式
    *Test.javaMaven只会自动运行符合该命名规则的测试类
    %user_home%/.m2Maven默认的本地仓库目录位置
    中央仓库Maven默认使用远程中央仓库:http://repo1.maven.org/maven2
    1.3Maven Compiler插件默认以1.3编译,因此需要额外配置支持1.5

     

    其实基本上所有的约定,或者说默认配置,都可以在Maven的超级POM(super pom)中找到。由于所有的POM都继承了这个超级POM(类似于java中所有类都继承于Object),因此它的默认配置就被继承了。以Maven 2.0.9为例,你可以在%m2_home%/lib/下看到一个名为maven-2.0.9-uber.jar的文件,打开这个文件,可以找到org /apache/maven/project/pom-4.0.0.xml这个文件,这就是超级POM。

     

    Maven提供了一套科学的默认配置,它要求你遵循这些配置约定,然后它就会帮你处理日常的事务compile, test, package等等。使用Maven的时候,你应该尽可能遵循它的配置约定,一方面可以简化配置,另一方面可建立起一种标准,减少交流学习成本。一旦你习 惯了这种约定,你得到的回报是巨大的。反之,恣意的做自定义,想要Maven像Ant一样听你的话,那么你觉得Maven不爽,Maven也会认为你不爽。

    展开全文
  • Maven

    2020-12-09 22:08:14
    Maven 的应用与实战 ...Maven 项目命名规范 搭建 Maven 私服 基于 Maven 创建 war 工程 Maven 实战 Tomcat 热部署 学习目标 一、 Maven 简介 1 什么是 Maven 目前无论使用 IDEA 还是 Eclipse 等其他 IDE,

    Maven 的应用与实战

    主要内容
    Maven 简介
    Maven 的下载与 IDE 的整合
    Maven 仓库与配置
    Maven 工程类型
    在 Idea 中创建 Maven 工程
    Maven 项目结构
    POM 模型
    Maven 中的常见插件
    Maven 常用命令
    Maven 项目命名规范
    搭建 Maven 私服
    基于 Maven 创建 war 工程
    Maven 实战
    Tomcat 热部署
    学习目标

    在这里插入图片描述

    一、 Maven 简介

    1 什么是 Maven

    目前无论使用 IDEA 还是 Eclipse 等其他 IDE,使用里面 ANT 工具。ANT 工具帮助我
    们进行编译,打包运行等工作。
    Apache 基于 ANT 进行了升级,研发出了全新的自动化构建工具 Maven。(知道:
    ANT 有的功能 MAVEN 都有,只是使用起来更加方便了)。
    Maven 工具基于 POM(Project Object Model,项目对象模型)模式实现的。在 Maven
    中每个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的。关系包含
    了:依赖、继承、聚合,实现 Maven 项目可以更加方便的实现导 jar 包、拆分项目等效果。
    Maven 是跨平台的,这意味着无论是在 Windows 上,还是在 Linux 或者 Mac 上,
    都可以使用同样的命令。
    Maven 还有一个优点,它能帮助我们标准化构建过程。在 Maven 之前,十个项目可
    能有十种构建方式。有了 Maven 之后,所有项目的构建命令都是标准化。
    Maven 还为全世界的 Java 开发者提供了一个免费的中央仓库,在其中几乎可以找到
    任何的流行开源类库。

    2 Maven 的作用

    **1)**Maven 统一集中管理好所有的依赖包,不需要程序员再去寻找。对应第三方组件用到的共同 jar,Maven 自动解决重复和冲突问题。

    **2)**Maven 作为一个开放的架构,提供了公共接口,方便同第三方插件集成。程序员可以将自己需要的插件,动态地集成到 Maven,从而扩展新的管理功能。

    **3)**Maven 可以统一每个项目的构建过程,实现不同项目的兼容性管理。

    二、 Maven 的下载与 IDE 的整合

    3 Maven 下载

    http://maven.apache.org/download.cgi

    4 Idea 整合 Maven

    在 Idea 中默认已经整合了 Maven。由于 Idea 的版本不同,所整合的 Maven 的版本也不同。
    如果需要更换其他版本可在 Idea 中进行配置。

    三、 Maven 仓库与配置

    1 Maven 仓库是什么

    1.1 Maven 仓库

    Maven 仓库是基于简单文件系统存储的,集中化管理 Java API 资源(构件)的一个服
    务。仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存
    储路径,这要得益于 Maven 的坐标机制,任何 Maven 项目使用任何一个构件的方式都
    是完全相同的,Maven 可以在某个位置统一存储所有的 Maven 项目共享的构件,这个统
    一的位置就是仓库,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目
    使用。
    坐标:坐标有三个部分构成,如果一个部分不同那么表示的就是不同的 jar。
    Group Id: 公司名,多用公司网址倒写
    Artifact Id: 项目名
    Version: 版本
    对于 Maven 来说,仓库分为两类:本地仓库和中央仓库。

    1.1.1 中央仓库

    中央仓库是互联网上的服务器,是 Maven 提供的最大的仓库,里面拥有最全的 jar 包资
    源。默认是 Maven 自己的网络服务器,但是由于访问速度较慢,我们一般都配置成国内的
    镜像中央仓库如阿里镜像或者是华为镜像。
    Maven 中央仓库访问页面: https://mvnrepository.com/

    1.1.2 本地仓库

    本地仓库指用户电脑中的文件夹,该文件夹中包含了自己下载的构件(jar 包)。文件夹结
    构为 groupid 分级的文件夹/artifactid 文件夹/version 文件夹/包含 jar 包。

    2 仓库的访问优先级

    2.1 本地仓库

    第一访问本地仓库。

    2.2 远程仓库

    2.2.1镜像仓库

    镜像仓库是 Maven 开发过程中的首选远程仓库,在本地仓库无法获取资源的时候,直
    接访问镜像仓库。

    2.2.2 中央仓库

    中央仓库是 Maven 官方提供的远程仓库,在本地仓库无法获取资源的时候,直接访问中央仓库。

    在这里插入图片描述

    3 配置 Maven

    3.1 在 settings.xml 文件中配置本地仓库

    本地仓库是开发者本地电脑中的一个目录,用于存储从远程仓库下载的构件(jar 包)。
    默认的本地仓库是${user.home}/.m2/repository。用户可使用 settings.xml 文件修改本地
    仓库。具体内容如下:

    在这里插入图片描述

    3.2 在 settings.xml 文件中配置镜像仓库

    如果仓库 A 可以提供仓库 B 存储的所有内容,那么就可以认为 A 是 B 的一个镜像。例
    如:在国内直接连接中央仓库下载依赖,由于一些特殊原因下载速度非常慢。这时,我们可
    以使用阿里云提供的镜像 http://maven.aliyun.com/nexus/content/groups/public/来
    替换中央仓库 http://repol.maven.org/maven2/。修改 maven 的 setting.xml 文件,具
    体内容如下:

    <mirror>
    <!-- 指定镜像 ID -->
    <id>nexus-aliyun</id>
    <!-- 匹配中央仓库。-->
    <mirrorOf>central</mirrorOf>
    <!-- 指定镜像名称 -->
    <name>Nexus aliyun</name>
    <!-- 指定镜像路径 -->
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    

    在这里插入图片描述

    3.3 配置 JDK 版本

    <profile>
    <id>jdk-1.8</id>
    <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.8</jdk>
    </activation>
    <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
    </profile>
    

    在这里插入图片描述

    四、 Maven 工程类型

    1 POM 工程

    POM 工程是逻辑工程(maven不会对pom工程做打包处理)。用在聚合工程中,或者父级工程用来做 jar 包的版本控制。

    2 JAR 工程

    创建一个 Java Project,在打包时会将项目打成 jar 包。

    3 WAR 工程

    创建一个 Web Project,在打包时会将项目打成 war 包。

    五、 在 Idea 中创建 Maven 工程

    在这里插入图片描述

    如果未指定项目类型默认为Jar 类型

    在这里插入图片描述

    六、 Maven 项目结构

    src 包含了项目所有的源代码和资源文件以及测试代码。

    src/main/java 这个目录下储存 java 源代码

    src/main/resources 储存主要的资源文件。比如 spring 的 xml 配置文件和 log4j 的 properties 文件。

    src/test/java 存放测试代码,比如基于 JUNIT 的测试代码一般就放在这个目录下面

    target 编译后内容放置的文件夹 ,项目被maven打包之后 jar 包也会被放到这

    在这里插入图片描述

    pom.xml 是 Maven 的基础配置文件,也是 Maven 项目核心配置文件,用于配置项目的基本信息,项目的继承关系,项目类型,依赖管理,依赖注入,插件管理,插件 注入等等

    –mavenDemo 项目名
    –.idea 项目的配置,自动生成的,不需要关注。
    –src
    – main 实际开发内容
    –java 写包和 java 代码,此文件默认只编译.java 文件
    –resource 所有配置文件。最终编译把配置文件放入到 classpath 中。
    – test
    –java 测试时使用,自己写测试类或 junit 工具等
    pom.xml 整个 maven 项目所有配置内容。

    七、 POM 模型

    1 依赖关系

    Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模 块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形, Maven 提供了一种高度控制的法。

    通俗理解:依赖谁就是将谁的 jar 包添加到本项目中。可以依赖中央仓库的 jar,也可 以依赖当前开发中其他项目打包后的 jar 包。 (可以依赖第三方的也可以依赖我自己的项目但是前提是被依赖的项目也是一个Maven项目,只有Maven项目才有坐标的概念)

    在 pom.xml 文件 根元素 project 下的 dependencies 标签中,配置依赖信息,可以 包含多个 dependence 元素,以声明多个依赖。每个依赖 dependence 标签都应该包含 以下元素:groupId, artifactId, version : 依赖的基本坐标, 对于任何一个依赖来说,基 本坐标是最重要的, Maven 根据坐标才能找到需要的依赖。

    <dependencies> 
        <dependency> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-context</artifactId> 
            <version>5.2.4.RELEASE</version> 
        </dependency>
    </dependencies>
    

    在这里插入图片描述

    1.1 依赖的传递性

    依赖传递性是 Maven2.0 的新特性。假设你的项目依赖于一个 jar 包,而这个 jar 包又 依赖于其他 jar 包。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的 jar 包的 坐标,Maven 会隐式的把这些 jar 包间接依赖的库也加入到你的项目中。这个特性是靠解 析从远程仓库中获取的依赖 jar 包的项目文件实现的。这些项目的所有依赖都会加入到项目 中这就是依赖传递性。

    如果 A 依赖了 B,那么 C 依赖 A 时会自动把 A 和 B 都导入进来。

    创建 A 项目后,选择 IDEA 最右侧 Maven 面板 lifecycle,双击 install 后就会把项目 安装到本地仓库中,其他项目就可以通过坐标引用此项目。

    如果依赖的是自己的项目一定要对自己的项目进行打包处理,打包是为了让项目出现在本地仓库中,在本地仓库中包含了它所对应的jar 包,这样Maven 才能把这个 jar 包依赖到其他项目中

    在这里插入图片描述

    被打包进了本地仓库

    在这里插入图片描述

    1.2 依赖相同资源的依赖原则

    1.2.1 第一原则:最短路径优先原则

    “最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。例如,假设 A、 B、C 之间的依赖关系是 A->B->C->D(2.0)和 A->E->(D1.0),那么 D(1.0)会被使用,因为 A 通过 E 到 D 的路径更短。

    A->B : A 依赖 B

    1.2.2 第二原则:最先声明原则

    依赖调解第一原则不能解决所有问题,比如这样的依赖关系:A–>B–>Y(1.0),A–>C –>Y(2.0),Y(1.0)和 Y(2.0)的依赖路径长度是一样的,都为 2。那么到底谁会被解析使用呢?

    在 maven2.0.8 及之前的版本中,这是不确定的,但是 maven2.0.9 开始,为了尽可能避免 构建的不确定性,maven 定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度 相等的前提下,在 POM 中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖 优胜。

    1.3 排除依赖

    exclusions: 用来排除传递性依赖 其中可配置多个 exclusion 标签,每个 exclusion 标签 里面对应的有groupId, artifactId 两项基本元素。

    EG:我不想要 spring-context 里面的 spring-aop jar 包

    在这里插入图片描述

    在这里插入图片描述

    未排除 spring-aop 时这个jar 包还在

    在这里插入图片描述

    <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.2.4.RELEASE</version>
                <exclusions>
                    <!--在导入spring-context依赖时去掉spring-aop-->
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-aop</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    

    排除之后 spring-aop 这个jar 包不在了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWhFwcbi-1607514135828)(Maven.assets/image-20201119110846898.png)]

    可以通过 标签排除依赖,如果spring-aop 这个jar 已经被 spring-context 包含了,这个时候无法通过 排除依赖的, 只能排除依赖不能排除被包含的jar 包

    在这里插入图片描述

    1.4 依赖范围

    1.4.1scope 属性可取值
    1.4.1.1compile

    这是默认范围。如果没有指定,就会使用该依赖范围。表示该依赖在编译和运行时生效。 在项目打包时会将该依赖包含进去。

    1.4.1.2provided

    可以参与编译,测试,运行等周期,但是不会被打包到最终的 artifact 中。典型的例子 是 servlet-api,编译和测试项目的时候需要该依赖,但在项目打包的时候,由于容器已经 提供,就不需要 Maven 重复地引入一遍(如:servlet-api)

    1.4.1.3runtime

    runtime 范围表明编译时不需要生效,而只在运行时生效。典型的例子是 JDBC 驱动实 现,项目主代码的编译只需要 JDK 提供的 JDBC 接口,只有在执行测试或者运行项目的时 候才需要实现上述接口的具体 JDBC 驱动。

    1.4.1.4system

    如果有些你依赖的 jar 包没有 Maven 坐标的(非maven项目),它完全不在 Maven 体系中,这时候你 可以把它下载到本地硬盘,然后通过 system 来引用。

    不推荐使用 system,因为一个项目的 pom.xml 如果使用了 scope 为system 的 depend 后,会导致传递依赖中断,即所有其他依赖本项目的项目都无法传递依赖了。

    1.4.1.5test

    test 范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用 的正常运行不需要此类依赖。典型的例子就是 JUnit,它只有在编译测试代码及运行测试的 时候才需要。

    1.5 依赖管理

    Maven 提 供 了 一 个 机 制 来 集 中 管 理 依 赖 信 息 , 叫 做 依 赖 管 理 元 素 ” ”。假设你有许多项目继承自同一个公有的父项目,那可以 把所有依赖信息放在一个公共的 POM 文件中并且在子 POM 中简单的引用该构件即可。

    标签下所有的的依赖只是做到了集中式管理并不是添加到项目中

    右侧的 dependency 标记都没了 并没有任何依赖注入到项目中

    在这里插入图片描述

    一般配合 标签使用,一般在 标签内定义集中管理依赖的版本

    把依赖的版本放到外部管理

    在这里插入图片描述

    在这里插入图片描述

    2 继承关系

    2.1 什么是继承关系

    Maven 中的继承跟 Java 中的继承概念一样,需要有父项目以及子项目。我们可以将项 目中的依赖和插件配置提取出来在父项目中集中定义,从而更方便的管理项目的依赖以及插 件。

    注意父项目类型一定为 POM 类型。

    2.2 继承的优点

    1) 依赖或插件的统一管理(在 parent 中定义,需要变更 dependency 版本时,只需要 修改一处)。

    2) 代码简洁(子 model 只需要指定 groupId,artifactId 即可)。

    3) dependencyManagement 是 “ 按 需 引 入 ” , 即 子 model 不 会 继 承 parent 中 dependencyManagement 所有预定义的 dependency。

    在这里插入图片描述

    一旦两个项目有了父子继承关系在子项目在引入依赖时不需要 version

    在这里插入图片描述

    在这里插入图片描述

    在继承关系中 标签下的所有内容是不会都被子项目继承,按需分配,子项目中定义的会被添加,未定义的不添加

    父项目中管理了 spring-web

    在这里插入图片描述

    而子项目中未定义 spring-web 所以子项目不会引入 spring-web

    在这里插入图片描述

    父项目在版本改变后需要 install 安装一下

    在这里插入图片描述

    在子项目中刷新一下,子项目中的依赖版本也变为 4.2.4版 父项目下所有的子项目的依赖版本都会跟着改变

    在这里插入图片描述

    3 Maven 中的多继承

    在 Maven 中对于继承采用的也是单一继承,也就是说一个子项目只能有一 个父项目,但是有的时候我们项目可能需要从更多的项目中继承,那么我们可以 在子项目中通过添加标记来实现多继承。在子项 目的中每个标记就一个父工程 定义,同时还需要添加标记,值为 pom。添加标记,值为 import。

    child 工程即从 parent 工程继承 也从 parent_b 工程(基于pom文件引入进来)继承

    第一种方式用 标签和 标签

    parent/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjsxt</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--指定项目类型为pom-->
        <packaging>pom</packaging>
    
        <!--对依赖进行集中式管理-->
        <properties>
            <spring-context.version>5.2.4.RELEASE</spring-context.version>
            <spring-web.version>5.2.4.RELEASE</spring-web.version>
        </properties>
        <dependencyManagement>
            <dependencies>
                <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                    <version>${spring-context.version}</version>
                </dependency>
                <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                    <version>${spring-web.version}</version>
                </dependency>
    
            </dependencies>
        </dependencyManagement>
    
    </project>
    

    parent_b/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjsxt</groupId>
        <artifactId>parent_b</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--指定项目类型为  pom-->
        <packaging>pom</packaging>
    
        <properties>
            <spring-web.version>5.2.4.RELEASE</spring-web.version>
        </properties>
        <dependencyManagement>
            <dependencies>
                <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                    <version>${spring-web.version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    
    </project>
    

    chile/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>com.bjsxt</groupId>
            <artifactId>parent</artifactId>
            <version>1.0-SNAPSHOT</version>
            <relativePath>../parent/pom.xml</relativePath>
        </parent>
    
        <groupId>com.bjsxt</groupId>
        <artifactId>child</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>com.bjsxt</groupId>
                    <artifactId>parent_b</artifactId>
                    <version>1.0-SNAPSHOT</version>
                    <!--type 的值必须是  pom-->
                    <type>pom</type>
                    <!--scope  的值必须是  import-->
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </dependency>
        </dependencies>
    
    
    </project>
    

    在这里插入图片描述

    第二种方式,只用 标签实现

    parent/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjsxt</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--指定项目类型为pom-->
        <packaging>pom</packaging>
    
        <!--对依赖进行集中式管理-->
        <properties>
            <spring-context.version>5.2.4.RELEASE</spring-context.version>
            <spring-web.version>5.2.4.RELEASE</spring-web.version>
        </properties>
        <dependencyManagement>
            <dependencies>
                <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                    <version>${spring-context.version}</version>
                </dependency>
                <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                    <version>${spring-web.version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    </project>
    

    parent_b/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjsxt</groupId>
        <artifactId>parent_b</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--指定项目类型为  pom-->
        <packaging>pom</packaging>
    
        <properties>
            <spring-web.version>5.2.4.RELEASE</spring-web.version>
        </properties>
        <dependencyManagement>
            <dependencies>
                <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                    <version>${spring-web.version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    
    </project>
    

    在这里插入图片描述

    child/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjsxt</groupId>
        <artifactId>child</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>com.bjsxt</groupId>
                    <artifactId>parent_b</artifactId>
                    <version>1.0-SNAPSHOT</version>
                    <!--type 的值必须是  pom-->
                    <type>pom</type>
                    <!--scope  的值必须是  import-->
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>com.bjsxt</groupId>
                    <artifactId>parent</artifactId>
                    <version>1.0-SNAPSHOT</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </dependency>
        </dependencies>
    
    
    </project>
    

    在这里插入图片描述

    bug:

    在这里插入图片描述

    idea 会时不时的自己将Maven 本地仓库的位置改变成默认的,导致以上错误,每次创建项目之后检查本地仓库的位置是否改变

    在这里插入图片描述

    在这里插入图片描述

    4 聚合关系

    Maven 的聚合特性可以帮助我们把多个项目基于多个模块聚合在一起,这样能够更加 方便项目的管理。

    前提:继承。

    项目的聚合是建立在继承的关系上的,聚合包含了继承的特性。

    聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目 类型为 pom 类型。同时在父项目的 pom.xml 中出现表示包含的所有子模块。 即使在 idea 中,也可以使用聚合在一个窗口创建多个项目。

    在这里插入图片描述

    用一个parent将其他的模块做一个集中式管理

    在这里插入图片描述

    parent/pom.xml 发生变化 每一个 标签表示一个聚合进来的模块 每聚合进来的一个模块就表示一个独立的项目

    在这里插入图片描述

    parent./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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjsxt</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>aggredemo</module>
        </modules>
        <!--指定项目类型为pom-->
        <packaging>pom</packaging>
    
        <properties>
            <spring-web.version>5.2.4.RELEASE</spring-web.version>
        </properties>
        <dependencyManagement>
            <dependencies>
                <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                    <version>${spring-web.version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    
    </project>
    

    aggredemo/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>parent</artifactId>
            <groupId>com.bjsxt</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>aggredemo</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </dependency>
        </dependencies>
    
    </project>
    

    parent(root) 表示是一个根项目

    在子模块中引入父工程中管理的依赖依赖

    在这里插入图片描述

    在项目打包时只要对聚合点的根项目进行打包其下面所有的子模块都会被打包

    在这里插入图片描述

    4.1 删除聚合模块步骤

    1. 右键模块–> remove module
    2. 右键模块–> delete
    3. 删除父项目中 pom.xml 文件中报错的 标签

    右键模块–> remove module

    从maven 中删除这个模块

    在这里插入图片描述

    再选中项目点击 delete

    在这里插入图片描述

    删干净了

    在这里插入图片描述

    parent/pom.xml 报错

    在这里插入图片描述

    手动删除,如果只有一个子模块可以删掉整个 标签 如果有多个子模块就删除掉报错的那个

    在这里插入图片描述

    八、 Maven 中的常见插件

    1 Maven 内置插件

    Maven 自身拥有很多内置插件,每一个内置插件都代表了 Maven 的一种行为。Maven 在管理项目整个生命周期时,在不同的阶段处理的过程都是使用插件来具体完成。如:构建 项目时使用构建插件、编译项目时使用编译插件、清除构建使用清除构建的插件、测试项目 时使用测试插件、打包时使用资源拷贝插件以及打包插件。

    我们可以在不同阶段使用 Maven 中的不同命令来触发不同的插件来执行不同的工作。 换言之,Maven 的插件是需要依赖命令来执行的。

    Maven 在管理插件时也是通过坐标的概念和管理依赖的方式相同,通过坐标来定位唯 一的一个插件。

    在一般情况下,我们不需要额外配置 Maven 的内置插件,除非我们需要对插件做额外 配置时才需要配置内置插件。如果我们重新配置了内置插件,那么则以我们配置的为主。

    Maven 的插件配置需要在 pom.xml 文件中的标签中使用来配置。

    现在在很多的 IDE 中都已经把 Maven 的常用命令通过界面中的按钮来体现,我们只要点击相应的按钮就等同于执行了相应的命令。

    双击 install 按钮对项目进行打包,生成 target 目录

    在这里插入图片描述

    双击 clean 按钮清除 target目录

    在这里插入图片描述

    在 setting.xml 里面配置的是全局性的

    在这里插入图片描述

    1.1 配置编译插件

    1.1.1 在 setings.xml 中配置全局编译插件

    在这里插入图片描述

    1.1.2 在 pom.xml 文件中配置局部的编译插件

    双击 compile 走的是项目自己的编译插件

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
            </plugin>
        </plugins>
    </build>
    

    在这里插入图片描述

    配置插件的 jdk版本,编译版本,编码格式

    在这里插入图片描述

    plugingdemo/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjsxt</groupId>
        <artifactId>plugingdemo</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    1.2 资源拷贝插件

    Maven 在打包时默认只将 src/main/resources 里的配置文件拷贝到项目中并做打包 处理,而非 resource 目录下的配置文件在打包时不会添加到项目中。

    我们在使用 MyBatis 时,如果接口与 Mapper 文件在同一个目录中,在默认的情况下 Maven 打包的时候,对于 src/main/java 目录只打包源代码,而不会打包其他文件。

    所以 Mapper 文件不会打包到最 终的 jar 文件夹中,也不会输出到 target 文件夹中,此时运行代码操作数据库时会报异常。

    先clean 再 install

    资源拷贝插件默认只从 resources 目录下拷贝 com.bjsxt 目录下的文件打包后不在classes 目录下

    在这里插入图片描述

    在 resources 目录下新建 UsersMapper.xml 先 clean 再 install 发现 UsersMapper.xml 文件被拷贝进了classes目录下 资源拷贝插件默认只拷贝 resources 目录下的内容

    在这里插入图片描述

    解决方案:

    1) 将 Mapper 文件放入到 resources 目录中。

    2) 配置资源拷贝插件,指定其拷贝文件的位置。

    **一旦配置了资源拷贝插件,就会按照我们配置的目录进行拷贝 默认从 resources 目录下拷贝资源的过程就失效了 想要从 resources 目录拷贝资源得在配置资源拷贝路径时指定 src/main/resources**

    先clean 再 install com.bjsxt 里面的资源被拷贝进了classes 目录下,但是resources 目录下的 UsersMapper.xml 文件没有被拷贝进 classes 目录下 因为我们的配置资源拷贝插件只配置了一个指定目录

    在这里插入图片描述

    只配置了 com.bjsxt 这一个目录

    在这里插入图片描述

    指定 从 src/main/java 目录和 src/main/resources 目录下拷贝资源 先clean 再 install

    都拷贝进了classes

    在这里插入图片描述

    plugingdemo/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjsxt</groupId>
        <artifactId>plugingdemo</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
            <!--配置资源拷贝路径-->
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
            </resources>
        </build>
    
    </project>
    

    2 扩展插件

    2.1Tomcat 插件

    Tomcat 插件是 Maven 的扩展插件,其作用是为基于 Maven 开发的 Web 项目提供一 个内置的 Tomcat 支持,这样我们在开发阶段可以不在依赖外部的 Tomcat 来运行 Web 项 目,该插件目前使用的 Tomcat 版本为 Tomcat7。该插件的作用很强大,除了提供了 Tomcat 以外,还可以通过该插件实现项目的远程热部署。

    <!-- 配置 Tomcat 插件 -->
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
    <configuration>
        <!-- 配置 Tomcat 监听端口 -->
        <port>8080</port>
    <!-- 配置项目的访问路径(Application Context) -->
        <path>/</path>
    </configuration>
    </plugin>
    

    在这里插入图片描述

    2.2 Mybatis Generator 插件

    Mybatis Generator 插件可以根据数据库自动生成实体类、单表查询接口映射 xml 文 件以及 POJO。

    2.2.1 创建 Users 表
    CREATE TABLE `users` (
      `userid` int(11) NOT NULL,
      `username` varchar(20) DEFAULT NULL,
      `userage` int(11) DEFAULT NULL,
      PRIMARY KEY (`userid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    

    在这里插入图片描述

    2.2.2 修改 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.bjsxt</groupId>
        <artifactId>plugingdemo</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <!-- 配置 Tomcat 插件 -->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                <configuration>
                    <!-- 配置 Tomcat 监听端口 -->
                    <port>8080</port>
                <!-- 配置项目的访问路径(Application Context) -->
                    <path>/</path>
                </configuration>
                </plugin>
                <!--配置 Generator 插件-->
                <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <dependencies>
                    <!--注入MySQL数据库驱动的依赖-->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.38</version>
                    </dependency>
                </dependencies>
                <!--指定配置文件的路径-->
                <configuration>
                <configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                </plugin>
            </plugins>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
            </resources>
        </build>
    
    </project>
    
    2.2.3 添加 generator 配置文件

    在这里插入图片描述

    如果第一次在IDEA添加这个配置文件在IDEA中是默认没有这个约束文件的,需要将本地的约束文件添加到IDEA中

    在这里插入图片描述

    不报错了

    在这里插入图片描述

    根据自己数据库的情况进行配置

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    generatorConfig.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
      PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
      "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
    <generatorConfiguration>
       <context id="testTables" targetRuntime="MyBatis3">
          <!-- 生成实体类实现序列化-->
          <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
          <!-- 实体类中包含toString() -->
          <plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
          <commentGenerator>
             <!-- 是否去除自动生成的注释 true:是 : false:否 -->
             <property name="suppressAllComments" value="true" />
          </commentGenerator>
          <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
          <jdbcConnection driverClass="com.mysql.jdbc.Driver"
             connectionURL="jdbc:mysql://localhost:3306/maven" userId="root"
             password="root">
          </jdbcConnection>
          <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 
             NUMERIC 类型解析为java.math.BigDecimal -->
          <javaTypeResolver>
             <property name="forceBigDecimals" value="false" />
          </javaTypeResolver>
    
          <!-- targetProject:生成POJO类的位置 -->
          <javaModelGenerator targetPackage="com.bjsxt.pojo"
             targetProject=".\src\main\java">
             <!-- enableSubPackages:是否让schema作为包的后缀 -->
             <property name="enableSubPackages" value="false" />
             <!-- 从数据库返回的值被清理前后的空格 -->
             <property name="trimStrings" value="true" />
          </javaModelGenerator>
            <!-- targetProject:mapper映射文件生成的位置 -->
          <sqlMapGenerator targetPackage="com.bjsxt.mapper"
             targetProject=".\src\main\java">
             <!-- enableSubPackages:是否让schema作为包的后缀 -->
             <property name="enableSubPackages" value="false" />
          </sqlMapGenerator>
          <!-- targetPackage:mapper接口生成的位置 -->
          <javaClientGenerator type="XMLMAPPER"
             targetPackage="com.bjsxt.mapper"
             targetProject=".\src\main\java">
             <!-- enableSubPackages:是否让schema作为包的后缀 -->
             <property name="enableSubPackages" value="false" />
          </javaClientGenerator>
          <!-- 指定数据库表 -->
          <table schema="" tableName="users"></table>
    
       </context>
    </generatorConfiguration>
    

    双击运行插件

    在这里插入图片描述

    构建成功

    在这里插入图片描述

    在这里插入图片描述

    有错误是因为还没添加 mybatis 的依赖所以找不到 注解报错

    在这里插入图片描述

    3 插件管理

    在 Maven 中提供了和依赖管理相同的方式用于来管理插件,我们可以在父工程中声明 插件,然后在具体的子项目中按需引入不同的插件。

    3.1父工程 POM

    父项目的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.bjsxt</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>aggredemo</module>
        </modules>
    
        <!--指定项目类型为pom-->
        <packaging>pom</packaging>
    
        <properties>
            <spring-web.version>5.2.4.RELEASE</spring-web.version>
        </properties>
        <dependencyManagement>
            <dependencies>
                <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                    <version>${spring-web.version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <pluginManagement>
                <plugins>
                    <!-- 配置 Tomcat 插件 -->
                    <plugin>
                        <groupId>org.apache.tomcat.maven</groupId>
                        <artifactId>tomcat7-maven-plugin</artifactId>
                        <version>2.2</version>
                    </plugin>
                    <!--配置 Generator 插件-->
                    <plugin>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-maven-plugin</artifactId>
                        <version>1.3.5</version>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    
    </project>
    

    3.2 子工程 POM

    子项目的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>parent</artifactId>
            <groupId>com.bjsxt</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>aggredemo</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <!-- 配置 Tomcat 插件 -->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                    <configuration>
                        <!-- 配置 Tomcat 监听端口 -->
                        <port>8080</port>
                        <!-- 配置项目的访问路径(Application Context) -->
                        <path>/</path>
                    </configuration>
                </plugin>
                <!--配置 Generator 插件-->
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.5</version>
                    <dependencies>
                        <!--注入MySQL数据库驱动的依赖-->
                        <dependency>
                            <groupId>mysql</groupId>
                            <artifactId>mysql-connector-java</artifactId>
                            <version>5.1.38</version>
                        </dependency>
                    </dependencies>
                    <!--指定配置文件的路径-->
                    <configuration>
                        <configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                        <verbose>true</verbose>
                        <overwrite>true</overwrite>
                    </configuration>
                </plugin>
            </plugins>
            <!--指定资源拷贝路径-->
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
            </resources>
        </build>
    
    </project>
    

    成功引入

    在这里插入图片描述

    九、 Maven 常用命令

    1 clean

    清除已编译信息。

    删除工程中的 target 目录。

    2 validate

    验证项目是否正确

    3 compile

    只编译。 javac 命令。

    只编译不打包

    在这里插入图片描述

    4 test

    用于执行项目的测试。如果在 test 目录下含有测试代码,那么 Maven 在执行 install 命令会先去执行 test 命令将所有的 test 目录下的测试代码执行一遍,如果有测试代码执行 失败,那么 install 命令将会终止。

    点击这个按钮跳过测试,在执行打包命令时就不会进行测试了,不会对测试单元做测试

    在这里插入图片描述

    5 package

    打包。 包含编译,打包两个功能。

    clean 再双击 package

    除了有 classes 目录还有当前项目的 jar包

    在这里插入图片描述

    6 verify

    运行任何检查,验证包是否有效且达到质量标准。 对 引入的jar 包做校验

    7 install

    本地安装, 包含编译,打包,安装到本地仓库

    编译 - javac

    打包 - jar, 将 java 代码打包为 jar 文件

    安装到本地仓库 - 将打包的 jar 文件,保存到本地仓库目录中。

    8 site

    项目站点文档创建的处理,该命令需要配置插件。

    9 deploy

    远程部署命令。

    十、 Maven 项目名规范

    官网的命名规范说明

    http://maven.apache.org/guides/mini/guide-naming-conventions.html

    1 groupId

    groupId 定义当前 Maven 项目隶属的实际项目。groupId 应该遵循 Java 的包名称规 则 使 用 反 向 域 名 。 例 如 com.bjsxt 。 或 者 以 反 向 域 名 开 头 加 项 目 的 名 称 。 例 如 com.bjsxt.example,此 id 前半部分 com.bjsxt 代表此项目隶属的组织或公司,example 部分代表项目的名称。

    2 artifactId

    artifactId 是构件 ID,该元素定义实际项目中的一个 Maven 项目或者是子模块的名称, 如官方约定中所说,***构建名称必须小写字母,没有其他的特殊字符,推荐使用“实际项目名称-模块名称”的方式定义,***例如:spirng-mvn、spring-core 等。

    3 version

    可以选择带有数字和点(1.0、1.1、1.0.1,…)的任何典型版本。不要使用日期指定当 前构件的版本。默认版本为 1.0-SNAPSHOT

    十一、 搭建 Maven 私服

    1 什么是私服

    私服是一种特殊的远程仓库,它是架设在局域网的仓库服务,私服代理广域网上的远程 仓库,供局域网使用。 在企业开发中,私服的建设是有必要的,其好处如下:

    1.1节省资金、外网带宽

    利用私服代理外部仓库之后,对外的重复构件下载便得以简化,降低外网带宽压力。

    1.2 加速 Maven 构建

    不停地连接请求外部仓库是相当耗时的,但是 maven 的一些内部机制(如快照更新 检 查)要求 Maven 在执行构建的时候不停地检查远程仓库数据。因此,当项目配置了很 多外部远程仓库的时候,构建速度会降低。使用私服解决这问题,因为 Maven 只需要检查局域网内私服的数据时,构建速度便有明显提高。

    1.3部署第三方构件

    当某个构件无法从任何一个远程仓库获取怎么办?比如 Oracle 的 JDBC 驱动由于版 权 原因不能发布到公共仓库中。建立私服后,便可以将这些构件部署到这个内部仓库中, 供内部 Maven 项目使用。

    1.4提高稳定性,增强控制

    对于远程仓库来说,当外网不可用时,Maven 构建有可能因为依赖没有下载而不可行, 搭建并应用私服后,即使没有外网,如果该构件之前被其它人下载过就会存在私服上,此时 再次依赖该构件就可以不用连接外网直接就可以从私服上下载到。同时私服软件(nexus) 还提供了额外的管理功能。

    1.5降低中央仓库的负荷

    中央仓库是有限的。如果所有的 Maven 工程开发过程中,都通过中央仓库实现构件的 依赖和管理,那么中央仓库的负荷过高,也会严重影响工程构建的效率。如果使用私服,可以分散中央仓库的负荷,只有在私服中没有需要依赖的构件时才会去连接中央仓库。

    2 使用 Nexus 搭建私服

    2.1搭建环境

    CentOS8、JDK1.8、Sonatype Nexus2.11.2

    2.2搭建步骤

    2.2.1 安装 JDK

    http://www.oracle.com/technetwork/java/javase/downloads/index.html

    本课程使用版本为 JDK1.8。(jdk-8u221-linux-x64.tar.gz)

    2.2.1.1 JDK 资源包解压

    在 Linux 中安装应用的常用目录为:/opt 或/usr/local 目录。本课件将 JDK 安装到 /usr/local/jdk 目录中。

    2.2.1.2 环境变量配置

    修改/etc/profile 配置文件,增加环境变量配置。

    环境变量修改后,可以重启 Linux 实现永久生效;或执行 source /etc/profile 命令, 让新 修改的环境变量在当前终端中生效。

    2.2.2安装 Nexus
    2.2.2.1Nexus 资源包下载

    Nexus 官方下载地址为:

    https://www.sonatype.com/nexus-repository-oss

    本课件应用版本为:nexus-2.11.2-03

    在这里插入图片描述

    2.2.2.2 Nexus 资源包解压

    在/usr/local 目录中创建子目录 nexus:

    mkdir /usr/local/nexus

    解压 Nexus 到指定目录:

    tar -zxvf nexus-2.11.2-03-bundle.tar.gz -C /usr/local/nexus

    Nexus 压缩包中包含两个子目录: nexus-2.11.2-03 和 sonatype-work

    在这里插入图片描述

    nexus-2.11.2-03 是具体的私服应用内容,

    sonatype-work 是 Nexus 私服下载的构件存放工作目录

    2.2.2.3 检查私服端口和工作目录

    在 nexus-2.11.2-03 目录中有子目录 conf,其中保存私服应用的配置信息。查看

    nexus.properties 文件,确定私服访问端口和工作目录。此操作可不做任何内容修改。

    配置文 件内容如下:

    # Jetty section,Nexus 私服应用是使用 Jetty 提供 web 服务的,下述内容为 Jetty 配置。
    application-port=8081
    # 私服访问端口
    application-host=0.0.0.0
    nexus-webapp=${bundleBasedir}/nexus
    # Nexus 私服 WEB 应用所在位置 nexus-webapp-context-path=/nexus
    # Nexus 私服 WEB 应用 contextPath
    # Nexus section Nexus 私服配置信息
    nexus-work=${bundleBasedir}/…/sonatype-work/nexus # 私服工作目录,即构件保存目

    在这里插入图片描述

    2.2.2.4 修改 Nexus 运行用户

    Nexus 私服在启动后,私服应用需要访问 Linux 的文件系统,所以需要有足够的权限。

    Nexus 的启动脚本文件中,可以指定私服应用的访问用户,此信息在

    nexus-2.11.2-03/bin/nexus 脚本文件中定义。需要修改的信息如下:

    在这里插入图片描述

    # NOTE - This will set the user which is used to run the Wrapper as well as
    # the JVM and is not useful in situations where a privileged resource or
    # port needs to be allocated prior to the user being changed.
    #RUN_AS_USER= #原内容
    RUN_AS_USER=root #修改后的内容,代表 Nexus 私服使用 root 用户权限。
    2.2.2.5 关闭防火墙

    Linux 下并没有对 8081 这个端口做放行处理的

    service firewalld stop

    在这里插入图片描述

    2.2.2.6 启动并测试访问

    启动 Nexus 私服:

    /usr/local/nexus/nexus-2.11.2-03/bin/nexus start

    成功启动后,控制台输出内容如下:

    在这里插入图片描述

    可通过命令检查私服运行状态:

    /usr/local/nexus/nexus-2.11.2-03/bin/nexus status

    内容如下为私服运行中:

    4008:进程ID

    在这里插入图片描述

    内容如下为私服未运行:

    ****************************************
    WARNING - NOT RECOMMENDED TO RUN AS ROOT
    ****************************************
    Nexus OSS is not running.

    也可使用浏览器访问 Nexus 私服 WEB 应用, 访问地址为:

    http://ip:8081/nexus (ip 为 Nexus 所在系统的访问 IP)

    http://10.6.266.45:8081/nexus

    在这里插入图片描述

    如果浏览器不能成功访问主页,那么重启虚拟机执行下面的命令

    在这里插入图片描述

    2.2.3登录私服

    Nexus 默认提供管理用户,用户名为 admin,密码为 admin123。

    在这里插入图片描述

    在这里插入图片描述

    2.2.4仓库管理
    2.2.4.1 查看仓库

    在这里插入图片描述

    2.2.4.2 仓库类型简述

    在这里插入图片描述

    3.2.2.1 group

    仓库组:Nexus 通过仓库组来统一管理多个仓库,这样访问仓库组就相当于访问仓库 组管理的多个仓库。

    3.2.2.2 hosted

    宿主仓库:主要用于发布内部项目构件或第三方的项目构件(如购买商业的构件)以及 无法从公共仓库获取的构件(如 oracle 的 JDBC 驱动)。

    3.2.2.2.1releases

    发布内部的 releases 模块的仓库,所有非快照版本工程都发布到此仓库中。

    3.2.2.2.2snapshots

    发布内部的快照模块的仓库,所有工程版本以 SNAPSHOT 结尾的都发布到此仓库中。

    3.2.2.2.3 3rd party

    第三方依赖的仓库,这个数据通常是由内部人员自行下载之后发布上去

    3.2.2.3 proxy

    代理仓库:代理公共的远程仓库。

    3.2.2.4 virtual

    虚拟仓库:用于适配 Maven 1。

    2.2.4.3 代理仓库配置

    为 Nexus 配置阿里云代理仓库。

    Nexus 默认远程仓库为 https://repo1.maven.org/maven2/

    在这里插入图片描述

    设置阿里云代理仓库

    http://maven.aliyun.com/nexus/content/groups/public/

    在这里插入图片描述

    保证唯一性

    Repository ID: aliyun

    Repository Name: Aliyun Repository

    Remote Storage Location: http://maven.aliyun.com/nexus/content/groups/public/

    在这里插入图片描述

    刷新页面

    在这里插入图片描述

    在这里插入图片描述

    把 aliyun 添加到仓库组中,并把 aliyun 排在 central 之上。

    在这里插入图片描述

    在这里插入图片描述

    3 Nexus 用户管理

    3.1Nexus 中的缺省用户及角色说明

    在 Nexus 中内置了三个缺省用户,每个用户都拥有不同的角色,不同的角色对应不同的权限。在 Nexus 中用户必须要拥有角色。

    在这里插入图片描述

    3.1.1admin 用户(管理员)

    admin 管理员用户拥有最大权限,可以对 Nexus 进行全向控制。

    在这里插入图片描述

    在这里插入图片描述

    **3.1.2deployment(**部署用户)

    deployment 用户为部署用户,该用户拥有对 nexus 的部分的操作,但是该用户具有对所有仓库的操作权限。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    **3.1.3anonymous(**匿名用户)

    anonymous 用户为匿名用户,只具备了对 nexus 操作的部分权限,对于仓库也只是拥有读和查看权限。

    在这里插入图片描述

    在这里插入图片描述

    3.2用户操作

    3.2.1修改用户密码

    admin 用户登录可以修改其他用户的密码 非管理员用户只能修改自己的密码

    在这里插入图片描述

    在这里插入图片描述

    admin修改自己的密码:点击 Change Password 修改用户密码。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    输入当前密码以及新密码。 新密码为 admin

    在这里插入图片描述

    在这里插入图片描述

    3.2.2新建用户

    点击创建 Nexus Users 创建一个 Nexus 用户。

    在这里插入图片描述

    在这里插入图片描述

    如果未激活则用户不能使用

    在这里插入图片描述

    save

    在这里插入图片描述

    登录成功

    在这里插入图片描述

    可以操作所有仓库

    在这里插入图片描述

    3.2.3删除用户

    选中需要删除的用户,点击删除按钮即可删除该用户。

    在这里插入图片描述

    删除成功

    在这里插入图片描述

    4 私服应用

    要在 Maven 工程中使用私服,需要提供私服配置信息。

    4.1修改 settings.xml 配置文件

    4.1.1在servers 节点中添加仓库的用户认证

    在节点中配置仓库认证,操作仓库的用户以及密码,可以使用 deployment 用户,该用户为 Nexus 的缺省用户,也可以自己创建用户。(必须拥有对仓库操作的角色)

    <server> 
    		<id>releases</id> 
    		<username>deployment</username> 
    		<password>deployment123</password> 
    	</server> 
    	<server> 
    		<id>snapshots</id> 
    		<username>deployment</username> 
    		<password>deployment123</password>
    	</server>
    

    在这里插入图片描述

    4.1.2在 profile 节点中添加配置信息
    <profile> 
    		<id>sxt</id> 
    		<activation> 
    			<activeByDeffault>false</activeByDeffault> 
    			<jdk>1.8</jdk> 
    		</activation> 
    	<!-- 公共仓库配置 --> 
    		<repositories> 
    			<repository> 
    				<!-- 仓库 id --> 
    				<id>public</id> 
    				<!-- 私服地址 --> 
    				<url>http://10.6.226.45:8081/nexus/content/groups/public/</url> 
    				<!-- 仓库是否支持 releases 版本 --> 
    				<releases> 
    					<enabled>true</enabled> 
    				</releases> 
    				<!-- 仓库是否支持 snapshost 版本 --> 
    				<snapshost> 
    					<enabled>true</enabled> 
    				</snapshost> 
    			</repository> 
    		</repositories>
    	<!-- 插件仓库配置 --> 
    		<pluginRepositories> 
    			<pluginRepository> 
    				<id>public</id> 
    				<url>http://10.6.226.45:8081/nexus/content/groups/public/</url> 
    				<!-- 插件仓库是否支持 releases 版本 --> 
    				<releases> 
    					<enabled>true</enabled> 
    				</releases> 
    				<!-- 插件仓库是否支持 snapshost 版本 --> 
    				<snapshost> 
    					<enabled>true</enabled> 
    				</snapshost> 
    			</pluginRepository> 
    		</pluginRepositories> 
    	</profile>
    

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    4.1.3配置activeProfiles激活profile
    <activeProfiles> 
    	  <!--根据 profile 的 id 标签值激活指定的内容--> 
    		<activeProfile>sxt</activeProfile> 
      </activeProfiles>
    

    在这里插入图片描述

    在这里插入图片描述

    4.1.4删除阿里镜像仓库的配置

    我们在私服中已经配置了对于连接阿里镜像的代理,所以在 setings.xml 中需要将该配 置去掉,否则会自动去阿里镜像下载插件。

    <mirror>  
           <!-- 指定镜像ID -->
    		<id>nexus-aliyun</id>  
           <!-- 匹配中央仓库。-->
    		<mirrorOf>central</mirrorOf>
          <!-- 指定镜像名称 -->    
    		<name>Nexus aliyun</name>  
    <!-- 指定镜像路径 -->
    	<url>http://maven.aliyun.com/nexus/content/groups/public</url>  
    </mirror>
    

    4.2 POM 文件中配置私服

    4.2.1创建项目

    在这里插入图片描述

    在这里插入图片描述

    项目创建完之后报错 说明maven的配置文件出错

    在这里插入图片描述

    4.2.2修改POM文件
    4.2.2.1 添加上传构件的仓库地址

    配置当前项目上传到私服的仓库地址

    <distributionManagement>
        <repository>
            <!-- 需要与 settings.xml 中 server 的 id 相同 -->
            <id>releases</id>
            <name>Nexus Release Repository</name>
            <url>http://10.6.226.45:8081/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <!-- 需要与 settings.xml 中 server 的 id 相同 -->
            <id>snapshots</id>
            <name>Nexus Snapshot Repository</name>
            <url>http://10.6.226.45:8081/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
    

    在这里插入图片描述

    在这里插入图片描述

    仓库位置

    在这里插入图片描述

    在这里插入图片描述

    4.2.2.2 配置插件上传项目的源码包

    如果不配置处理源码 的插件未来项目上传到私服中只有classes 文件的jar 包,如果想把源码也上传到私服上就得配置这个插件

    <build>
        <plugins>
            <!--配置处理源码的插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.1.2</version>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    在这里插入图片描述

    双击deploy 命名向私服上传

    在这里插入图片描述

    去私服浏览项目,我们的项目是Snapshots 类型的,所以去这个仓库找

    如果不加插件就没有源码 sources.jar

    在这里插入图片描述

    如果要用我们发布的项目 点击项目对于的jar 包就会弹出坐标

    在这里插入图片描述

    4.3发布第三方构件到私服

    4.3.1将第三方构建上传到 3rd party 仓库中

    在这里插入图片描述

    Select Artfact to Upload 选择上传文件

    Add Artfact 是准备上传,如果有多个文件需要上传点击这个按钮之后继续选择要上传的文件同时Group等属性都可能需要改变

    Remove:去掉准备上传的文件

    Remove All:去掉所有

    在这里插入图片描述

    点击Upload Artfact 才是真正的上传

    在这里插入图片描述

    上传成功

    在这里插入图片描述

    在 3rd party 仓库里就可以找到了

    在这里插入图片描述

    在这里插入图片描述

    4.3.2在项目中引入第三方构件依赖

    在这里插入图片描述

    在这里插入图片描述

    十二、 基于 Maven 创建 war 工程

    1 创建 maven 项目

    在这里插入图片描述

    2 创建 webapp 文件夹

    在 src/main 下新建 webapp 文件夹
    在 webapp 下新建 WEB-INF 文件夹
    在 WEB-INF 下新建 web.xml

    在这里插入图片描述

    3 配置 web 模块

    如果不配置会导致无法新建 jsp 文件
    菜单 --> Project Structure -->

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    4 配置 pom.xml

    如果不配置未来项目无法被部署到Tomcat 插件中运行

    在这里插入图片描述

    <?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.bjsxt</groupId>
        <artifactId>webdemo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--指定项目类型为war-->
        <packaging>war</packaging>
    
        <dependencies>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
                <!--仅在当前运行时生效打包时不会包含进去      Tomcat已经包含这个API-->
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.2</version>
                <!--仅在当前运行时生效打包时不会包含进去      Tomcat已经包含这个API-->
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                    <configuration>
                        <path>/</path>
                        <port>8080</port>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    双击启动

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    十三、 Maven 实战

    1 需求分析

    基于 SSM 框架的 CRUD 案例
    增加(Create)、读取(Retrieve)、更新(Update)、删除(Delete)

    2 技术选型

    框架:SpringMVC+Spring+Mybatis
    数据库:MySQL
    项目管理工具:Maven
    POM 模型:使用聚合模型

    3 项目架构设计

    3.1传统项目设计方式

    在这里插入图片描述

    3.2Maven 项目设计方式

    在这里插入图片描述

    4 创建 Users 表

    CREATE TABLE `users` (
      `userid` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(30) DEFAULT NULL,
      `userage` int(11) DEFAULT NULL,
      PRIMARY KEY (`userid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    

    在这里插入图片描述

    5 创建项目

    5.1创建父工程

    5.1.1项目名称

    父工程名称:parent

    在这里插入图片描述

    5.1.1.1 修改 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.bjsxt</groupId>
        <artifactId>parent-test</artifactId>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>pojo-test</module>
            <module>mapper-test</module>
            <module>service-test</module>
            <module>controller-test</module>
        </modules>
        <!--指定项目类型为pom-->
        <packaging>pom</packaging>
    
        <!--Dependency Version Management-->
        <properties>
            <spring.version>5.2.4.RELEASE</spring.version>
            <mysql.driver.version>5.1.38</mysql.driver.version>
            <log4j.version>1.2.17</log4j.version>
            <aspectj.version>1.9.5</aspectj.version>
            <mybatis.version>3.5.4</mybatis.version>
            <mybatis-spring.version>2.0.3</mybatis-spring.version>
            <servlet-api.version>3.1.0</servlet-api.version>
            <jsp-api.version>2.2</jsp-api.version>
            <jstl.version>1.2</jstl.version>
            <tomcat-plugin.version>2.2</tomcat-plugin.version>
            <mybatis-generator.version>1.3.5</mybatis-generator.version>
        </properties>
        <dependencyManagement>
            <dependencies>
                <!--Spring Dependency-->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-webmvc</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-jdbc</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <!--MySQL Driver Dependency-->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>${mysql.driver.version}</version>
                </dependency>
                <!--Log4j Dependency-->
                <dependency>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                    <version>${log4j.version}</version>
                </dependency>
                <!--AspectJ Dependency-->
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
                <!--MyBatis Dependency-->
                <dependency>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                    <version>${mybatis.version}</version>
                </dependency>
                <!--MyBatis Integration Spring Dependency-->
                <dependency>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis-spring</artifactId>
                    <version>${mybatis-spring.version}</version>
                </dependency>
                <!--Web Dependency-->
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>javax.servlet-api</artifactId>
                    <version>${servlet-api.version}</version>
                </dependency>
                <dependency>
                    <groupId>javax.servlet.jsp</groupId>
                    <artifactId>jsp-api</artifactId>
                    <version>${jsp-api.version}</version>
                </dependency>
                <dependency>
                    <groupId>jstl</groupId>
                    <artifactId>jstl</artifactId>
                    <version>${jstl.version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <build>
            <pluginManagement>
                <plugins>
                    <!--Tomcat Plugin-->
                    <plugin>
                        <groupId>org.apache.tomcat.maven</groupId>
                        <artifactId>tomcat7-maven-plugin</artifactId>
                        <version>${tomcat-plugin.version}</version>
                    </plugin>
                    <!--MyBatis Generator Plugin-->
                    <plugin>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-maven-plugin</artifactId>
                        <version>${mybatis-generator.version}</version>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    
    </project>
    

    在这里插入图片描述

    5.2创建聚合模块

    5.2.1创建 POJO 项目

    POJO 项目不需要添加任何依赖。

    <?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">
        <parent>
            <artifactId>parent</artifactId>
            <groupId>com.bjsxt</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>pojo</artifactId>
    
    
    </project>
    
    5.2.2创建 Mapper 项目

    在这里插入图片描述

    5.2.2.1 修改 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">
        <parent>
            <artifactId>parent</artifactId>
            <groupId>com.bjsxt</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>mapper</artifactId>
    
        <dependencies>
            <dependency>
                <artifactId>pojo</artifactId>
                <groupId>com.bjsxt</groupId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
            <!--MySQL Driver Dependency-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <!--MyBatis Dependency-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
            </dependency>
            <!--MyBatis Integration Spring Dependency-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
            </dependency>
        </dependencies>
    
    </project>
    
    5.2.3创建 Service 项目

    在这里插入图片描述

    5.2.3.1 修改 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">
        <parent>
            <artifactId>parent</artifactId>
            <groupId>com.bjsxt</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>service</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>com.bjsxt</groupId>
                <artifactId>mapper</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
    
            <!--Spring Dependency-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
            </dependency>
    
            <!--Log4j Dependency-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </dependency>
    
            <!--AspectJ Dependency-->
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
            </dependency>
        </dependencies>
    
    </project>
    
    5.2.4创建 Controller 项目

    在这里插入图片描述

    5.2.4.1 修改 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">
        <parent>
            <artifactId>parent</artifactId>
            <groupId>com.bjsxt</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <!--指定工程类型为war-->
        <packaging>war</packaging>
    
        <artifactId>controller</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>com.bjsxt</groupId>
                <artifactId>service</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <!--Web Dependency-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <!--指定作用范围      仅在编码测试运行时生效打包时不包含这个API-->
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <!--指定作用范围      仅在编码测试运行时生效打包时不包含这个API-->
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>jstl</groupId>
                <artifactId>jstl</artifactId>
            </dependency>
        </dependencies>
    
    </project>
    

    将 controller 目录结构改为web 项目结构

    在这里插入图片描述

    controller/web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    </web-app>
    

    5.3添加插件

    5.3.1在 Mapper 中添加 Mybatis generator 插件

    插件中的数据库驱动必须给定版本信息,因为它不是从父工程那里继承来的依赖,而是自己去仓库里找这个jar 包,插件不考虑继承关系

    <build>
            <plugins>
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <dependencies>
                        <dependency>
                            <groupId>mysql</groupId>
                            <artifactId>mysql-connector-java</artifactId>
                            <version>5.1.38</version>
                        </dependency>
                    </dependencies>
                    <!-- 指定配置文件的路径 -->
                    <configuration>
                        <configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                        <verbose>true</verbose>
                        <overwrite>true</overwrite>
                    </configuration>
                </plugin>
            </plugins>
    </build>
    

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在pojo 下新建包把生成的 Users 和 UsersExample 放进去 同时删掉mapper下的com.bjsxt.pojo包

    在这里插入图片描述

    在这里插入图片描述

    5.3.2在 Mapper 中指定资源拷贝目录
    <!--指定资源拷贝路径-->
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>
    
    5.3.3在 Controller 中添加 Tomcat 插件
    <build>
        <plugins>
            <!-- 配置 Tomcat 插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <!-- 配置 Tomcat 监听端口 -->
                    <port>8080</port>
                    <!-- 配置项目的访问路径 (Application Context) -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    测试之前先对父工程进行打包安装 install 父工程打包安装之后旗下的子模块都打包安装了,不安装到本地仓库模块之间没得依赖

    在这里插入图片描述

    给 mapper模块配置的资源拷贝路径有效

    在这里插入图片描述

    启动Tomcat测试成功

    在这里插入图片描述

    6 框架整合

    在 Controller 项目中配置框架整合。 框架整合配置文件放到 controller/resources 目录下

    6.1创建 db.properties 配置文件

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/maven?characterEncoding=utf-8
    jdbc.username=root
    jdbc.password=root
    

    6.2创建 applicationContext-dao.xml

    classpath:项目打包完之后的classes 目录,或者是项目没打包时在maven 中的resources 目录

    在这里插入图片描述

    pojo依赖给了mapper,mapper依赖给了service,service依赖给了controller,根据依赖传递性,所以在controller项目里能找到com.bjsxt.pojo 和 com.bjsxt.mapper

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util.xsd">
    
        <!-- 解析 properties 配置文件 -->
        <context:property-placeholder location="classpath:resource/db.properties"/>
    
        <!--配置数据源-->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    
        <!-- 配置 SqlSessionFactory-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="typeAliasesPackage" value="com.bjsxt.pojo"/>
        </bean>
    
        <!-- 配置 MapperScanner-->
        <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.bjsxt.mapper"/>
        </bean>
    
    </beans>
    

    6.3创建 applicationContext-service.xml

    在这里插入图片描述

    com.bjsxt.service 这个包应该在service 项目中创建 service 会依赖给controller 就等同于controller 中有service 这个项目所以扫描service 下的 com.bjsxt.service 包,如果在 controller下创建 com.bjsxt.service 包那么 service 项目将毫无作用

    在这里插入图片描述

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/util
            http://www.springframework.org/schema/util/spring-util.xsd">
    
        <!-- 配置 Spring 包扫描 -->
        <context:component-scan base-package="com.bjsxt.service"/>
    
    </beans>
    

    6.4创建 applicationContext-trans.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util.xsd">
    
        <!--引入其他配置文件-->
        <import resource="applicationContext-dao.xml"/>
    
        <!-- 配置事务管理器切面 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!-- 配置事务传播行为 -->
        <tx:advice id="txAdvice">
            <tx:attributes>
                <tx:method name="add*" propagation="REQUIRED"/>
                <tx:method name="modify*" propagation="REQUIRED"/>
                <tx:method name="drop*" propagation="REQUIRED"/>
                <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
                <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            </tx:attributes>
        </tx:advice>
    
        <!-- 配置事务切点 -->
        <aop:config>
            <aop:pointcut id="myPointcut" expression="execution(* com.bjsxt.service.*.*(..))"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
        </aop:config>
    
    </beans>
    

    6.5创建 springmvc.xml

    com.bjsxt.web.controller 这个包创建到 controller 项目下

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!-- 配置 SpringMVC 包扫描 -->
        <context:component-scan base-package="com.bjsxt.web.controller"/>
    
        <!-- 配置注解驱动 -->
        <mvc:annotation-driven/>
    
        <!-- 配置视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
    </beans>
    

    6.6修改 web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!-- 指定 Spring 配置文件位置 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/applicationContext-*.xml</param-value>
        </context-param>
    
        <!-- 配置启动 Spring 框架的监听器 -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <!-- 配置 SpringMVC 主控制器 -->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring/springmvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
        <!-- 配置 SpringMVC 中的编码过滤器 -->
        <filter>
            <filter-name>encodeFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>encodeFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
    </web-app>
    

    启动Tomcat 测试 框架整合成功

    在这里插入图片描述

    7 业务实现

    7.1实现添加用户业务

    7.1.1创建添加用户 Service
    package com.bjsxt.service;
    
    import com.bjsxt.pojo.Users;
    
    public interface UsersService {
    
        void addUsers(Users users);
    
    }
    
    package com.bjsxt.service.impl;
    
    import com.bjsxt.mapper.UsersMapper;
    import com.bjsxt.pojo.Users;
    import com.bjsxt.service.UsersService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    /**
     * 用户管理业务层
     */
    @Service
    public class UsersServiceImpl implements UsersService {
    
        @Autowired
        private UsersMapper usersMapper;
    
        /**
         * 用户添加业务
         * @param users
         */
        @Override
        @Transactional
        public void addUsers(Users users) {
            this.usersMapper.insert(users);
        }
    }
    
    7.1.2创建首页

    index.jsp

    <%--
      Created by IntelliJ IDEA.
      User: admin
      Date: 2020/11/22
      Time: 10:55
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <a href="/addUsers">添加用户</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="/users/findUsers">查询用户</a>
    </body>
    </html>
    
    7.1.3创建添加用户页面

    addUsers.jsp

    <%--
      Created by IntelliJ IDEA.
      User: admin
      Date: 2020/11/22
      Time: 11:02
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <form action="/users/addUsers" method="post">
            用户名:<input type="text" name="username"/><br/>
            用户年龄:<input type="text" name="userage"/><br/>
            <input type="submit" value="OK"/>
        </form>
    </body>
    </html>
    
    7.1.4创建成功页面

    ok.jsp

    <%--
      Created by IntelliJ IDEA.
      User: admin
      Date: 2020/11/22
      Time: 11:27
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        操作成功!请<a href="/index">返回</a>
    </body>
    </html>
    
    7.1.5创建页面跳转的 Controller
    package com.bjsxt.web.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * 页面跳转Controller
     */
    @Controller
    public class PageController {
    
        /**
         * 页面跳转
         */
        @RequestMapping("/{page}")
        public String showPage(@PathVariable String page) {
            return page;
        }
    }
    
    7.1.6创建添加用户 Controller
    package com.bjsxt.web.controller;
    
    import com.bjsxt.pojo.Users;
    import com.bjsxt.service.UsersService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * 处理用户管理请求
     */
    @Controller
    @RequestMapping("/users")
    public class UsersController {
    
        @Autowired
        private UsersService usersService;
    
        /**
         * 处理添加用户
         */
        @RequestMapping("/addUsers")
        public String addUsers(Users users) {
            this.usersService.addUsers(users);
            //为了防止表单重复提交使用重定向
            return "redirect:/ok";
        }
    }
    

    启动Tomcat测试

    因为虽然有这个包但是未安装

    在这里插入图片描述

    先清空 再 安装

    启动成功

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    点击返回

    在这里插入图片描述

    在这里插入图片描述

    7.2实现查询用户业务

    7.2.1创建查询用户 Service
    List<Users> findUsers();
    
    /**
     * 查询全部用户
     *
     * @return
     */
    @Override
    public List<Users> findUsers() {
        UsersExample usersExample = new UsersExample();
        return this.usersMapper.selectByExample(usersExample);
    }
    
    7.2.2创建查询用户 Controller
    /**
     * 处理查询所有用户请求
     */
    @RequestMapping("/findUsers")
    public String findUsers(Model model) {
        List<Users> list = this.usersService.findUsers();
        model.addAttribute("list",list);
        return "/showUsers";
    }
    

    在这里插入图片描述

    7.2.3创建显示用户页面

    showUsers.jsp

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%--
      Created by IntelliJ IDEA.
      User: admin
      Date: 2020/11/22
      Time: 15:15
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <table border="1" align="center">
            <tr>
               <th>用户名</th>
                <th>年龄</th>
                <th>操作</th>
            </tr>
            <c:forEach items="${list}" var="user">
                <tr>
                    <td>${user.username}</td>
                    <td>${user.userage}</td>
                    <td>
                        <a href="">更新</a>
                        <a href="">删除</a>
                    </td>
                </tr>
            </c:forEach>
        </table>
    </body>
    </html>
    

    代码一旦改动,启动Tomcat测试之前需要重新打包

    在这里插入图片描述

    在这里插入图片描述

    点击查询用户 展示所有用户

    在这里插入图片描述

    7.3更新用户业务

    7.3.1预更新查询
    7.3.1.1 创建查询用户 Service
    /*POJO 中是Integer类型的*/
    Users findUserById(Integer userid);
    
    /**
     * 根据用户id查询用户
     * @param userid
     * @return
     */
    @Override
    public Users findUserById(Integer userid) {
        //根据主键查询用户
        return this.usersMapper.selectByPrimaryKey(userid);
    }
    
    7.3.1.2 创建查询用户 Controller

    在这里插入图片描述

    在这里插入图片描述

    /**
     * 处理预更新用户的查询
     */
    @RequestMapping("/preUpdateUser")
    /*参数名userid一定要和url 中?后面跟的key(userid)相同*/
    public String preUpdateUser(Integer userid,Model model) {
        Users users = this.usersService.findUserById(userid);
        model.addAttribute("users", users);
        return "/updateUsers";
    }
    
    7.3.1.3 创建显示预更新用户页面

    updateUsers.jsp

    <%--
      Created by IntelliJ IDEA.
      User: admin
      Date: 2020/11/22
      Time: 15:42
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <form action="/users/updateUsers" method="post">
            <%--隐藏域用于存放userid--%>
            <input type="hidden" name="userid" value="${users.userid}"/>
            用户名:<input type="text" name="username" value="${users.username}"/><br/>
            用户年龄:<input type="text" name="userage" value="${users.userage}"/><br/>
            <input type="submit" value="OK"/>
        </form>
    </body>
    </html>
    

    代码有修改,测试之前先打包再启动Tomcat

    在这里插入图片描述

    在这里插入图片描述

    点击更新按钮

    在这里插入图片描述

    7.3.2更新用户
    7.3.2.1 创建更新用户 Service
    void modifyUsers(Users users);
    
    /**
     * 更新用户
     * @param users
     */
    @Override
    @Transactional
    public void modifyUsers(Users users) {
        this.usersMapper.updateByPrimaryKey(users);
    }
    
    7.3.2.2 创建更新用户 Controller
    /**
     * 更新用户
     */
    @RequestMapping("/updateUsers")
    public String updateUsers(Users users) {
        this.usersService.modifyUsers(users);
        //更新成功之后为了避免表单重复提交使用重定向
        return "redirect:/ok";
    }
    

    代码有修改,测试之前先打包再启动Tomcat

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    7.4删除用户业务

    7.4.1创建删除用户 Service
    void dropUsersById(Integer userid);
    
    /**
     * 根据用户id删除用户
     * @param userid
     */
    @Override
    @Transactional
    public void dropUsersById(Integer userid) {
        this.usersMapper.deleteByPrimaryKey(userid);
    }
    
    7.4.2创建删除用户 Controller

    在这里插入图片描述

    /**
     * 删除用户
     */
    @RequestMapping("/deleteUser")
    public String deleteUsers(Integer userid) {
        this.usersService.dropUsersById(userid);
        //删除成功之后为了避免表单重复提交使用重定向
        return "redirect:/ok";
    }
    

    在这里插入图片描述

    点击删除

    在这里插入图片描述

    在这里插入图片描述

    十四、 Tomcat 热部署

    热部署是指,在外部的 Tomcat 容器运行过程中,动态实现 war 工程的部署,或者重新部署的功能。我们可以使用 Maven 的 Tomcat 插件实现远程热部署,具体命令为:

    tomcat7:deploy 或 tomcat7:redeploy。其中 deploy 代表第一次部署 war 工程;

    redeploy代表 Tomcat 容器中已有同名应用,本次操作为重新部署同名 war 工程。

    实现热部署需要远程访问 Tomcat 容器,所以需要开启 Tomcat 的用户认证机制。在Tomcat 中,对于支持远程热部署的用户需要拥有相应的权限。

    关掉防火墙 service firewalld stop

    启动Linux 下的Tomcat

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    1 Tomcat 权限介绍

    在这里插入图片描述

    2 在 Tomcat 中添加用户并分配权限

    修改 Tomcat 中的 conf/tomcat-users.xml 文件的配置

    在这里插入图片描述

    在这里插入图片描述

    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <user username="tomcat" password="tomcat"
    roles="manager-gui,manager-script"/>
    

    在这里插入图片描述

    在这里插入图片描述

    停止Tomcat

    在这里插入图片描述

    重启Tomcat

    在这里插入图片描述

    刷新页面 点击 ManagerAPP tomcat tomcat

    在这里插入图片描述

    在这里插入图片描述

    手动找到Linux 下的war包进行部署

    在这里插入图片描述

    对已运行的项目进行管理

    在这里插入图片描述

    停止 重新载入 移除

    在这里插入图片描述

    3 配置 Tomcat 插件实现热部署

    修改项目 POM 文件中的 Tomcat 插件,添加配置信息。

    <build>
        <plugins>
            <!-- 配置 Tomcat 插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <!-- path: 上传的 war 包解压后的路径命名 -->
                    <path>/ROOT</path>
                    <!-- url : 上传 war 包到什么位置 , 除 IP 和端口可以修改外其他不变 -->
                    <url>http://10.6.226.45:8080/manager/text</url>
                    <!-- 为 tomcat 配置的管理用户名和密码 . -->
                    <username>tomcat</username>
                    <password>tomcat</password>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    / :Tomcat的webapps 目录

    在webapps 目录下放一个 ROOT.war 的文件

    在这里插入图片描述

    ROOT目录中放的是首页的内容

    在这里插入图片描述

    必须有权限才能访问这个接口

    在这里插入图片描述

    虽然我们的项目未部署过但是我们的项目名字ROOT 在Tomcat下已经存在了 所以不再是第一次部署而是重新部署使用redeploy

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    双击redeploy

    在这里插入图片描述

    Linux 下的Tomcat日志信息发生变化

    在这里插入图片描述

    所谓的激活就是对war包进行解压

    在这里插入图片描述

    原来ROOT中所有内容都被替换了 现在显示的就是我们项目中的内容

    在这里插入图片描述

    在这里插入图片描述

    直接在Tomcat页面访问

    在这里插入图片描述

    点击查询用户

    在这里插入图片描述

    异常原因JDBC连接异常 因为db.properties里面配置的信息连接的还是localhost的

    在这里插入图片描述

    直接连接Windows下的mysql

    让Linux下运行的项目访问Windows下的MySQL

    在这里插入图片描述

    root用户得允许在任何IP地址下连接

    在这里插入图片描述

    双击redeploy

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • Maven环境变量

    千次阅读 2019-06-24 20:36:35
    1.什么是Maven 中文翻译成“专家”或“内行”。 maven是纯java语言编写的开源项目管理工具。 采用了POM(Project Object Model)项目对象模型的概念来管理项目,所有项目配置信息被定义在一个叫做pom.xml的文件中,...
  • Maven - Maven基础

    2017-12-15 23:45:00
    1-下载及安装 1.1 - Maven - 项目管理利器 http://maven.apache.org/ ...Maven是一个基于POM(Project Object Model, 项目对象模型)的项目构建和管理工具。 可以通过一小段描述信
  • Maven配置

    2020-10-15 10:13:51
    Maven 我为什么要学习这个技术? 在JavaWeb开发中,需要使用...Maven会规定好你该如何去编写我们的Java代码,必须要按照这个规范来 1. 下载安装Maven 官网:https://maven.apache.org 2. 解压到/Users/用户名下(mac
  • Maven学习

    2021-07-29 20:17:21
    一、Maven 1.1、我为什么要学习这个技术? 1.在javaweb开发中,需要使用大量的jar...Maven 会规定好你该如何去编写我们的java代码,必须要按照这个规范来; 1.3、阿里云镜像 国内建议使用阿里云镜像 <mirror>
  • 一、什么是 MavenMaven 是一个项目管理工具,它的本质是一个项目对象模型(POM),体现在配置中就是我们常见的 pom.xml 文件,而这个 pom 文件就是 Maven 的核心,它管理了整个项目的生命周期。它主要做两件事: ...
  • 这篇来看看如何在Eclipse上正确的基于Maven创建一个web动态项目。默认创建web动态项目是缺少内容,需要我们手动修改一下。然后来学习一下依赖中的范围。 1.Maven默认创建web工程效果 打开Eclipse,我们来创建一...
  • maven

    2018-05-25 22:36:40
    Maven maven的相关概念a) 构建的概念b) 什么是mavenc) 为什么要用maven1、Maven的下载及安装2、创建第一个maven工程a) Maven的工程结构b) Maven的命令3、Maven的Eclipse插件a) 创建maven工程b) 插件的配置4...
  • Maven下载与配置详细教程

    千次阅读 多人点赞 2021-04-04 21:19:40
    (2)Maven会规定你如何去编写java代码,必须按照这个规范来; 2、下载安装 解压bin 3.配置环境变量 在系统环境变量中 M2_HOME maven目录下的bin目录MAVEN_HOME maven目录 在系统的path中配置%MAVEN_HOME%\bin 4....
  • maven工程的结构

    2017-05-28 19:57:04
    因为Maven是一种强约束的工程类型。它对工程的文件命名和格式要求比较严格。其好处是指定了规范,方便代码的移植和理解。上文中的src/main/java是个什么呢?其实是一个路径,打开其物理地址会发现,是一个src文件夹...
  • 为什么需要用maven

    2020-04-11 10:57:44
    在JAVA项目开发中,一直在使用maven进行依赖管理。但是从没有系统的梳理maven的背景和原理,在遇到问题时候可能没办法敏锐嗅到解决方法。 因此,今天对maven产生背景、用途及具体使用进行梳理。本文将不间断更新,...
  • JavaWeb之Maven

    2021-02-01 01:44:28
    五、Maven 目录:Maven项目架构管理工具、下载安装Maven、配置环境变量、阿里云镜像、本地仓库、在IDEA中使用Maven、补充:在IDEA中...Maven会规定好如何去编写Java代码,必须要按照这个规范来。有约束,不要去违反。
  • 一个小时学会Maven

    2018-09-21 14:40:15
    一、为什么要Maven二、安装与配置2.1、官网下载安装包2.2、配置环境变量2.3、本地仓储配置2.4、中央仓库配置2.5、命令行创建maven项目2.6、...结构3.4、Maven的"约束优于配置"3.5、Maven的版本规范3.6、项目骨架M...
  • Maven 我为什么要学习这个技术? 在Java web中,需要使用大量的jar包,我们手动导入; 如何能够让一个东西自动帮我们导入和配置这个...Maven会规定好你如何去编写我们的Java代码,必须要按照这个规范来 1...
  • Maven学习整理

    2020-06-30 12:28:35
    二、Maven的两大功能,分别是项目构建和依赖管理2.1 使用Maven的好处三、Maven项目的生命周期四、Maven项目之间的管理(依赖、继承、聚合)4.1 依赖4.2 继承4.3 聚合4.4标签中的scope五、Maven常用命令及其作用、...
  • 使用maven CheckStyle 进行打包代码格式约束 (1).将checkStyle.xml文件放入根目录下,与父pom.xml同级目录 (2).在父pom文件内添加 plugin (3).在单module中直接放入pom文件中即可 org.apache.maven.plugins maven-...
  • 然后打开原来的项目结果引入spring-boot-maven-plugin出现爆红,而且spring-boot-starter-parent也不能引入。 二、解决办法       1.检查环境配置,主要是settings.xml此文件配置情况...
  • Win 10 安装 MavenMaven 知识点扫盲

    千次阅读 2019-04-25 18:16:19
    Maven 概述 Maven 生命周期 Maven 约定 Maven 下载与配置 配置 setting.xml IDEA 配置 Maven Maven 概述 1、Maven是Apache 下的一个顶级项目,官网地址:http://maven.apache.org/ 2、Maven 是一个跨平台的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,493
精华内容 2,197
关键字:

maven约束规范