学习Maven这一篇就够了 ╰+哭是因爲堅強的太久メ 2022-12-28 05:28 707阅读 0赞 ### 目录 ### * 第一章 Maven简介 * * 1.1、Maven概述 * 1.2、Maven特点 * 1.3、Maven官网 * 1.4、Maven下载 * 1.5、Maven安装 * 1.6、Maven环境配置 * 1.7、Maven测试安装 * 第二章 Maven项目结构 * * 2.1、标准结构 * 2.2、POM文件 * 第三章 Maven依赖管理 * * 3.1、依赖导入 * 3.2、依赖原理 * 3.3、更换仓库 * 3.4、小结一下 * 3.5、内心疑问 * 3.6、依赖范围 * 3.7、依赖的传递性 * 3.8、依赖的排除 * 3.9、依赖的原则 * 3.10、依赖的继承 * 第四章 Maven常用命令 * * 4.1、清理项目 * 4.2、编译主程序 * 4.3、编译测试程序 * 4.4、执行主程序 * 4.5、执行测试 * 4.6、打包项目 * 4.7、安装项目 * 4.8、部署项目 * 4.9、生成站点 * 4.10、查看版本 * 4.11、依赖管理 * 4.12、创建项目 * 4.13、项目转化 * 4.14、配置清除 * 第五章 Maven生命周期 * 第六章 Maven插件管理 * * 6.1、插件概述 * 6.2、插件配置 * 6.3、常用插件 * * 6.3.1、通用型插件 * 6.3.2、web型插件 * 第七章 Maven变量信息 * * 7.1、内置变量 * 7.2、自定义变量 * 第八章 Maven集成环境 * * 8.1、Maven集成到Eclipse * * 8.1.1、如何集成Maven * 8.1.2、创建Java项目 * 8.1.3、创建JavaWeb项目 * 8.2、Maven集成到Idea * * 8.2.1、如何集成Maven * 8.2.2、创建Java项目 * 8.2.3、创建JavaWeb项目 * 第九章 Maven模块化开发 * * 9.1、概述 * 9.2、Eclipse中演示 * * 9.2.1、创建父项目 * 9.2.2、创建子项目 * 9.3、Idea中演示 * * 9.3.1、创建父项目 * 9.3.2、创建子项目 * 第十章 Maven私服搭建 * * 10.1、nexus3介绍 * 10.2、nexus3搭建 * 10.3、create仓库 * 10.4、maven配置 * 10.5、project配置 * 10.6、发布项目到私服 * 10.7、安装依赖到私服 * 10.8、安装依赖到本地 -------------------- **配套资料,免费下载** 链接:https://pan.baidu.com/s/1NaTqauHB\_cPfL5C6Zo5zFQ 提取码:2m96 复制这段内容后打开百度网盘手机App,操作更方便哦 # 第一章 Maven简介 # ## 1.1、Maven概述 ## Maven 是一个软件项目管理工具,可以对 Java 项目进行全自动构建,管理项目所需要的依赖。 Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。 ## 1.2、Maven特点 ## * 遵循最佳实践的简单项目设置,数秒内即可启动新项目或模块 * 在所有项目中使用一致,意味着新开发人员无需花费更多时间来参与项目 * 出色的依赖项管理,包括自动更新,依赖项关闭(也称为传递依赖项) * 能够轻松同时处理多个项目 * 开箱即用的庞大且不断增长的依赖库,并与最大的开源项目进行了安排,以实时提供其最新版本 * 可扩展,能够轻松用 Java 或脚本语言编写插件 * 几乎无需额外配置即可立即访问新功能 * 用于Maven之外的依赖项管理和部署的Ant任务 * 基于模型的构建,Maven能够将任何数量的项目构建为预定义的输出类型,例如JAR,WAR * 无需太多额外配置,Maven将与您的源代码控制系统(例如Git)集成,并基于特定标签管理项目的发布 ## 1.3、Maven官网 ## Maven官方网址:https://maven.apache.org/ Maven依赖搜索:https://mvnrepository.com/ ## 1.4、Maven下载 ## 下载地址:https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip ## 1.5、Maven安装 ## 下载完毕,右键解压,例如我解压完成以后的目录路径如下:`C:\DevTools\apache-maven-3.3.9` ![image-20201213195557379][] > 注意,使用3.x版本的Maven建议Java的JDK版本应该是1.7+,我这里使用的是JDK1.8 ## 1.6、Maven环境配置 ## **新建一个系统环境变量:** * 变量名:MAVEN\_HOME * 变量值:C:\\DevTools\\apache-maven-3.3.9 **编辑Path系统环境变量:** * 新增行:%MAVEN\_HOME%\\bin ## 1.7、Maven测试安装 ## 按下 `windows键 + R键`,输入 `cmd` ,在弹出的命令行窗口中,输入 `mvn -v` 能够正确输出版本信息,则证明mvn安装成功。 ![image-20201213200131979][] # 第二章 Maven项目结构 # ## 2.1、标准结构 ## maven-demo(项目名称) |---------pom.xml(项目配置文件) |---------src |---------main(主程序目录) |---------java(主程序的Java源文件目录) |---------resources(主程序的资源文件目录) |---------test(测试程序目录) |---------java(测试程序的Java源文件目录) |---------resources(测试程序的资源文件目录) 接下来,我们就按照标准目录创建一个 `Maven工程` ,创建位置,你可以任意,但是我建议你创建在桌面上,因为我也是这样做的。 创建完标准结构以后,我们需要一些代码和配置,来帮助我们完成接下来的学习,在这里,你可以不理解这些代码和配置的含义。 这些代码和配置在这一章节不是重点,后边会讲,重点是标准结构长什么样子,这些代码和配置主要是为了学习接下来的 `Maven命令`。 找到 `pom.xml` 在里边写入以下配置: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- groupId一般为公司或者组织域名的反写 --> <groupId>com.caochenlei</groupId> <!-- artifactId一般为当前项目或者模块的名称 --> <artifactId>maven-demo</artifactId> <!-- version代表当前项目或者模块的版本号 --> <version>0.0.1-SNAPSHOT</version> </project> 以上仅仅演示了一个标准的maven工程应该长什么样子,具体的配置等内容会在后边讲解。 ## 2.2、POM文件 ## POM 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。 执行任务或目标时,Maven 会在当前目录中查找 POM,读取 POM,获取所需的配置信息,然后执行目标。 POM 中可以指定以下配置等等: * 项目配置 * 项目版本 * 依赖管理 * 插件管理 * 版本管理 * 构建设置 所有 POM 文件**一般**都需要 project 根元素和三个必需字段:groupId,artifactId,version。 <table> <thead> <tr> <th align="left">节点</th> <th align="left">描述</th> </tr> </thead> <tbody> <tr> <td align="left">project</td> <td align="left">工程的根标签。</td> </tr> <tr> <td align="left">modelVersion</td> <td align="left">模型版本需要设置为 4.0,这是必须的,而且不会更改。</td> </tr> <tr> <td align="left">groupId</td> <td align="left">这是工程组的标识。它在一个组织或者项目中通常是唯一的。<br>例如,一个百度项目 com.baidu.project-group 拥有所有的和百度相关的项目。</td> </tr> <tr> <td align="left">artifactId</td> <td align="left">这是工程的标识,它通常是工程的名称。<br>例如,百度搜索 baidu-search。</td> </tr> <tr> <td align="left">version</td> <td align="left">这是工程的版本号。</td> </tr> </tbody> </table> # 第三章 Maven依赖管理 # ## 3.1、依赖导入 ## 比如说,我们现在需要导入一个专门处理JSON字符串的依赖。 我们只需要知道,你所要导入的工具包的 `groupId` 、`artifactId` 、`version` 这三个标签的信息就可以了。 因为一个真正的项目中,依赖绝不止一个,所以在 `pom.xml` 就用了依赖的英文单词的复数形式来管理依赖信息,具体格式如下: <project> ... <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency> ... ... 可添加多个依赖 ... ... </dependencies> ... </project> ## 3.2、依赖原理 ## 为什么上边知道 `groupId` 、`artifactId` 、`version` 这三个信息 maven 就能自动管理这个依赖了,其实原理很简单。 如果你引入了依赖,maven 就会使用这个依赖的信息拼接字符串,到 maven 的中央仓库去寻找这个依赖,并把它下载下来。 默认下载是下载到了用户的根目录下,也就是 `~/.m2/repository` 这个目录中,我们也称这个目录为本地仓库。 maven 中央仓库的地址是: `https://repo.maven.apache.org/maven2/` maven 拼接字符串的格式:`仓库地址/{groupId}/{artifactId}/{version}/{artifactId}-{version}.jar` > 注意:groupId需要把所包含的所有**点**替换成**斜杠** 如果是导入上边的 `fastjson` ,那么这个依赖在maven中央仓库的地址也就是: `https://repo.maven.apache.org/maven2/com/alibaba/fastjson/1.2.75/fastjson-1.2.75.jar` 这个地址是一个网络地址,你可以把它复制到浏览器地址栏中,然后回车访问一下,这个依赖就能下载下来了。 也有可能你并不能访问,因为 maven 的中央仓库是在外网,在国内访问会很慢,甚至打不开等情况。 ## 3.3、更换仓库 ## 为了解决这些不稳定的情况,国内很多知名的大公司,比如:阿里,它们就自己创建了一个仓库,相当是把 maven 中央仓库里边所有的依赖全部拷到了他们自己的仓库中,并实时更新,同时,向国人也开放了这个仓库的地址,也就是 `阿里的maven库` 。 现在,maven 默认是从中央仓库去下载,我们想要改变它,就必须告诉他,说你不要去找中央仓库了,太慢了,你去阿里的maven库下载吧,既然要告诉他,我们就需要配置一下远程仓库地址。 找到解压后的maven目录,进入 `conf` 目录,找到 `settings` 文件,在里边找到 `mirrors` 节点,**替换**成以下信息: 例如我的是在: `C:\DevTools\apache-maven-3.3.9\conf\settings.xml` ,强烈建议使用 `VSCode` 编辑器打开,它会高亮文字。 <mirrors> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> </mirrors> 同时,因为 maven 默认使用的JDK编译版本为JDK1.5,显然也并不符合我们的要求。 我们需要重新指定版本,只需要找到 `profiles` 节点,**替换**成以下信息即可: <profiles> <profile> <id>jdk1.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> </profiles> 好了,现在仓库地址也更改了,那当他下载 `fastjson` 依赖的时候,下载地址就应该是: `http://maven.aliyun.com/nexus/content/groups/public/com/alibaba/fastjson/1.2.75/fastjson-1.2.75.jar` 为了验证,你也可以把这个地址粘贴到浏览器中,回车,看看它会不会下载。 在上边我们还提到了一个本地仓库,在本地仓库中,你要是想要找到这个依赖也是遵循 maven 的拼接字符串原则,那就成了以下: `C:/Users/CaoChenLei/.m2/repository/com/alibaba/fastjson/1.2.75/fastjson-1.2.75.jar` `C:/Users/{自己的用户名}/.m2/repository/` 代表的就是本地仓库的地址。 当然,现在的你可找不到这个文件甚至目录,因为,在上边我们只是讲解了依赖是怎么下载的。 但是现在,我们并没有导入依赖,也没有对maven项目(‘maven-demo’)进行任何操作。 他可不知道,你有这么一个依赖需要下载。 ## 3.4、小结一下 ## 到这里,简单梳理一下,本章节你学会了: * **maven项目如何导入依赖?** 在pom.xml中添加以下标签 <project> ... <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency> ... </dependencies> ... </project> * **maven是怎么下载依赖的?** 利用 `groupId` 、`artifactId` 、`version` 拼接字符串,然后访问下载 http://maven.aliyun.com/nexus/content/groups/public/com/alibaba/fastjson/1.2.75/fastjson-1.2.75.jar * **中央仓库:** maven官方的、最大的依赖(第三方开源项目、工具、框架、插件等等)存放仓库,但是,国内用户访问速度慢 * **阿里仓库:** 阿里仓库也称为远程仓库,它是中央仓库的一份实时拷贝,访问速度快,建议使用此仓库 * **本地仓库:** maven下载依赖后,用于存放依赖的地方,在项目的依赖管理中,首先去本地仓库中查找,本地仓库中有,则使用,没有,则下载,然后存放到本地仓库中,避免每一次都下载,浪费网络带宽 ## 3.5、内心疑问 ## 你怎么知道 `groupId` 、`artifactId` 、`version` 这三个标签的信息? 我们给大家一个网站: https://mvnrepository.com/ 现在访问,好像需要验证码,挺烦人的,我们就以 `fastjson` 为例,为大家进行演示。 ![image-20201213214729375][] ![image-20201213214802293][] ![image-20201213214819935][] ![image-20201213215013667][] ## 3.6、依赖范围 ## 一个依赖是有自己的作用范围的,一般主要有以下几种情况: * **compile范围依赖:** * 对主程序是否有效:有效 * 对测试程序是否有效:有效 * 是否参与打包:参与 * 是否参与部署:参与 * 典型例子:spring-core * **test范围依赖:** * 对主程序是否有效:无效 * 对测试程序是否有效:有效 * 是否参与打包:不参与 * 是否参与部署:不参与 * 典型例子:junit * **provided范围依赖:** * 对主程序是否有效:有效 * 对测试程序是否有效:有效 * 是否参与打包:不参与 * 是否参与部署:不参与 * 典型例子:servlet-api 如何设置一个依赖的作用范围,请参考: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> <!-- 设置依赖范围,主要可取值:compile、test、provided,默认不配就是compile --> <scope>compile</scope> </dependency> ## 3.7、依赖的传递性 ## 假设,现在有一个Hello项目,它导入了 `spring-core` 依赖,而开发 `spring-core` 需要依赖 `commons-logging` 依赖; 还存在另外一个项目 HelloFriend 他依赖了 Hello 项目,关系如图所示: ![image-20201213220839490][] 依赖的传递有什么好处? 可以传递的依赖不必在每个模块工程中都重复声明,在“最下面”的工程中依赖一次即可。 ## 3.8、依赖的排除 ## 假设,现在 `commons-logging` 这个依赖包是有问题的包,我不想继续使用了,该如何排除呢? ![image-20201213221123360][] 我们这里有一份参考代码,请您参考: 在 HelloFriend 工程的 pom.xml 文件的 dependencies 标签内写入以下代码 <dependency> <groupId>com.hello</groupId> <artifactId>hello</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 用来排除不想要的依赖包 --> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> ## 3.9、依赖的原则 ## 依赖的原则:它是为了解决工程模块之间的 jar 包冲突的问题的,我们无法设置,maven有默认的原则,我们需要了解。 * 原则一:路径最短者优先 ![image-20201213221849433][] * 原则二:验证路径相同时,先声明者优先 ![image-20201213221920897][] ## 3.10、依赖的继承 ## 由于非 compile 范围的依赖信息是不能在“依赖链”中传递的,所以有需要的工程只能单独配置。例如: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <scope>test</scope> </dependency> 此时如果项目需要将各个模块的junit版本统一为4.9,那么到各个工程中手动修改无疑是非常不可取的。 使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。 创建父工程和创建一般的 Java 工程操作一致,唯一需要注意的是:打包方式处要设置为 pom。 而在子工程中只需要引入父工程的工程坐标就可以了。 <parent> <!-- 父工程坐标 --> <groupId>...</groupId> <artifactId>Parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 指定从当前子工程的pom.xml文件出发,查找父工程的pom.xml的路径 --> <relativePath>../Parent/pom.xml</relativePath> </parent> 此时如果子工程的 groupId 和 version 和父工程重复则可以删除。 将 Parent 项目中的 dependencies 标签,用 dependencyManagement 标签括起来。 <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> 在子项目中重新指定需要的依赖,删除范围和版本号。 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies> # 第四章 Maven常用命令 # ## 4.1、清理项目 ## mvn clean ## 4.2、编译主程序 ## mvn compile ## 4.3、编译测试程序 ## mvn test-compile ## 4.4、执行主程序 ## 首先需要编译 Java工程:mvn compile 不存在参数的情况下运行:mvn exec:java -Dexec.mainClass="主程序入口类,不需要拓展名" 在存在参数的情况下运行:mvn exec:java -Dexec.mainClass="主程序入口类,不需要拓展名" -Dexec.args="arg0 arg1 arg2" ## 4.5、执行测试 ## mvn test ## 4.6、打包项目 ## **正常打包:** mvn package **跳过测试:** mvn package -Dmaven.test.skip=true ## 4.7、安装项目 ## **正常安装:** mvn install **跳过测试:** mvn install -Dmaven.test.skip=true ## 4.8、部署项目 ## **正常部署:** mvn deploy **跳过测试:** mvn deploy -Dmaven.test.skip=true ## 4.9、生成站点 ## mvn site ## 4.10、查看版本 ## mvn -v ## 4.11、依赖管理 ## **打印出已解决依赖的列表:** mvn dependency:resolve **打印出所有的依赖的列表:** mvn dependency:tree ## 4.12、创建项目 ## **创建Maven版本的Java项目:** #创建Maven版本的Java项目 mvn archetype:generate -DgroupId=packageName -DartifactId=appName -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false #编译此项目 mvn compile #执行此项目 mvn exec:java -Dexec.mainClass="packageName.App" **创建Maven版本的JavaWeb项目:** mvn archetype:generate -DgroupId=packageName -DartifactId=webappName -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false ## 4.13、项目转化 ## **将项目转化为Eclipse项目 :** mvn eclipse:eclipse **将项目转化为Idea项目 :** mvn idea:idea ## 4.14、配置清除 ## **清除所有Eclipse的工程配置文件:** mvn eclipse:clean **清除所有Idea的工程配置文件:** mvn idea:clean # 第五章 Maven生命周期 # > 注意:以下是一个简略版的生命周期,足够我们学习了。 * 清理:删除以前的编译结果,为重新编译做好准备。 * 编译:将 Java 源程序编译为字节码文件。 * 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性,在每次测试后以标准格式记录和展示测试结果。 * 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web 工程对应 war 包。 * 安装:在 Maven 环境下特指将打包的结果(jar 包或 war 包)安装到本地仓库中。 * 发布:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。 -------------------- ![image-20201214090710229][] -------------------- 当执行 **compile** 的时候,会执行从左向右依次执行 `compile` 当执行 **test** 的时候,会执行从左向右依次执行 `compile、test` 当执行 **package** 的时候,会执行从左向右依次执行 `compile、test、package` 当执行 **install** 的时候,会执行从左向右依次执行 `compile、test、package、install` 当执行 **deploy** 的时候,会执行从左向右依次执行 `compile、test、package、install、deploy` 运行任何一个阶段的时候,它前面的所有阶段都会被运行,例如我们运行 mvn install 的时候,代码会被 编译,测试,打包。 这就是 Maven 为什么能够自动执行构建过程的各个环节的原因。 此外,Maven 的插件机制是完全依赖 Maven 的生命周期的,因此理解生命周期至关重要。 # 第六章 Maven插件管理 # ## 6.1、插件概述 ## Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。 每个插件都能实现多个功能,每个功能就是一个插件目标。 Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务。 例如:compile 就是插件 maven-compiler-plugin 的一个目标 Maven 有以下三个标准的生命周期: * **clean**:项目清理的处理 * **default(或 build)**:项目部署的处理 * **site**:项目站点文档创建的处理(一般不用,所以生命周期没提) 每个生命周期中都包含着一系列的阶段。 这些阶段就相当于 Maven 提供的统一的接口,然后这些阶段的实现由 Maven 的插件来完成。 我们在输入 mvn 命令的时候 比如 **mvn clean**,clean 对应的就是 Clean 生命周期中的 clean 阶段。 但是 clean 的具体操作是由 **maven-clean-plugin** (内置了,不用我们手动添加)来实现的。 所以说 Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。 Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。 Maven 插件通常被用来: * 创建 jar 文件 * 创建 war 文件 * 编译代码文件 * 代码单元测试 * 创建工程文档 * 创建工程报告 Maven 提供了下面两种类型的插件: <table> <thead> <tr> <th align="left">类型</th> <th align="left">描述</th> </tr> </thead> <tbody> <tr> <td align="left">Build plugins</td> <td align="left">在构建时执行,并在 pom.xml 的元素中配置。(最常用)</td> </tr> <tr> <td align="left">Reporting plugins</td> <td align="left">在网站生成过程中执行,并在 pom.xml 的元素中配置。(不常用)</td> </tr> </tbody> </table> 一定注意,maven默认会采用自身所定义的插件来执行各个阶段,也就是说,即使你不配置这些插件,它也能够正常运行。 但是,你要是配置了某一阶段的一个插件,他就会采用你所配置的插件来进行运行。 除了一些不在生命周期内的插件,而我们需要使用,则需要单独配置,接下里就会告诉大家有哪些常见插件。 ## 6.2、插件配置 ## 我们接下来主要讲解在工程 POM.XML 文件中如何配置一个插件? 找到 POM.XML 在根标签内添加以下代码,插件名和版本仅供参考,具体添加什么插件,取决于你。 <build> <plugins> <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> ... ... </plugins> </build> ## 6.3、常用插件 ## ### 6.3.1、通用型插件 ### **maven-resources-plugin** 插件描述:该插件处理项目的资源文件拷贝到输出目录,可以分别处理main resources 和 test resources。 <build> <plugins> <!-- 依赖插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.0.1</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> 除了使用**maven-resources-plugin**也可以使用以下配置来进行资源拷贝: <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> <include>**/*.conf</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> <include>**/*.conf</include> </includes> <filtering>false</filtering> </resource> </resources> </build> **maven-compiler-plugin** 插件描述:设置maven编译的jdk版本,maven3默认用jdk1.5,maven2默认用jdk1.3,除了配置`maven安装目录/config/settings.xml`文件,也可以使用**maven-compiler-plugin**进行指定 <build> <plugins> <!-- 依赖插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> **maven-assembly-plugin** 插件描述:该插件允许用户整合项目的输出,包括依赖、模块、网站文档和其他文档到一个单独的文件,即可用定制化打包。 四种预定义的描述器可用:bin, jar-with-dependencies, src, project。 <build> <plugins> <!-- 依赖插件 --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>主程序类全路径</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> **maven-source-plugin** 插件描述:该插件处理打包项目的源代码。 <build> <plugins> <!-- 依赖插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build> **maven-dependency-plugin** 插件描述:自动拷贝jar包到target目录 <build> <plugins> <!-- 依赖插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>copy-dependencies</id> <phase>compile</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- ${project.build.directory}为Maven内置变量,缺省为target --> <outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- 表示是否不包含间接依赖的包 --> <excludeTransitive>false</excludeTransitive> <!-- 表示复制的jar文件去掉版本信息 --> <stripVersion>true</stripVersion> </configuration> </execution> </executions> </plugin> </plugins> </build> ### 6.3.2、web型插件 ### * 插件名称:maven-jetty-plugin * 插件作用:可以让项目直接用jetty的服务器运行 * 使用命令:`mvn jetty:run` * 默认端口:8080 <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>8.1.16.v20140903</version> <!-- 插件配置选项,可选项 --> <configuration> <connectors> <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> <port>8080</port> </connector> </connectors> <scanIntervalSeconds>10</scanIntervalSeconds> </configuration> </plugin> -------------------- * 插件名称:tomcat7-maven-plugin * 插件作用:可以让项目直接用tomcat的服务器运行 * 使用命令:`mvn tomcat7:run` * 默认端口:8080 <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <!-- 插件配置选项,可选项 --> <configuration> <path>/</path> <port>8080</port> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin> # 第七章 Maven变量信息 # ## 7.1、内置变量 ## 主要有两个常用内置属性:`${basedir}`项目的根目录(包含pom.xml文件的目录),`${version}`项目版本 #用户可以使用该属性引用POM文件中对应元素的值,常用的POM属性包括: ${project.build.sourceDirectory}:项目的主源码目录,默认为 src/main/java ${project.build.testSourceDirectory}:项目的测试源码目录,默认为 src/test/java ${project.build.directory}:项目构件输出目录,默认为 target/ ${project.outputDirectory}:项目主代码编译输出目录,默认为 target/classes/ ${project.testOutputDirectory}:项目测试代码编译输出目录,默认为 target/test-classes/ ${project.groupId}:项目的 groupId ${project.artifactId}:项目的 artifactId ${project.version}:项目的 version,与${version}等价 ${project.build.fianlName}:项目打包输出文件的名称。默认为${project.artifactId}-${project.version} #获取环境变量属性,所有环境变量都可以使用以env.开头的Maven属性引用 ${env.xxx}:获取系统环境变量; #获取Settings属性,用户使用settings.开头的属性引用 settings.xml 文件中XML元素的值 ${settings.xxx}:获取settings.xml中对应元素的值; ## 7.2、自定义变量 ## **如何定义** <project> ... <properties> <变量名>变量值</变量名> </properties> ... </project> **如何引用** ${变量名} **案例演示** <project> ... <properties> <junit.version>3.8.1</junit.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> ... </project> # 第八章 Maven集成环境 # ## 8.1、Maven集成到Eclipse ## ### 8.1.1、如何集成Maven ### > eclipse version:Oxygen.3a Release (4.7.3a),全新安装,无任何配置 > > java version:“1.8.0\_261” ![image-20201214120055591][] ![image-20201214120607623][] ![image-20201214120631839][] ![image-20201214120706416][] ![image-20201214120802794][] ![image-20201214120825739][] ![20201214120941][] ![image-20201214121013621][] ![image-20201214121039878][] ### 8.1.2、创建Java项目 ### ![image-20201214121109996][] ![image-20201214121132662][] ![image-20201214121152696][] ![image-20201214121222397][] ![image-20201214121352871][] ![image-20201214124159370][] ![image-20201214124224507][] ![image-20201214124255250][] ![image-20201214124319831][] ![image-20201214124507429][] ### 8.1.3、创建JavaWeb项目 ### ![image-20201214124405327][] ![image-20201214124539851][] ![image-20201214124607023][] ![image-20201214124730326][] ![image-20201214124748841][] ![image-20201214124831778][] ![image-20201214124854366][] ![image-20201214124919775][] ![image-20201214124958639][] ![image-20201214125156848][] ![image-20201214130042274][] ![image-20201214130151188][] ![image-20201214130212830][] ![image-20201214130328146][] ![image-20201214130355511][] ![image-20201214130415504][] ## 8.2、Maven集成到Idea ## ### 8.2.1、如何集成Maven ### > idea version:IntelliJ IDEA 2020.1.2,全新安装,无任何配置 > > java version:“1.8.0\_261” ![image-20201214131024956][] ![image-20201214131126547][] ![image-20201214131631734][] ![image-20201214131652171][] ### 8.2.2、创建Java项目 ### ![20201214131917.png][] ![image-20201214132013466][] ![image-20201214132134720][] ![image-20201214132242681][] ![image-20201214132402347][] ![image-20201214132450050][] ![image-20201214132509470][] ### 8.2.3、创建JavaWeb项目 ### ![image-20201214132645568][] ![image-20201214132717385][] ![image-20201214132834952][] ![image-20201214133018075][] ![image-20201214133056908][] ![image-20201214133153244][] ![image-20201214133247447][] ![image-20201214133336163][] ![image-20201214133417730][] ![image-20201214133536317][] ![image-20201214134107361][] ![image-20201214134231521][] ![image-20201214134336665][] ![image-20201214134358146][] ![image-20201214134422193][] ![image-20201214134456023][] # 第九章 Maven模块化开发 # ## 9.1、概述 ## 为什么要模块化开发? 一个工程往往会有很多代码文件,也会分为很多层,比如传统的mvc:controller、service、dao等等。 时间一场,随着项目开发的越来越大,这些文件和层次越来越多,放到一个工程中也越来越难管理。 而且,比如dao层,可能不止这一个项目用到了,其他项目也有可能用到,以前的所有代码放到一个工程中,你在抽取的时候会很麻烦。 现在经过模块化划分之后,各个层次结构之间可以相互依赖,大大提高了项目的开发进度。 在未来的微服务架构中,这一点也有很好的体现。 值得一提的是,模块与模块之间可以相互依赖,由父工程进行所有依赖版本的管理,减少了开发中很多不必要的工作。 模块化开发是在依赖继承的基础上进行的,所以你有必要去了解一下依赖继承。 ## 9.2、Eclipse中演示 ## ### 9.2.1、创建父项目 ### ![image-20201214151741211][] ![image-20201214151811903][] ![image-20201214151834638][] ![image-20201214151926262][] ### 9.2.2、创建子项目 ### ![image-20201214152038748][] ![image-20201214152109563][] ![image-20201214152210771][] ![image-20201214152230699][] ![image-20201214152259284][] **父工程的pom.xml:** ![image-20201214152428830][] **子工程的pom.xml:** ![image-20201214152454140][] ## 9.3、Idea中演示 ## ### 9.3.1、创建父项目 ### ![image-20201214153322544][] ![image-20201214153529410][] ![image-20201214153854688][] ![image-20201214153935739][] ### 9.3.2、创建子项目 ### ![image-20201214154019674][] ![image-20201214154048323][] ![image-20201214154205074][] **父工程的pom.xml:** ![image-20201214154332901][] **子工程的pom.xml:** ![image-20201214154435450][] # 第十章 Maven私服搭建 # ## 10.1、nexus3介绍 ## Nexus3是一个仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问。 平常我们在获取maven仓库资源的时候,都是从maven的官方(或者国内的镜像)获取,但是这都不是最好的方案,假如在同一个环境内,一个团队的多个开发人员同样的依赖都要从远程获取一遍,从网络方面来说,这是非常耗时的。这时候就需要在局域网内部署一个Nexus3用来管理Maven(apt、yum、gradle、pypi、docker等等)仓库。 有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建Nexus3私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了Nexus3私服的电脑访问maven的远程仓库。 ![image-20201214185618418][] ## 10.2、nexus3搭建 ## 下载地址:https://www.sonatype.com/nexus/repository-oss/download 由于这个软件也是在外网,下载速度很慢,至少我是这样的,所以我把安装包,放到了配套资料中。 首先先下载下来Nexus,然后解压到一个没有空格,没有中文的目录中去,这里我解压到和maven同一级的目录中去了。 `C:\DevTools\nexus-3.25.0-03-win64` ![image-20201214164304198][] 首先进入 `nexus-3.25.0-03` ,在进入 `bin` ![image-20201214164425503][] 运行命令: `nexus.exe /run` ![image-20201214164458338][] 然后他就会一直加载一直加载… ![image-20201214164723306][] 打开浏览器:访问`http://localhost:8081/` ![image-20201214164825850][] 点击登录就我会询问你账户密码,默认账户为 `admin`,密码就需要到 `sonatype-work/nexus3` 里寻找了,那一长串就是密码 ![image-20201214164953012][] ![image-20201214165030360][] ![image-20201214165149305][] ![image-20201214165251381][] ![image-20201214165456949][] ![image-20201214165532051][] Nexus有3个类型的数据仓库,分别是hosted,proxy,group。 hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件以及自己或第三方的项目构件; proxy 代理仓库:代理公共的远程仓库; group 仓库组:Nexus 通过仓库组统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。 Nexus预定义了2个本地仓库,分别是maven-releases, maven-snapshots。 maven-releases:这里存放我们自己项目中发布的构建,通常是Release版本的,也就是正式版。 maven-snapshots:这个仓库非常的有用,它的目的是让我们可以发布那些非release版本,非稳定版本,也就是快照版。 ![image-20201214165809537][] 手动上传本地jar包,这里以常用的`ojdbc6-11.2.0.4.jar`为例,当然你可以任选jar包上传。 ![image-20201214170151620][] ![image-20201214171655832][] ![image-20201214171744074][] ![image-20201214171820989][] 这样一个jar包就上传成功了。 ## 10.3、create仓库 ## 如果你的工程中,使用的jar包,在私服中没有,他就会自动连接远程仓库进行下载,这不是我们希望的结果,我们希望它去阿里maven库去下载,这样下载速度会更快。 ![image-20201214182335344][] ![image-20201214182432344][] > 阿里仓库地址:http://maven.aliyun.com/nexus/content/groups/public/ ![image-20201214182712889][] ![image-20201214182816140][] ![image-20201214182836575][] ![image-20201214182908644][] ![image-20201214182935683][] ## 10.4、maven配置 ## 老规矩,要配置maven,就需要到maven安装目录中的 `conf/settings.xml` 上传需要的设置: <servers> <!-- 发布版 --> <server> <id>releases</id> <username>admin</username> <password>admin123</password> </server> <!-- 快照版 --> <server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server> </servers> 下载需要的设置 <mirrors> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <name>nexus maven</name> <url>http://127.0.0.1:8081/repository/maven-public/</url> </mirror> </mirrors> ## 10.5、project配置 ## 我们准备一个maven项目,在pom.xml中添加一段配置: <distributionManagement> <repository> <id>releases</id> <name>maven-releases</name> <url>http://127.0.0.1:8081/repository/maven-releases/</url> <uniqueVersion>true</uniqueVersion> </repository> <snapshotRepository> <id>snapshots</id> <name>maven-snapshots</name> <url>http://127.0.0.1:8081/repository/maven-snapshots/</url> <uniqueVersion>true</uniqueVersion> </snapshotRepository> </distributionManagement> ## 10.6、发布项目到私服 ## 只要执行命令 `mvn deploy`即可。 这里配置了两个仓库,一个正式版、一个快照版,maven是如何区分你要发布到哪一个仓库呢? 如果你的版本带着releases,也就是 `<version>0.0.1-releases</version>`,就会发布到 `maven-releases`。 如果你的版本带着snapshots,也就是 `<version>0.0.1-snapshots</version>`,就会发布到 `maven-snapshots`。 ## 10.7、安装依赖到私服 ## 如果你想安装别人提供给你的jar包到私服,除了使用nexus提供的图形化界面方式上传,还可以使用命令行的方式进行上传。 我们以上传 `ojdbc6-11.2.0.4.jar` 到私服快照仓库为例演示。(以下命令是一行,为了方便阅读,我特意换了行,请注意) mvn deploy:deploy-file -DgroupId=com.oracle.database.jdbc -DartifactId=ojdbc6 -Dversion=11.2.0.4 -Dpackaging=jar -Dfile=C:\developlib\ojdbc6-11.2.0.4.jar -Durl=http://localhost:8081/repository/maven-snapshots/ -DrepositoryId=snapshots ## 10.8、安装依赖到本地 ## 如果你想安装别人提供给你的jar包到本地仓库,可以参考以下命令: 我们以安装 `ojdbc6-11.2.0.4.jar` 到本地仓库为例演示。(以下命令是一行,为了方便阅读,我特意换了行,请注意) mvn install:install-file -DgroupId=com.oracle.database.jdbc -DartifactId=ojdbc6 -Dversion=11.2.0.4 -Dpackaging=jar -Dfile=C:\developlib\ojdbc6-11.2.0.4.jar [image-20201213195557379]: /images/20221120/01632db06dcb441891acd386d658589b.png [image-20201213200131979]: /images/20221120/75b42bd383924334ba85fba5062eb0f0.png [image-20201213214729375]: /images/20221120/2ca78ab17ca64ce3847290fca2a431bb.png [image-20201213214802293]: /images/20221120/20b82344168745e585127a670f4714d3.png [image-20201213214819935]: /images/20221120/851178856487454ca05988b452f9b28c.png [image-20201213215013667]: /images/20221120/9567f1c1afe7470b9ca29560408ca3ea.png [image-20201213220839490]: /images/20221120/c4ca9500e2994553abd11136f317aa50.png [image-20201213221123360]: /images/20221120/aae120705e0b4ece8365ca96633454e7.png [image-20201213221849433]: /images/20221120/645e97e7513f4614af23277b74f837bd.png [image-20201213221920897]: /images/20221120/da8b796577fc4eb7af162a523f857bdd.png [image-20201214090710229]: /images/20221120/25f5f73cb3b8444198223398c5de440c.png [image-20201214120055591]: /images/20221120/708bdc9c9dbd4ccc9016a86f7a18f258.png [image-20201214120607623]: /images/20221120/65ff7baff790473eb30ded9ecba89130.png [image-20201214120631839]: /images/20221120/a8a16df0857c43568332548adae74609.png [image-20201214120706416]: /images/20221120/0106660b6dbc4f05937a1b09da61fec8.png [image-20201214120802794]: /images/20221120/03b2b12d976d49f39680d85b228b9f88.png [image-20201214120825739]: /images/20221120/127de832e7e34f489ec531871de54681.png [20201214120941]: /images/20221120/ccb2bedf0e924b3ca2afcb6628781cfc.png [image-20201214121013621]: /images/20221120/86d27fe2106f41e4a60c5d332518a130.png [image-20201214121039878]: /images/20221120/d2e898d40f1f478ca5f6d28379752214.png [image-20201214121109996]: /images/20221120/0f018ab72e3d49468cd6f4b1415b74d5.png [image-20201214121132662]: /images/20221120/a5150b4dd00c4cb5ac2993203aa2d1f9.png [image-20201214121152696]: /images/20221120/0677687b8eea4970ac08374449590d45.png [image-20201214121222397]: /images/20221120/dbae6de31b314de3aaa20033b755b6b9.png [image-20201214121352871]: /images/20221120/34415e7276664fa49be94f0d13e7eae3.png [image-20201214124159370]: /images/20221120/99c97714f6b848e29d5fb27fae77671c.png [image-20201214124224507]: /images/20221120/0920425d9ae1470585db8b519bfa416e.png [image-20201214124255250]: /images/20221120/b49b1710c2014a0f8a70703b3c1f8965.png [image-20201214124319831]: /images/20221120/d1633f10c63c4ba6a66b0ff834ad35ab.png [image-20201214124507429]: /images/20221120/e3b9dbb7d4214343993037b6949341fc.png [image-20201214124405327]: /images/20221120/509f8268bab64916bddd58e78e9b5225.png [image-20201214124539851]: /images/20221120/0f3ad2492c5543e58c738a749d7035d0.png [image-20201214124607023]: /images/20221120/23110c3c298e40eebd30abd4d1734165.png [image-20201214124730326]: /images/20221120/0b9115eb40a245c686190dd163bab3a4.png [image-20201214124748841]: /images/20221120/ecf40673c51c403eaa290a8c740a6a7b.png [image-20201214124831778]: /images/20221120/1b5266452310432fa2634a11b7353d46.png [image-20201214124854366]: /images/20221120/a5889d4166484c4a90e601cf602b39f0.png [image-20201214124919775]: /images/20221120/dcc8938c3c1347e8ab631144bf418727.png [image-20201214124958639]: /images/20221120/b3463db7fa364d50a2dab4a11bc84bb5.png [image-20201214125156848]: /images/20221120/37cee999d51548f88176d561b0b6c6b3.png [image-20201214130042274]: /images/20221120/c86af7b92c3f4553b71c6e18592fda92.png [image-20201214130151188]: /images/20221120/c04c6594cb2748e4b3f6cef294be9b3f.png [image-20201214130212830]: /images/20221120/1a57ce1e518a421c86112c1cf0bbae53.png [image-20201214130328146]: /images/20221120/af7c176c1d2d4024a61ce0622845e55a.png [image-20201214130355511]: /images/20221120/d376134fcd484e2abc5af97e630447a4.png [image-20201214130415504]: /images/20221120/cbed989ed774417d83309ff25e9b0545.png [image-20201214131024956]: /images/20221120/dd1b506cfcd64ae19b0e336d89cc2306.png [image-20201214131126547]: /images/20221120/240871ff366840048e5e3324f6683dfc.png [image-20201214131631734]: /images/20221120/fe53487fb8e64c2ca9e259a1e9b97dbe.png [image-20201214131652171]: /images/20221120/36c47fc822b54a7cb1905201b99793d9.png [20201214131917.png]: https://gitee.com/caochenlei/BlogImages/raw/master/20201214131917.png [image-20201214132013466]: https://img-blog.csdnimg.cn/img_convert/40c979307e105824799b7f013cb28d1b.png [image-20201214132134720]: https://img-blog.csdnimg.cn/img_convert/6768497d21067056ea2f4da8af0c6516.png [image-20201214132242681]: https://img-blog.csdnimg.cn/img_convert/07ce37f2cd14a29de0d1076b7e6eb1e0.png [image-20201214132402347]: https://img-blog.csdnimg.cn/img_convert/53ca369dcffdb8f612857a2e68c959c3.png [image-20201214132450050]: https://img-blog.csdnimg.cn/img_convert/38b92e15400ca71db8b44e8606ab17c6.png [image-20201214132509470]: https://img-blog.csdnimg.cn/img_convert/6548f0ee862025f3437e754f6ad6c613.png [image-20201214132645568]: https://img-blog.csdnimg.cn/img_convert/2916ea4e28ce81995887b482980fc94a.png [image-20201214132717385]: https://img-blog.csdnimg.cn/img_convert/c013b5a4d9cdabd399c943c731a13c53.png [image-20201214132834952]: https://img-blog.csdnimg.cn/img_convert/3c76cebcc3f7ef2ea5bebf5d2dd1ebe2.png [image-20201214133018075]: https://img-blog.csdnimg.cn/img_convert/e5d04950b5ee1b5aca7963c5d1e72843.png [image-20201214133056908]: https://img-blog.csdnimg.cn/img_convert/5459bfda64205d719f98830d7c2354b3.png [image-20201214133153244]: https://img-blog.csdnimg.cn/img_convert/2dfbf9f1f3dc50722f6dd7a1f0abf02e.png [image-20201214133247447]: https://img-blog.csdnimg.cn/img_convert/91501fb7afd4416bb9db5ad3ff153db9.png [image-20201214133336163]: https://img-blog.csdnimg.cn/img_convert/02783b17cb95354270c55a9afa381c3a.png [image-20201214133417730]: https://img-blog.csdnimg.cn/img_convert/3514e11d4aeb4cb4573572022acd53f7.png [image-20201214133536317]: https://img-blog.csdnimg.cn/img_convert/7c936d583e40805db2ad8ca078869d2f.png [image-20201214134107361]: https://img-blog.csdnimg.cn/img_convert/28ef53b2b1ba58fd776ab84d5dc5364f.png [image-20201214134231521]: https://img-blog.csdnimg.cn/img_convert/95fd94f65f846b43aa7fea596f2f9a2d.png [image-20201214134336665]: https://img-blog.csdnimg.cn/img_convert/62e8800bfc2562d1de9f5c3015f78c6c.png [image-20201214134358146]: https://img-blog.csdnimg.cn/img_convert/438179674a030496642f1c36ac3a612e.png [image-20201214134422193]: https://img-blog.csdnimg.cn/img_convert/5049033497fb4cb1886d6a6da2392a9d.png [image-20201214134456023]: https://img-blog.csdnimg.cn/img_convert/ad21caa54588b8db111bd33c27bb6d4d.png [image-20201214151741211]: https://img-blog.csdnimg.cn/img_convert/c945ee83b7d17b5e053e17fff2c84036.png [image-20201214151811903]: https://img-blog.csdnimg.cn/img_convert/18ba522b580bc0023620620d349cdf06.png [image-20201214151834638]: https://img-blog.csdnimg.cn/img_convert/5f6bd49077c74119bcc0e7684eb956cc.png [image-20201214151926262]: https://img-blog.csdnimg.cn/img_convert/2da022b6afb870913765c3a69054d12a.png [image-20201214152038748]: https://img-blog.csdnimg.cn/img_convert/02998a981ad627e9041b0fae9b1b0df0.png [image-20201214152109563]: https://img-blog.csdnimg.cn/img_convert/969e309c41b0559097f7a5dc8fcd0da1.png [image-20201214152210771]: https://img-blog.csdnimg.cn/img_convert/78834a744a87b69df7a88f8475cd4d36.png [image-20201214152230699]: https://img-blog.csdnimg.cn/img_convert/fbae5203632ce06043d98c63688f6fec.png [image-20201214152259284]: https://img-blog.csdnimg.cn/img_convert/8996d151ced9aad56e0e2182f94e150c.png [image-20201214152428830]: https://img-blog.csdnimg.cn/img_convert/7866d31d1f96a7b1199478f74edaac03.png [image-20201214152454140]: https://img-blog.csdnimg.cn/img_convert/465104a9fdc131d0a5674378ce85747a.png [image-20201214153322544]: https://img-blog.csdnimg.cn/img_convert/929870b3044192b0d3cac8509cdce51d.png [image-20201214153529410]: https://img-blog.csdnimg.cn/img_convert/64a4325ce022f92892f3e80a7bbc3d0b.png [image-20201214153854688]: https://img-blog.csdnimg.cn/img_convert/21e3ff7d8d11d0ea55508397fe7a8d65.png [image-20201214153935739]: https://img-blog.csdnimg.cn/img_convert/bacd9ac52eee90261e5bc5e32d2d4430.png [image-20201214154019674]: https://img-blog.csdnimg.cn/img_convert/a289ee15f26c7469aea116e6cc021e9c.png [image-20201214154048323]: https://img-blog.csdnimg.cn/img_convert/8aa571d49f1a7b24f7b8746564721aa7.png [image-20201214154205074]: https://img-blog.csdnimg.cn/img_convert/efa96d624259647593f9c0f205a5ccf9.png [image-20201214154332901]: https://img-blog.csdnimg.cn/img_convert/8508c6e944114e11412445f025788615.png [image-20201214154435450]: https://img-blog.csdnimg.cn/img_convert/8cd039e98ed46091046149c4625dd078.png [image-20201214185618418]: https://img-blog.csdnimg.cn/img_convert/a7fe921b61c3a34a53eae600958b6ab3.png [image-20201214164304198]: https://img-blog.csdnimg.cn/img_convert/f78f5adaafb6ac112a5f28bba3279ff3.png [image-20201214164425503]: https://img-blog.csdnimg.cn/img_convert/33aa710228760e446739af0388705a5a.png [image-20201214164458338]: https://img-blog.csdnimg.cn/img_convert/ff3ec064ba4d7d354d92207c290409b0.png [image-20201214164723306]: https://img-blog.csdnimg.cn/img_convert/694795ac3edc0a98d2a64503869c1260.png [image-20201214164825850]: https://img-blog.csdnimg.cn/img_convert/69f9e561b65e1e377d71b7f2ef2fe2f1.png [image-20201214164953012]: https://img-blog.csdnimg.cn/img_convert/262d4254c7f50713b40c445de468f513.png [image-20201214165030360]: https://img-blog.csdnimg.cn/img_convert/2ca513eee02a578dbee6f7901eb6c9ee.png [image-20201214165149305]: https://img-blog.csdnimg.cn/img_convert/86d40f4e6821c052dc5a0a72bc625631.png [image-20201214165251381]: https://img-blog.csdnimg.cn/img_convert/9343fd2500b59709a32237cf030ae725.png [image-20201214165456949]: https://img-blog.csdnimg.cn/img_convert/9723004bea8b51ab0db367ea1bf25b61.png [image-20201214165532051]: https://img-blog.csdnimg.cn/img_convert/9cc96f30e0cd395b5a7b252db95469d8.png [image-20201214165809537]: https://img-blog.csdnimg.cn/img_convert/3a9dd63798473fd3c41c2231d4817606.png [image-20201214170151620]: https://img-blog.csdnimg.cn/img_convert/900d7ba607ed2fdde0d4e0a8473205df.png [image-20201214171655832]: https://img-blog.csdnimg.cn/img_convert/36a4f68406bedc5870e83c00098236e8.png [image-20201214171744074]: https://img-blog.csdnimg.cn/img_convert/8aec4fcb951240ecbe7acbc423c0a552.png [image-20201214171820989]: https://img-blog.csdnimg.cn/img_convert/493e5792a1a9b3959536d05ca03083b6.png [image-20201214182335344]: https://img-blog.csdnimg.cn/img_convert/450de4b2c71daf26d7da49b3aa6755f1.png [image-20201214182432344]: https://img-blog.csdnimg.cn/img_convert/c3e0c6426a03dbece7d86d12da27cba7.png [image-20201214182712889]: https://img-blog.csdnimg.cn/img_convert/786e8b007f86955f13d5a631eb8c6ec9.png [image-20201214182816140]: https://img-blog.csdnimg.cn/img_convert/e81031538e0467ef2a29c1b77ba7c822.png [image-20201214182836575]: https://img-blog.csdnimg.cn/img_convert/67e1e32cd9ddffacdad3084b3f897072.png [image-20201214182908644]: https://img-blog.csdnimg.cn/img_convert/7eaaa38ab559e06ec37f625f62c926c1.png [image-20201214182935683]: https://img-blog.csdnimg.cn/img_convert/ee82e95fd241456e0817ba269f269a61.png
相关 学习Maven这一篇就够了 目录 第一章 Maven简介 1.1、Maven概述 1.2、Maven特点 1.3、Maven官网 1.4、 ╰+哭是因爲堅強的太久メ/ 2022年12月28日 05:28/ 0 赞/ 708 阅读
相关 学习jQuery这一篇就够了 目录 第一章 jQuery简介 1.1、jQuery简介 1.2、jQuery官网 1.3、jQuery版本介绍 偏执的太偏执、/ 2022年12月21日 03:08/ 0 赞/ 22 阅读
相关 学习JavaScript这一篇就够了 目录 第一章 JavaScript简介 1.1、JavaScript的起源 1.2、JavaScript的组成 1.3、Ja 痛定思痛。/ 2022年12月17日 15:55/ 0 赞/ 283 阅读
相关 学习JavaWeb这一篇就够了 目录 第一章 开发工具 1.1、JDK安装 1.2、Tomcat安装 1.3、IDEA安装 1.4、IDEA集 忘是亡心i/ 2022年12月06日 04:14/ 0 赞/ 203 阅读
相关 学习Tomcat这一篇就够了 目录 第一章 Tomcat概述 1.1、Tomcat概述 1.2、Tomcat历史 1.3、T 短命女/ 2022年12月04日 08:37/ 0 赞/ 472 阅读
相关 学习FastDFS这一篇就够了 目录 第一章 FastDFS简介 1.1、FastDFS的简介 1.2、FastDFS的发展历史 ╰+攻爆jí腚メ/ 2022年12月04日 07:40/ 0 赞/ 677 阅读
相关 学习Nginx这一篇就够了 目录 第一章 Nginx概述 1.1、Nginx概述 1.2、Nginx官网 1.3、Ngin 叁歲伎倆/ 2022年12月02日 04:24/ 0 赞/ 416 阅读
相关 学习Oracle这一篇就够了 目录 第一章 数据库概述 1.1、数据库的好处 1.2、数据库的常见概念 1.3、数据库的存储 缺乏、安全感/ 2022年11月27日 03:13/ 0 赞/ 437 阅读
相关 学习JavaScript这一篇就够了 [https://blog.csdn.net/qq\_38490457/article/details/109257751?utm\_medium=distribute.pc\ 左手的ㄟ右手/ 2022年11月21日 03:34/ 0 赞/ 320 阅读
相关 学习JDBC这一篇就够了 文章目录 一、JDBC简介 二、获取数据库连接 准备工作 1、导入驱动jar包 2、加载与注册JDBC驱 痛定思痛。/ 2022年11月18日 01:42/ 0 赞/ 369 阅读
还没有评论,来说两句吧...