[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"\u002Fresource\u002Fdocument\u002Flist?undefined":3,"\u002Fresource\u002Fdocument\u002Fquery\u002Fru4ogh2waocpn4jo?undefined":462,"\u002Fresource\u002Fadvertise\u002Flist?type=all?undefined":467},{"data":4,"status":460,"success":461},[5,148,202,291,332,370,420],{"books":6,"desc":145,"id":8,"image":146,"title":147},[7,40,63,78,93,105,117],{"cateId":8,"chapters":9,"desc":36,"id":11,"time":37,"title":38,"video":39},1,[10,15,18,21,24,27,30,33],{"bookId":11,"id":12,"indexOrder":13,"name":14},24,"8egfulw98v3h680j",0,"JavaSE 笔记（一）走进Java语言",{"bookId":11,"id":16,"indexOrder":13,"name":17},"pew6po6wrou23pk3","JavaSE 笔记（二）面向过程编程",{"bookId":11,"id":19,"indexOrder":13,"name":20},"eldst1fgrbdkmfs7","JavaSE 笔记（三）面向对象基础",{"bookId":11,"id":22,"indexOrder":13,"name":23},"48zphgkpjto8cath","JavaSE 笔记（四）面向对象高级篇",{"bookId":11,"id":25,"indexOrder":13,"name":26},"6r4llai92yc15j98","JavaSE 笔记（五）泛型程序设计",{"bookId":11,"id":28,"indexOrder":13,"name":29},"k6fmxd6qabgkwm9i","JavaSE 笔记（六）集合类与IO",{"bookId":11,"id":31,"indexOrder":13,"name":32},"qrd0xfttsz32gpqg","JavaSE 笔记（七）多线程与反射",{"bookId":11,"id":34,"indexOrder":13,"name":35},"td5tgn04nqmkrryt","JavaSE 笔记（八）GUI程序开发","基于Java25全新录制的SE课程",2025,"JavaSE 核心内容","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV163GGz2E8c",{"cateId":8,"chapters":41,"desc":59,"id":8,"time":60,"title":61,"video":62},[42,44,46,49,51,53,55,57],{"bookId":8,"id":43,"indexOrder":13,"name":14},"ibeeuwsbbi00undq",{"bookId":8,"id":45,"indexOrder":13,"name":17},"dncxjecdv4wciqcp",{"bookId":8,"id":47,"indexOrder":13,"name":48},"jviyz2hsht9ete5k","JavaSE 笔记（三）面向对象基础篇",{"bookId":8,"id":50,"indexOrder":13,"name":23},"qb9i6q9fap7bg1cc",{"bookId":8,"id":52,"indexOrder":13,"name":26},"hnkrjrkm3hjzeq6s",{"bookId":8,"id":54,"indexOrder":13,"name":29},"erpm32wduoaaqmrx",{"bookId":8,"id":56,"indexOrder":13,"name":32},"lfqtvxr7azumcwja",{"bookId":8,"id":58,"indexOrder":13,"name":35},"qs7gqok56gzc6idr","2022年制作的JavaSE版本",2022,"JavaSE 22年旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1YP4y1o75f\u002F",{"cateId":8,"chapters":64,"desc":75,"id":66,"time":60,"title":76,"video":77},[65,69,72],{"bookId":66,"id":67,"indexOrder":13,"name":68},2,"g96k66kczovvbm1i","JVM 笔记（一）走进JVM",{"bookId":66,"id":70,"indexOrder":13,"name":71},"ydd7n3jg8unc3clg","JVM 笔记（二）内存管理",{"bookId":66,"id":73,"indexOrder":13,"name":74},"r9dq37de0kaeauoi","JVM 笔记（三）类与类加载","了解Java的底层运作机制","Java JVM 虚拟机","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Er4y1r7as\u002F",{"cateId":8,"chapters":79,"desc":90,"id":81,"time":60,"title":91,"video":92},[80,84,87],{"bookId":81,"id":82,"indexOrder":13,"name":83},3,"asncyye9ya18gfar","JUC 笔记（一）再谈多线程",{"bookId":81,"id":85,"indexOrder":13,"name":86},"5tr1sm4ho6ygpt9q","JUC 笔记（二）并发编程核心",{"bookId":81,"id":88,"indexOrder":13,"name":89},"1scf51z5300mzxkh","JUC 笔记（三）并发编程进阶","你也可以成为多线程的主宰者","Java JUC 并发编程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1JT4y1S7K8\u002F",{"cateId":8,"chapters":94,"desc":102,"id":96,"time":60,"title":103,"video":104},[95,99],{"bookId":96,"id":97,"indexOrder":13,"name":98},4,"eedesc445ygiqhil","NIO 笔记（一）基础内容",{"bookId":96,"id":100,"indexOrder":13,"name":101},"ndz9t0uunrmfmv4n","NIO 笔记（二）Netty框架专题","编写畅快的高性能网络服务器","Java NIO 网络编程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1ar4y1J7mC\u002F",{"cateId":8,"chapters":106,"desc":114,"id":108,"time":60,"title":115,"video":116},[107,111],{"bookId":108,"id":109,"indexOrder":13,"name":110},5,"9890i8ofuadpwy2b","[扩展篇] Java 9-17新特性介绍",{"bookId":108,"id":112,"indexOrder":13,"name":113},"tsrkqvb6zpmtwh0n","[扩展篇] JavaSE关键字总结 笔记","精彩仍在继续，不要停止脚步","其他内容","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1tU4y1y7Fg\u002F",{"cateId":8,"chapters":118,"desc":141,"id":120,"time":142,"title":143,"video":144},[119,123,126,129,132,135,138],{"bookId":120,"id":121,"indexOrder":13,"name":122},6,"4db9h32opv7imszh","JavaSE 笔记（一）面向过程编程",{"bookId":120,"id":124,"indexOrder":13,"name":125},"c93u3v37br7hgn1q","JavaSE 笔记（二）面向对象基础篇",{"bookId":120,"id":127,"indexOrder":13,"name":128},"yglsjde9gi1jxkcb","JavaSE 笔记（三）泛型与集合类",{"bookId":120,"id":130,"indexOrder":13,"name":131},"ilhi987n986rmvo3","JavaSE 笔记（四）异常机制",{"bookId":120,"id":133,"indexOrder":13,"name":134},"pqv38vexmenglk4k","JavaSE 笔记（五）IO",{"bookId":120,"id":136,"indexOrder":13,"name":137},"jiq41n87i9ia7ilw","JavaSE 笔记（六）多线程",{"bookId":120,"id":139,"indexOrder":13,"name":140},"wn7x2mge9ws79zps","JavaSE 笔记（七）反射","此版本为早期录制的旧版本",2021,"JavaSE 21年旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Gv411T7pi\u002F","包含JavaSE基础路线全部教程笔记，打下坚实的基础","https:\u002F\u002Fpic2.zhimg.com\u002F80\u002Fv2-bf1a927f037a79f4d57d9ae543430a0d_1440w.webp","JavaSE 系列笔记 ☕️",{"books":149,"desc":199,"id":66,"image":200,"title":201},[150,166,178],{"cateId":66,"chapters":151,"desc":162,"id":153,"time":163,"title":164,"video":165},[152,156,159],{"bookId":153,"id":154,"indexOrder":13,"name":155},21,"iqbc2haub31bwqtz","Lombok 极速上手",{"bookId":153,"id":157,"indexOrder":13,"name":158},"ijay2hay19kn1k031","Mybatis 快速上手",{"bookId":153,"id":160,"indexOrder":13,"name":161},"ru4ogh2waocpn4jo","Maven 快速上手","JavaWeb阶段必须扩展知识点",2024,"常用知识讲解","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1gb421J7ok\u002F",{"cateId":66,"chapters":167,"desc":175,"id":169,"time":163,"title":176,"video":177},[168,172],{"bookId":169,"id":170,"indexOrder":13,"name":171},22,"ek20yvb6huhxizx7","JavaWeb 笔记（一）计算机网络基础",{"bookId":169,"id":173,"indexOrder":13,"name":174},"pgevws6w2krkffa4","JavaWeb笔记（二）Java与数据库","全面升级的JavaWeb课程","JavaWeb 网站开发","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1kS421X7rq\u002F",{"cateId":66,"chapters":179,"desc":196,"id":181,"time":142,"title":197,"video":198},[180,184,187,190,193],{"bookId":181,"id":182,"indexOrder":13,"name":183},7,"ggwwj09j2vkfftvd","JavaWeb 笔记（一）Java网络编程",{"bookId":181,"id":185,"indexOrder":13,"name":186},"sauvq105istskjaz","JavaWeb 笔记（二）数据库基础",{"bookId":181,"id":188,"indexOrder":13,"name":189},"xgbeasmvrhxx9tn4","JavaWeb 笔记（三）Java与数据库",{"bookId":181,"id":191,"indexOrder":13,"name":192},"k7dfwua3bsezvw9q","JavaWeb 笔记（四）前端基础",{"bookId":181,"id":194,"indexOrder":13,"name":195},"ycpagby2v7j4p728","JavaWeb 笔记（五）后端开发","搭建属于自己的Web网站","JavaWeb 旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1CL4y1i7qR\u002F","包含JavaWeb路线全套笔记，从零开始搭建自己的网站！","https:\u002F\u002Fpic3.zhimg.com\u002F80\u002Fv2-df3b38e3012258ed70c23b586309e3f6_1440w.webp","JavaWeb 系列笔记 🚛",{"books":203,"desc":288,"id":81,"image":289,"title":290},[204,220,235,255,273],{"cateId":81,"chapters":205,"desc":216,"id":207,"time":217,"title":218,"video":219},[206,210,213],{"bookId":207,"id":208,"indexOrder":13,"name":209},8,"h7sjo5oy0l03607e","SSM笔记（一）Spring基础",{"bookId":207,"id":211,"indexOrder":13,"name":212},"eve8gq72qmdb46sg","SSM笔记（二）SpringMvc基础",{"bookId":207,"id":214,"indexOrder":13,"name":215},"63v73g0zh1qlr6fk","SSM笔记（三）SpringSecurity基础","Spring的探索之路从这里开始",2023,"JavaSSM 基础部分","[\"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Kv4y1x7is\u002F\", \"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Lh4y1M7kx\u002F\", \"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1fV411M7aS\u002F\"]",{"cateId":81,"chapters":221,"desc":232,"id":223,"time":217,"title":233,"video":234},[222,226,229],{"bookId":223,"id":224,"indexOrder":13,"name":225},16,"0k66v5r6slsfuog4","SpringBoot笔记（一）核心内容",{"bookId":223,"id":227,"indexOrder":13,"name":228},"bqlrnc2yvkaxo8s1","SpringBoot笔记（二）数据交互",{"bookId":223,"id":230,"indexOrder":13,"name":231},"wci9lb9tgea866jt","SpringBoot笔记（三）前后端分离","SpringBoot全新重制版","SpringBoot 新版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1xu4y1m7UP\u002F",{"cateId":81,"chapters":236,"desc":252,"id":238,"time":60,"title":253,"video":254},[237,240,243,246,249],{"bookId":238,"id":239,"indexOrder":13,"name":225},9,"e43gl1ilygps032v",{"bookId":238,"id":241,"indexOrder":13,"name":242},"emnmd8nzfdb3hr50","SpringBoot笔记（二）Git版本控制",{"bookId":238,"id":244,"indexOrder":13,"name":245},"jjlolj5igvttvyhv","SpringBoot笔记（三）Redis数据库",{"bookId":238,"id":247,"indexOrder":13,"name":248},"skgr4ivb5curdoux","SpringBoot笔记（四）其他框架介绍",{"bookId":238,"id":250,"indexOrder":13,"name":251},"le91fqhu4dqui1k4","SpringBoot笔记（五）Linux系统","逐步走向企业级开发","SpringBoot 旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1UL411V7f3\u002F",{"cateId":81,"chapters":256,"desc":270,"id":258,"time":60,"title":271,"video":272},[257,261,264,267],{"bookId":258,"id":259,"indexOrder":13,"name":260},10,"oejzo0l77zeb6a7e","SpringCloud笔记（一）微服务基础",{"bookId":258,"id":262,"indexOrder":13,"name":263},"f6eya9taaelsl35p","SpringCloud笔记（二）微服务进阶",{"bookId":258,"id":265,"indexOrder":13,"name":266},"35v1hbsfcdgagdnw","SpringCloud笔记（三）微服务应用",{"bookId":258,"id":268,"indexOrder":13,"name":269},"a782u84512tyuo1m","SpringCloud笔记（四）消息队列","体验微服务架构带来的魅力","SpringCloud 进阶","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1AL4y1j7RY\u002F",{"cateId":81,"chapters":274,"desc":285,"id":276,"time":142,"title":286,"video":287},[275,278,280,282],{"bookId":276,"id":277,"indexOrder":13,"name":209},11,"efjw75u8a251qxk5",{"bookId":276,"id":279,"indexOrder":13,"name":212},"guc134xb7sl78vju",{"bookId":276,"id":281,"indexOrder":13,"name":215},"u8ekxxucowr2b1tm",{"bookId":276,"id":283,"indexOrder":13,"name":284},"vkpmw9wbej21nei6","SSM笔记（四）MySQL进阶","此教程为2021年旧版教程","JavaSSM 旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1xL4y1H7Tq\u002F","包含Spring全套框架笔记，从开始到Spring Boot，以及众多运维小知识。","https:\u002F\u002Fpic4.zhimg.com\u002F80\u002Fv2-28c3144421220d7c048703281bc34f63_1440w.webp","Spring 系列笔记 🍏",{"books":292,"desc":329,"id":96,"image":330,"title":331},[293,308],{"cateId":96,"chapters":294,"desc":305,"id":296,"time":60,"title":306,"video":307},[295,299,302],{"bookId":296,"id":297,"indexOrder":13,"name":298},12,"jd3e8u5cmvx5gco6","C语言（一）计算机思维导论",{"bookId":296,"id":300,"indexOrder":13,"name":301},"lqv77apvx82nkkio","C语言（二）基础语法",{"bookId":296,"id":303,"indexOrder":13,"name":304},"xb0b9t37gyv96xns","C语言（三）高级特性","包含高等院校需要教授的全部内容","C语言程序设计","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Cr4y137os\u002F",{"cateId":96,"chapters":309,"desc":326,"id":311,"time":60,"title":327,"video":328},[310,314,317,320,323],{"bookId":311,"id":312,"indexOrder":13,"name":313},13,"8a046ps2e4w6k4py","数据结构与算法（一）线性结构篇",{"bookId":311,"id":315,"indexOrder":13,"name":316},"3ma8db91f9zrnkja","数据结构与算法（二）树形结构篇",{"bookId":311,"id":318,"indexOrder":13,"name":319},"0lsjm59k7cgu4tpr","数据结构与算法（三）散列表篇",{"bookId":311,"id":321,"indexOrder":13,"name":322},"0qzy7bogo0g2pusa","数据结构与算法（四）图结构篇",{"bookId":311,"id":324,"indexOrder":13,"name":325},"6gmcxcikcilyxblj","数据结构与算法（五）排序算法篇","虽然很难，但是它是考研必学科目","数据结构与算法","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV13W4y127Ey\u002F","你的内心一直有一个坚定的声音在告诉你，一定要考上一名研究生，向着未来前进吧！","https:\u002F\u002Fpic2.zhimg.com\u002F80\u002Fv2-ac128404efb29ce1c9d1ccc61024f1d1_1440w.webp","C语言 系列笔记 🥬",{"books":333,"desc":367,"id":108,"image":368,"title":369},[334,349,358],{"cateId":108,"chapters":335,"desc":346,"id":337,"time":163,"title":347,"video":348},[336,340,343],{"bookId":337,"id":338,"indexOrder":13,"name":339},17,"urw2e6gg1lprv65w","Kotlin（一）基础语法",{"bookId":337,"id":341,"indexOrder":13,"name":342},"t7lnl87f74f3v1ju","Kotlin（二）类与对象",{"bookId":337,"id":344,"indexOrder":13,"name":345},"v1zzvki0knb1xvml","Kotlin（三）高级特性","包含Kotlin语言完整基础部分","Kotlin程序设计基础","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1P94y1c7tV\u002F",{"cateId":108,"chapters":350,"desc":355,"id":352,"time":163,"title":356,"video":357},[351],{"bookId":352,"id":353,"indexOrder":13,"name":354},18,"ovbzpe7065bye1st","Kotlin扩展（一）","包含Kotlin额外扩展知识","Kotlin扩展篇","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Hg4y1m7Ca\u002F",{"cateId":108,"chapters":359,"desc":364,"id":361,"time":163,"title":365,"video":366},[360],{"bookId":361,"id":362,"indexOrder":13,"name":363},19,"3at7ybv04dmjc0wp","Gradle基础教程","Gradle配置教程（Kotlin）","Gradle教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Fc411x7xF\u002F","Kotlin让JVM平台焕发新的生机，让语言的表达更加优美","https:\u002F\u002Fpic2.zhimg.com\u002F80\u002Fv2-be815568f7c79c64cdaa171b0409786d_1440w.webp","Kotlin 系列笔记 ☘️",{"books":371,"desc":418,"id":120,"title":419},[372,391,403],{"cateId":120,"chapters":373,"desc":387,"id":375,"time":388,"title":389,"video":390},[374,378,381,384],{"bookId":375,"id":376,"indexOrder":13,"name":377},26,"zjf5qapwqtqiohcn","JavaScript笔记（一）基础语法",{"bookId":375,"id":379,"indexOrder":13,"name":380},"95jc6sjyjwcp9pvp","JavaScript笔记（二）核心知识",{"bookId":375,"id":382,"indexOrder":13,"name":383},"j35cdc1qz8dzq7pn","JavaScript笔记（三）进阶知识",{"bookId":375,"id":385,"indexOrder":13,"name":386},"sdhodlihphnpcg37","JavaScript笔记（四）前端基础","包含JavaScript最新语法规范讲解",2026,"JavaScript教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1xq6gBgESU",{"cateId":120,"chapters":392,"desc":400,"id":394,"time":37,"title":401,"video":402},[393,397],{"bookId":394,"id":395,"indexOrder":13,"name":396},23,"bsisgazdftiz3o9c","HTML5笔记（一）基础内容",{"bookId":394,"id":398,"indexOrder":13,"name":399},"njol93fs34gfwuzf","HTML5笔记（二）高级内容","包含HTML基础内容和相关知识点","HTML5核心教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1BrBiYNEWg",{"cateId":120,"chapters":404,"desc":415,"id":406,"time":37,"title":416,"video":417},[405,409,412],{"bookId":406,"id":407,"indexOrder":13,"name":408},25,"jo74ciirtg8wh90y","CSS笔记（一）基础入门",{"bookId":406,"id":410,"indexOrder":13,"name":411},"ap5ixyomoejuw4ue","CSS笔记（二）盒模型和布局",{"bookId":406,"id":413,"indexOrder":13,"name":414},"4djgk5xy1lzpiuf2","CSS笔记（三）变换和过渡","包含CSS3基础内容和相关知识点","CSS3核心教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1sQeEzFEKi","包含Web前端学习路径全部教程笔记，打下坚实的基础","Web前端 系列笔记",{"books":421,"desc":458,"id":423,"image":368,"title":459},[422,432,450],{"cateId":423,"chapters":424,"desc":429,"id":426,"time":163,"title":430,"video":431},100,[425],{"bookId":426,"id":427,"indexOrder":13,"name":428},20,"o0ab271mkdsas87","Markdown基础语法","编写简洁而又优美的文档","Markdown教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1eJ4m157kC",{"cateId":423,"chapters":433,"desc":447,"id":435,"time":60,"title":448,"video":449},[434,438,441,444],{"bookId":435,"id":436,"indexOrder":13,"name":437},14,"6386mh7anqt4tzyv","设计模式（一）面向对象设计原则",{"bookId":435,"id":439,"indexOrder":13,"name":440},"8ftkb38wfn6ox0ug","设计模式（二）创建型",{"bookId":435,"id":442,"indexOrder":13,"name":443},"i1msql1k8y70etey","设计模式（三）结构型",{"bookId":435,"id":445,"indexOrder":13,"name":446},"5434a3cyyjvwhs8s","设计模式（四）行为型","使你的编码水平得到质的飞跃","设计模式系列","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1u3411P7Na\u002F",{"cateId":423,"chapters":451,"desc":456,"id":453,"time":60,"title":457},[452],{"bookId":453,"id":454,"indexOrder":13,"name":455},15,"zj9uvg0sp3b0sok8","Docker 容器技术 笔记","这里包含其他中间件课程笔记","其他中间件笔记","我们对知识的探索从未停止，只有不断地学习，才能走向美好的未来！","其他笔记分类 🌽",200,true,{"data":463,"status":460,"success":461},{"bookId":153,"content":464,"id":160,"indexOrder":81,"introduction":465,"lastUpdate":466,"name":161},"![image-20241119113250984](https:\u002F\u002Fs2.loli.net\u002F2024\u002F11\u002F19\u002FrgjRD8vHEao7bJQ.png)\n\n# Maven快速上手\n\n**注意：** 开始之前，看看你C盘空间够不够，最好预留20GB空间以上！\n\n**吐槽：** 很多电脑预装系统C盘都给得巨少，就算不装软件，一些软件的缓存文件也能给你塞满，建议有时间重装一下系统重新分配一下磁盘空间。\n\nMaven 翻译为\"专家\"、\"内行\"，是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型（缩写：POM）概念，Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven 是一个项目管理工具，可以对 Java 项目进行构建、依赖管理。Maven 也可被用于构建和管理各种项目，例如 C#，Ruby，Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目，现为由 Apache 软件基金会主持的独立 Apache 项目。\n\n通过Maven，可以帮助我们做：\n\n- 项目的自动构建，包括代码的编译、测试、打包、安装、部署等操作。\n- 依赖管理，项目使用到哪些依赖，可以快速完成导入，不需要手动导入jar包。\n\nMaven也需要安装环境，但是IDEA已经自带了Maven环境，因此我们不需要再去进行额外的环境安装（无IDEA也能使用Maven，但是配置过程很麻烦，并且我们现在使用的都是IDEA的集成开发环境，所以这里就不讲解Maven命令行操作了）我们直接创建一个新的Maven项目即可。\n\n### Maven项目结构\n\n我们之前使用的都是最原始的Java项目目录格式，其中`src`目录直接包含我们的包以及对应的代码：\n\n![image-20241118220530127](https:\u002F\u002Fs2.loli.net\u002F2024\u002F11\u002F18\u002FEaOJqQ9DdxM5lNG.png)\n\n这是IDEA为我们提供的一种非常高效简洁的项目目录格式，虽然它用起来非常的简单方便，但是在管理依赖上，确实比较麻烦，我们得手动将我们需要的依赖以jar包的形式导入，光寻找这些jar包就得花费很多时间，并且不同的jar包还会依赖更多jar包，就像下崽一样，所以对于大型项目来说，这并不是一个很好的使用方式。\n\n而Maven就很好地解决了这个问题，我们可以先来看一下，一个Maven项目和我们普通的项目有什么区别：\n\n![img](https:\u002F\u002Fs2.loli.net\u002F2024\u002F08\u002F28\u002FiVXseYS6kcAzCnp.jpg)\n\n其中src目录下存放我们的源代码和测试代码，分别位于main和test目录下，而test和main目录下又具有java、resources目录，它们分别用于存放Java源代码、静态资源（如配置文件、图片等）、很多JavaWeb项目可能还会用到webapp目录。\n\n而下面的pom.xml则是Maven的核心配置，也是整个项目的所有依赖、插件、以及各种配置的集合，它也是使用XML格式编写的，一个标准的pom配置长这样：\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cproject xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n         xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0 http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n\n    \u003CgroupId>cn.itbaima\u003C\u002FgroupId>\n    \u003CartifactId>BookManage\u003C\u002FartifactId>\n    \u003Cversion>1.0\u003C\u002Fversion>\n\n    \u003Cproperties>\n        \u003Cmaven.compiler.source>17\u003C\u002Fmaven.compiler.source>\n        \u003Cmaven.compiler.target>17\u003C\u002Fmaven.compiler.target>\n        \u003Cproject.build.sourceEncoding>UTF-8\u003C\u002Fproject.build.sourceEncoding>\n    \u003C\u002Fproperties>\n\n\u003C\u002Fproject>\n```\n\n我们可以看到，Maven的配置文件是以`project`为根节点，而`modelVersion`定义了当前模型的版本，一般是4.0.0，我们不用去修改。\n\n`groupId`、`artifactId`、`version`这三个元素合在一起，用于唯一区别每个项目，别人如果需要将我们编写的代码作为依赖，那么就必须通过这三个元素来定位我们的项目，我们称为一个项目的基本坐标，所有的项目一般都有自己的Maven坐标，因此我们通过Maven导入其他的依赖只需要填写这三个基本元素就可以了，无需再下载Jar文件，而是Maven自动帮助我们下载依赖并导入：\n\n* `groupId` 一般用于指定组名称，命名规则一般和包名一致，比如我们这里使用的是`org.example`，一个组下面可以有很多个项目。\n* `artifactId` 一般用于指定项目在当前组中的唯一名称，也就是说在组中用于区分于其他项目的标记。\n* `version` 代表项目版本，随着我们项目的开发和改进，版本号也会不断更新，就像LOL一样，每次赛季更新都会有一个大版本更新，我们的Maven项目也是这样，我们可以手动指定当前项目的版本号，其他人使用我们的项目作为依赖时，也可以根本版本号进行选择（这里的SNAPSHOT代表快照，一般表示这是一个处于开发中的项目，正式发布项目一般只带版本号）\n\n`properties`中一般都是一些变量和选项的配置，我们这里指定了JDK的源代码和编译版本为17，同时下面的源代码编码格式为UTF-8，无需进行修改。\n\n### Maven依赖导入\n\n现在我们尝试使用Maven来帮助我们快速导入依赖，我们需要导入之前的JDBC驱动依赖、JUnit依赖、Mybatis依赖、Lombok依赖，那么如何使用Maven来管理依赖呢？\n\n我们可以创建一个`dependencies`节点：\n\n```xml\n\u003Cdependencies>\n    \u002F\u002F里面填写的就是所有的依赖\n\u003C\u002Fdependencies>\n```\n\n那么现在就可以向节点中填写依赖了，那么我们如何知道每个依赖的坐标呢？我们可以在：https:\u002F\u002Fcentral.sonatype.com 进行查询，我们直接搜索Lombok即可，打开后可以看到已经给我们写出了依赖的坐标：\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>org.projectlombok\u003C\u002FgroupId>\n    \u003CartifactId>lombok\u003C\u002FartifactId>\n    \u003Cversion>1.18.36\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n我们直接将其添加到`dependencies`节点中即可，现在我们来编写一个测试用例看看依赖导入成功了没有：\n\n```java\npublic class Main {\n    public static void main(String[] args) {\n        Student student = new Student(\"小明\", 18);\n        System.out.println(student);\n    }\n}\n```\n\n```java\n@Data\n@AllArgsConstructor\npublic class Student {\n    String name;\n    int age;\n}\n```\n\n项目运行成功，表示成功导入了依赖。那么，Maven是如何进行依赖管理呢，以致于如此便捷的导入依赖，我们来看看Maven项目的依赖管理流程：\n\n![img](https:\u002F\u002Fs2.loli.net\u002F2024\u002F11\u002F19\u002F5s2HWYlJgSCOp1q.jpg)\n\n通过流程图我们得知，一个项目依赖一般是存储在中央仓库中，也有可能存储在一些其他的远程仓库（可以自行搭建私服）几乎所有的依赖都被放到了中央仓库中，因此，Maven可以直接从中央仓库中下载大部分的依赖（因此Maven第一次导入依赖是需要联网的，否则无法下载）远程仓库中下载之后 ，会暂时存储在本地仓库，我们会发现我们本地存在一个`.m2`文件夹，这就是Maven本地仓库文件夹，默认建立在C盘，如果你C盘空间不足，会出现问题。\n\n在下次导入依赖时，如果Maven发现本地仓库中就已经存在某个依赖，那么就不会再去远程仓库下载了。\n\n**注意：** 因为中心仓库服务器位于国外，下载速度缓慢，可能在导入依赖时会出现卡顿等问题，我们需要使用国内的镜像仓库服务器来加速访问（镜像仓库与中心仓库自动同步所有依赖，访问速度更快）有两种方式配置：\n\n1. 可以配置IDEA自带的Maven插件远程仓库镜像地址，我们打开IDEA的安装目录，找到`安装根目录\u002Fplugins\u002Fmaven\u002Flib\u002Fmaven3\u002Fconf`文件夹，找到`settings.xml`文件，打开编辑，找到mirros标签，添加以下内容：\n\n   ```xml\n   \u003Cmirror>\n     \u003Cid>aliyunmaven\u003C\u002Fid>\n     \u003CmirrorOf>central\u003C\u002FmirrorOf>\n     \u003Cname>阿里云公共仓库\u003C\u002Fname>\n     \u003Curl>https:\u002F\u002Fmaven.aliyun.com\u002Frepository\u002Fpublic\u003C\u002Furl>\n   \u003C\u002Fmirror>\n   ```\n\n2. 自行前往Maven官网并下载最新版的Maven安装，然后将IDEA的Maven配置为我们自行安装的位置（好处是IDEA更新后不需要重新配置）可以一直使用，镜像配置方式同第1步。\n\n这样，我们就将默认的远程仓库地址（国外），配置为国内的阿里云仓库地址了（依赖的下载速度就会快起来了）\n\n### Maven依赖作用域\n\n除了三个基本的属性用于定位坐标外，依赖还可以添加以下属性：\n\n- **type**：依赖的类型，对于项目坐标定义的packaging。大部分情况下，该元素不必声明，其默认值为jar\n- **scope**：依赖的范围（作用域，着重讲解）\n- **optional**：标记依赖是否可选\n- **exclusions**：用来排除传递性依赖（一个项目有可能依赖于其他项目，就像我们的项目，如果别人要用我们的项目作为依赖，那么就需要一起下载我们项目的依赖，如Lombok）\n\n我们着重来讲解一下`scope`属性，它决定了依赖的作用域范围：\n\n- **compile** ：默认的依赖有效范围，如果在定义依赖关系的时候，没有明确指定依赖有效范围的话，则默认采用该依赖有效范围，此范围表示在编译、运行、测试时均有效。\n- **provided** ：仅在编译、测试时有效，但是在运行时无效，也就是说，项目在运行时，不需要此依赖，比如我们上面的Lombok，我们只需要在编译阶段使用它，编译完成后，实际上已经转换为对应的代码了，因此Lombok不需要在项目运行时也存在。\n- **runtime** ：在运行、测试时有效，但是在编译代码时无效。比如JDBC驱动就是典型的只需要运行时使用，因为JDBC驱动由数据库厂商开发，我们使用的始终是JDK中提供的接口，不需要直接使用特定驱动中的类或是方法，因此只需在运行时包含即可。\n- **test** ：只在测试时有效，例如：JUnit框架，我们一般只会在测试阶段使用JUnit，而实际项目运行时，我们就用不到测试了，所以这个选项非常适合测试相关的框架。\n\n这里我们来测试一下JUnit，我们可以在网站上搜索JUnit的依赖，我们这里导入最新的JUnit5作为依赖：\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>org.junit.jupiter\u003C\u002FgroupId>\n    \u003CartifactId>junit-jupiter\u003C\u002FartifactId>\n    \u003Cversion>5.8.1\u003C\u002Fversion>\n    \u003Cscope>test\u003C\u002Fscope>\n\u003C\u002Fdependency>\n```\n\n我们所有的测试用例全部编写到Maven项目给我们划分的test目录下，位于此目录下的内容不会在最后被打包到项目中，只用作开发阶段测试使用：\n\n```java\npublic class MainTest {\n\n    @Test\n    public void test(){\n        System.out.println(\"测试\");\n      \t\u002F\u002FAssert在JUnit5时名称发生了变化Assertions\n        Assertions.assertArrayEquals(new int[]{1, 2, 3}, new int[]{1, 2});\n    }\n}\n```\n\n因此，一般仅用作测试的依赖如JUnit只保留在测试中即可，那么现在我们再来添加JDBC和Mybatis的依赖：\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>mysql\u003C\u002FgroupId>\n    \u003CartifactId>mysql-connector-java\u003C\u002FartifactId>\n    \u003Cversion>8.0.27\u003C\u002Fversion>\n\u003C\u002Fdependency>\n\u003Cdependency>\n    \u003CgroupId>org.mybatis\u003C\u002FgroupId>\n    \u003CartifactId>mybatis\u003C\u002FartifactId>\n    \u003Cversion>3.5.7\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n我们发现，Maven还给我们提供了一个`resource`目标，我们可以将一些静态资源，比如配置文件，放入到这个文件夹中，项目在打包时会将资源文件夹中文件一起打包的Jar中，比如我们在这里编写一个Mybatis的配置文件：\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n\u003C!DOCTYPE configuration\n        PUBLIC \"-\u002F\u002Fmybatis.org\u002F\u002FDTD Config 3.0\u002F\u002FEN\"\n        \"http:\u002F\u002Fmybatis.org\u002Fdtd\u002Fmybatis-3-config.dtd\">\n\u003Cconfiguration>\n    \u003Csettings>\n        \u003Csetting name=\"mapUnderscoreToCamelCase\" value=\"true\"\u002F>\n        \u003Csetting name=\"cacheEnabled\" value=\"true\"\u002F>\n        \u003Csetting name=\"logImpl\" value=\"JDK_LOGGING\" \u002F>\n    \u003C\u002Fsettings>\n    \u003C!-- 需要在environments的上方 -->\n    \u003CtypeAliases>\n        \u003Cpackage name=\"com.test.entity\"\u002F>\n    \u003C\u002FtypeAliases>\n    \u003Cenvironments default=\"development\">\n        \u003Cenvironment id=\"development\">\n            \u003CtransactionManager type=\"JDBC\"\u002F>\n            \u003CdataSource type=\"POOLED\">\n                \u003Cproperty name=\"driver\" value=\"com.mysql.cj.jdbc.Driver\"\u002F>\n                \u003Cproperty name=\"url\" value=\"jdbc:mysql:\u002F\u002Flocalhost:3306\u002Fweb_study\"\u002F>\n                \u003Cproperty name=\"username\" value=\"test\"\u002F>\n                \u003Cproperty name=\"password\" value=\"123456\"\u002F>\n            \u003C\u002FdataSource>\n        \u003C\u002Fenvironment>\n    \u003C\u002Fenvironments>\n    \u003Cmappers>\n        \u003Cmapper class=\"com.test.mapper.TestMapper\"\u002F>\n    \u003C\u002Fmappers>\n\u003C\u002Fconfiguration>\n```\n\n现在我们创建一下测试用例，顺便带大家回顾一下JUnit5的使用：\n\n```java\npublic class MainTest {\n\n    \u002F\u002F因为配置文件位于内部，我们需要使用Resources类的getResourceAsStream来获取内部的资源文件\n    private static SqlSessionFactory factory;\n\n    \u002F\u002F在JUnit5中@Before被废弃，它被细分了：\n    @BeforeAll \u002F\u002F 一次性开启所有测试案例只会执行一次 (方法必须是static)\n    \u002F\u002F @BeforeEach 一次性开启所有测试案例每个案例开始之前都会执行一次\n    @SneakyThrows\n    public static void before(){\n        factory = new SqlSessionFactoryBuilder()\n                .build(Resources.getResourceAsStream(\"mybatis.xml\"));\n    }\n\n\n    @DisplayName(\"Mybatis数据库测试\")  \u002F\u002F自定义测试名称\n    @RepeatedTest(3)  \u002F\u002F自动执行多次测试\n    public void test(){\n        try (SqlSession sqlSession = factory.openSession(true)){\n            TestMapper testMapper = sqlSession.getMapper(TestMapper.class);\n            System.out.println(testMapper.getStudentBySid(1));\n        }\n    }\n}\n```\n\n那么就有人提问了，如果我需要的依赖没有上传的远程仓库，而是只有一个Jar怎么办呢？我们可以使用第四种作用域：\n\n- **system**：作用域和provided是一样的，但是它不是从远程仓库获取，而是直接导入本地Jar包。\n\n```xml\n\u003Cdependency>\n     \u003CgroupId>javax.jntm\u003C\u002FgroupId>\n     \u003CartifactId>lbwnb\u003C\u002FartifactId>\n     \u003Cversion>2.0\u003C\u002Fversion>\n     \u003Cscope>system\u003C\u002Fscope>\n     \u003CsystemPath>C:\u002F\u002F学习资料\u002F4K高清无码\u002Ftest.jar\u003C\u002FsystemPath>\n\u003C\u002Fdependency>\n```\n\n比如上面的例子，如果scope为system，那么我们需要添加一个systemPath来指定jar文件的位置，这里就不再演示了。\n\n### Maven安装、可选和排除\n\n前面我们给大家介绍了依赖的导入方式和各种作用域，我们接着来看如何在其他项目中引入我们自己编写的Maven项目作为依赖使用。这里我们创建一个用于测试的简单项目：\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cproject xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n         xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0 http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n\n    \u003CgroupId>com.test\u003C\u002FgroupId>\n    \u003CartifactId>TestMaven\u003C\u002FartifactId>\n    \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n\n    ...\n\n\u003C\u002Fproject>\n```\n\n```java\npublic class TestUtils {\n    public static void test() {\n        System.out.println(\"抛开事实不谈，你们就没有一点错吗？\");\n    }\n}\n```\n\n接着我们点击右上角的Maven选项，然后执行`install`或直接在命令行中输入`mvn install`来安装我们自己的项目到本地Maven仓库中。\n\n接着我们就可以在需要使用此项目作为依赖的其他项目中使用它了，只需要填写和这边一样的坐标：\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.test\u003C\u002FgroupId>\n    \u003CartifactId>TestMaven\u003C\u002FartifactId>\n    \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n接着我们就可以在项目中直接使用了：\n\n```java\npublic static void main(String[] args) {\n    TestUtils.test();\n}\n```\n\n![image-20241119105655739](https:\u002F\u002Fs2.loli.net\u002F2024\u002F11\u002F19\u002Fvdz8KjP2JBHayok.png)\n\n注意，如果我们的旧项目中引入了一些其他的依赖，那么此依赖是会一起被传递的，比如这里我们添加了MyBatis的依赖到原项目中：\n\n```xml\n\u003Cdependencies>\n    \u003Cdependency>\n        \u003CgroupId>org.mybatis\u003C\u002FgroupId>\n        \u003CartifactId>mybatis\u003C\u002FartifactId>\n        \u003Cversion>3.5.16\u003C\u002Fversion>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n```\n\n此时在引入此项目的其他项目中，此依赖也被一起传递：\n\n![image-20241119110829917](https:\u002F\u002Fs2.loli.net\u002F2024\u002F11\u002F19\u002Fb723DJzNVAjCYE1.png)\n\n也就是说，当我们的项目依赖于其他内容时，为了保证完整性，默认情况下会一并引入所有此项目包含的依赖项。\n\n在某些情况下，可能我们并不希望某些依赖直接被项目连带引入，因此，当项目中的某些依赖不希望被使用此项目作为依赖的项目使用时，我们可以给依赖添加`optional`标签表示此依赖是可选的，默认在导入依赖时，不会导入可选的依赖：\n\n```xml\n\u003Coptional>true\u003C\u002Foptional>\n```\n\n比如Mybatis的POM文件中，就存在大量的可选依赖：\n\n```xml\n\u003Cdependency>\n  \u003CgroupId>org.slf4j\u003C\u002FgroupId>\n  \u003CartifactId>slf4j-api\u003C\u002FartifactId>\n  \u003Cversion>1.7.30\u003C\u002Fversion>\n  \u003Coptional>true\u003C\u002Foptional>\n\u003C\u002Fdependency>\n\u003Cdependency>\n  \u003CgroupId>org.slf4j\u003C\u002FgroupId>\n  \u003CartifactId>slf4j-log4j12\u003C\u002FartifactId>\n  \u003Cversion>1.7.30\u003C\u002Fversion>\n  \u003Coptional>true\u003C\u002Foptional>\n\u003C\u002Fdependency>\n\u003Cdependency>\n  \u003CgroupId>log4j\u003C\u002FgroupId>\n  \u003CartifactId>log4j\u003C\u002FartifactId>\n  \u003Cversion>1.2.17\u003C\u002Fversion>\n  \u003Coptional>true\u003C\u002Foptional>\n\u003C\u002Fdependency>\n ...\n```\n\n由于Mybatis要支持多种类型的日志，需要用到很多种不同的日志框架，因此需要导入这些依赖来做兼容，但是我们项目中并不一定会使用这些日志框架作为Mybatis的日志打印器，因此这些日志框架仅Mybatis内部做兼容需要导入使用，而我们可以选择不使用这些框架或是选择其中一个即可，也就是说我们导入Mybatis之后想用什么日志框架再自己加就可以了。\n\n现在我们可以让使用此项目作为依赖的项目不使用可选依赖，但是如果别人的项目中没有将我们不希望的依赖作为可选依赖，这就导致我们还是会连带引入这些依赖，这个时候我们就可以通过排除依赖来防止添加不必要的依赖，只需添加`exclusion`标签即可：\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.test\u003C\u002FgroupId>\n    \u003CartifactId>TestMaven\u003C\u002FartifactId>\n    \u003Cversion>1.1-SNAPSHOT\u003C\u002Fversion>\n    \u003Cexclusions>\n        \u003Cexclusion>\n            \u003CgroupId>org.mybatis\u003C\u002FgroupId>\n            \u003CartifactId>mybatis\u003C\u002FartifactId>\n          \t\u003C!--  可以不指定版本号，只需要组名和项目名称  -->\n        \u003C\u002Fexclusion>\n    \u003C\u002Fexclusions>\n\u003C\u002Fdependency>\n```\n\n此时我们通过这种方式手动排除了Test项目中包含的MyBatis依赖，这样项目中就不会包含此依赖了。\n\n### Maven继承和多模块\n\n一个Maven项目可以继承自另一个Maven项目，比如多个子项目都需要父项目的依赖，我们就可以使用继承关系来快速配置。在我们学习到SpringBoot或是SpringCloud开发时，很多项目往往都会采用这种多模块子项目的形式的去编写，来更加合理地对项目中代码进行职责划分。\n\n要创建一个子项目非常简单，我们只需右键左侧栏，新建模块，来创建一个子项目：\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cproject xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n         xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0 http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n    \u003Cparent>\n        \u003CartifactId>MavenTest\u003C\u002FartifactId>\n        \u003CgroupId>org.example\u003C\u002FgroupId>\n        \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n    \u003C\u002Fparent>\n    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n\n    \u003CartifactId>ChildModel\u003C\u002FartifactId>\n\n    \u003Cproperties>\n        \u003Cmaven.compiler.source>17\u003C\u002Fmaven.compiler.source>\n        \u003Cmaven.compiler.target>17\u003C\u002Fmaven.compiler.target>\n    \u003C\u002Fproperties>\n\n\u003C\u002Fproject>\n```\n\n我们可以看到，IDEA默认给我们添加了一个parent节点，表示此Maven项目是父Maven项目的子项目，子项目直接继承父项目的`groupId`，子项目会继承父项目的所有依赖，我们来编写一个测试用例尝试一下:\n\n```java\nimport lombok.extern.java.Log;\n\n@Log\npublic class Main {\n    public static void main(String[] args) {\n        log.info(\"我是日志信息\");\n    }\n}\n```\n\n可以看到，子项目也成功继承了Lombok依赖。\n\n我们还可以让父Maven项目统一管理所有的依赖，包括版本号等，子项目可以选取需要的作为依赖，而版本全由父项目管理，我们可以将`dependencies`全部放入`dependencyManagement`节点，这样父项目就完全作为依赖统一管理。\n\n```xml\n\u003CdependencyManagement>\n    \u003Cdependencies>\n        \u003Cdependency>\n            \u003CgroupId>org.projectlombok\u003C\u002FgroupId>\n            \u003CartifactId>lombok\u003C\u002FartifactId>\n            \u003Cversion>1.18.22\u003C\u002Fversion>\n            \u003Cscope>provided\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>org.junit.jupiter\u003C\u002FgroupId>\n            \u003CartifactId>junit-jupiter\u003C\u002FartifactId>\n            \u003Cversion>5.8.1\u003C\u002Fversion>\n            \u003Cscope>test\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>mysql\u003C\u002FgroupId>\n            \u003CartifactId>mysql-connector-java\u003C\u002FartifactId>\n            \u003Cversion>8.0.27\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>org.mybatis\u003C\u002FgroupId>\n            \u003CartifactId>mybatis\u003C\u002FartifactId>\n            \u003Cversion>3.5.7\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n    \u003C\u002Fdependencies>\n\u003C\u002FdependencyManagement>\n```\n\n我们发现，子项目的依赖失效了，因为现在父项目没有依赖，而是将所有的依赖进行集中管理，子项目需要什么再拿什么即可，同时子项目无需指定版本，所有的版本全部由父项目决定，子项目只需要使用即可：\n\n```xml\n\u003Cdependencies>\n    \u003Cdependency>\n        \u003CgroupId>org.projectlombok\u003C\u002FgroupId>\n        \u003CartifactId>lombok\u003C\u002FartifactId>\n        \u003Cscope>provided\u003C\u002Fscope>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n```\n\n当然，父项目如果还存在dependencies节点的话，里面的内依赖依然是直接继承：\n\n```xml\n\u003Cdependencies>\n    \u003Cdependency>\n        \u003CgroupId>org.junit.jupiter\u003C\u002FgroupId>\n        \u003CartifactId>junit-jupiter\u003C\u002FartifactId>\n        \u003Cversion>5.8.1\u003C\u002Fversion>\n        \u003Cscope>test\u003C\u002Fscope>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n\n\u003CdependencyManagement>\n    \u003Cdependencies>\n      ...\n```\n\n### Maven测试和打包\n\n我们可以看到在IDEA右上角Maven板块中，每个Maven项目都有一个生命周期，实际上这些是Maven的一些插件，每个插件都有各自的功能，比如：\n\n- `clean`命令，执行后会清理整个`target`文件夹，在之后编写Springboot项目时可以解决一些缓存没更新的问题。\n- `validate`命令可以验证项目的可用性。\n- `compile`命令可以将项目编译为.class文件。\n- `install`命令可以将当前项目安装到本地仓库，以供其他项目导入作为依赖使用\n- `verify`命令可以按顺序执行每个默认生命周期阶段（`validate`，`compile`，`package`等）\n\n比如`clean`命令会自动清理`target`目录下的所有内容：\n\n![image-20241119113903101](https:\u002F\u002Fs2.loli.net\u002F2024\u002F11\u002F19\u002FdH8mpF3CQ2Yf69k.png)\n\n所有的命令在执行完成之后都会显示BUILD SUCCESS，否则就是在执行过程中出现了什么错误。\n\n除了上述介绍的几种命令外，我们还可以通过使用`test`命令，一键测试所有位于test目录下的测试案例，但是请注意默认的`test`命令有以下要求：\n\n- 测试类的名称必须是以`Test`结尾，比如`MainTest`\n- 测试方法上必须标注`@Test`注解或是其他标记JUnit测试案例的注解\n\n```java\npublic class MainTest {\n\n    @Test\n    public void test() {\n        System.out.println(\"我是测试\");\n    }\n}\n```\n\n![image-20241119161523176](https:\u002F\u002Fs2.loli.net\u002F2024\u002F11\u002F19\u002FF9McUmyIqoVZX1T.png)\n\n我们接着来看`package`命令，它用于将我们的项目打包为jar文件，以供其他项目作为依赖引入，或是作为一个可执行的Java应用程序运行。\n\n我们可以直接点击`package`来进行打包操作。注意，在使用`package`命令打包之前也会自动执行一次`test`命令，来保证项目能够正常运行，当测试出现问题时，打包将无法完成，我们也可以手动跳过，选择`执行Maven目标`来手动执行Maven命令，输入`mvn package -Dmaven.test.skip=true `来以跳过测试的方式进行打包。\n\n![image-20241119162039936](https:\u002F\u002Fs2.loli.net\u002F2024\u002F11\u002F19\u002FHca5MzbeWtNkFU6.png)\n\n接着在target目录下会出现我们打包完成的jar包，在JavaSE中我们就给大家介绍过，一个jar包实际上就是对我们生成的字节码文件进行的压缩打包，因此，我们也可以使用常见的压缩工具打开jar包查看其内部文件。\n\n![image-20241119162344760](https:\u002F\u002Fs2.loli.net\u002F2024\u002F11\u002F19\u002FWdgNQJArRwfxpyY.png)\n\n此时jar包中已经包含了我们项目中编写的类了，可以直接被其他项目导入使用。\n\n当然，以上方式存在一定的问题，比如这里并没有包含项目中用到的一些其他依赖，如果我们需要打包一个可执行文件，那么我不仅需要将自己编写的类打包到Jar中，同时还需要将依赖也一并打包到Jar中，因为我们使用了别人为我们提供的框架，自然也需要运行别人的代码，我们需要使用另一个插件来实现一起打包：\n\n```xml\n\u003Cplugin>\n    \u003CartifactId>maven-assembly-plugin\u003C\u002FartifactId>\n    \u003Cversion>3.1.0\u003C\u002Fversion>\n    \u003Cconfiguration>\n        \u003CdescriptorRefs>\n            \u003CdescriptorRef>jar-with-dependencies\u003C\u002FdescriptorRef>\n        \u003C\u002FdescriptorRefs>\n        \u003Carchive>\n            \u003Cmanifest>\n                \u003CaddClasspath>true\u003C\u002FaddClasspath>\n                \u003CmainClass>com.test.Main\u003C\u002FmainClass>\n            \u003C\u002Fmanifest>\n        \u003C\u002Farchive>\n    \u003C\u002Fconfiguration>\n    \u003Cexecutions>\n        \u003Cexecution>\n            \u003Cid>make-assembly\u003C\u002Fid>\n            \u003Cphase>package\u003C\u002Fphase>\n            \u003Cgoals>\n                \u003Cgoal>single\u003C\u002Fgoal>\n            \u003C\u002Fgoals>\n        \u003C\u002Fexecution>\n    \u003C\u002Fexecutions>\n\u003C\u002Fplugin>\n```\n\n导入插件后，我们可以重新进行一次打包任务，等待打包完成即可得到我们的Jar文件，此时会出现两个文件，其中一个是之前的正常打包得到的jar文件，还有一个就是包含了所有依赖以及配置了主类的jar文件。\n\n我们只需要执行`java -jar`命令即可运行打包好的Java程序：\n\n![image-20241119162858366](https:\u002F\u002Fs2.loli.net\u002F2024\u002F11\u002F19\u002FhxT1lJDQgBGOSHf.png)\n\n我们之前还讲解了多模块项目，那么多模块下父项目存在一个`packing`打包类型标签，所有的父级项目的`packing`都为`pom`，`packing`默认是`jar`类型，如果不作配置，maven会将该项目打成jar包：\n\n```xml\n\u003Cpackaging>pom\u003C\u002Fpackaging>\n```\n\n作为父级项目，还有一个重要的属性，那就是modules，通过modules标签将项目的所有子项目引用进来，在`build`父级项目时，会根据子模块的相互依赖关系整理一个`build`顺序，然后依次`build`直到所有任务都完成。\n\n","Maven 翻译为\"专家\"、\"内行\"，是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型（缩写：POM）概念，Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven 是一个项目管理工具，可以对 Java 项目进行构建、依赖管理。Maven 也可被用于构建和管理各种项目，例如 C#，Ruby，Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目，现为由 Apache 软件基金会主持的独立 Apache 项目。","2025-07-04 23:41:21",{"data":468,"status":460,"success":461},[469,474],{"id":8,"image":470,"link":471,"name":472,"type":473},"\u002Fimage\u002Fadv\u002Frainyun-2025-06.webp","https:\u002F\u002Fwww.rainyun.com\u002Fitbaima_","雨云优惠购","cloud",{"id":66,"image":475,"link":476,"name":477,"type":478},"\u002Fimage\u002Fadv\u002Fsimcard-2025-11.webp","https:\u002F\u002Fmall.itbaima.cn","号卡优惠","simcard"]