创建第一个 Maven 项目(一)
一、引言
在 Java 开发的广袤天地中,Maven 宛如一位全能的管家,发挥着举足轻重的作用。它是一个基于项目对象模型(POM)的项目管理和构建自动化工具,极大地简化了 Java 项目的开发流程。
Maven 的核心优势之一在于其强大的依赖管理功能。在以往的 Java 项目开发中,管理项目依赖犹如一场噩梦。开发人员需要手动下载各种所需的库文件,并且要时刻留意不同库之间的版本兼容性问题。稍有不慎,就可能陷入依赖冲突的泥沼,导致项目无法正常运行。而 Maven 的出现,彻底改变了这一局面。它使用坐标(groupId、artifactId、version)来唯一标识一个依赖项,只需在项目的 pom.xml 文件中声明依赖,Maven 便会自动下载相应的依赖,并智能解析依赖的传递性关系。这不仅大大节省了开发人员的时间和精力,还极大地降低了依赖冲突和版本不一致的问题。比如,当我们开发一个基于 Spring 框架的项目时,只需要在 pom.xml 中添加 Spring 相关的依赖坐标,Maven 就会自动下载 Spring 框架及其所有依赖的库文件,确保项目的依赖环境准确无误。
Maven 还统一了项目的结构。它规定了一套标准的目录结构和命名约定,使得不同的项目具有一致的布局。源代码被规范地放置在 src/main/java 目录下,测试代码则存放在 src/test/java 目录下,资源文件放在 src/main/resources 目录等。这种统一的结构让项目的组织和管理变得更加简单明了,无论是新加入项目的开发人员,还是进行代码审查、维护的人员,都能迅速熟悉项目的架构,提高开发效率和团队协作能力。
在构建过程方面,Maven 同样表现出色。它提供了一系列丰富的插件,涵盖了编译、测试、打包、部署等项目开发的各个环节。通过这些插件,开发人员可以轻松实现自动化的构建流程。例如,使用 Maven 的编译插件可以自动将 Java 代码编译成字节码文件,测试插件能够方便地运行单元测试,打包插件可以将项目打包成可发布的 JAR 或 WAR 文件,部署插件则能将项目部署到远程服务器上。这一系列自动化操作,让开发人员能够专注于核心业务逻辑的实现,而无需花费大量时间在繁琐的构建过程管理上。
对于大型项目而言,Maven 的多模块管理功能更是不可或缺。它允许将一个庞大复杂的项目拆分为多个独立的模块,每个模块都可以独立进行开发、测试和构建。这种模块化的管理方式极大地提高了项目的可维护性和可扩展性。当某个模块需要进行修改或升级时,不会影响到其他模块的正常运行,同时也便于团队成员分工协作,提高开发效率。
正是由于 Maven 在依赖管理、项目结构统一、构建过程自动化以及多模块管理等方面的卓越表现,它已经成为 Java 开发中不可或缺的重要工具。无论你是初涉 Java 开发的新手,还是经验丰富的资深开发者,掌握 Maven 的使用都是迈向高效 Java 开发的关键一步。接下来,就让我们一起开启创建第一个 Maven 项目的精彩之旅,亲身体验 Maven 的强大魅力吧!
二、Maven 是什么
(一)Maven 的定义
Maven 是一个基于项目对象模型(POM,Project Object Model)的项目管理和构建自动化工具,主要用于 Java 项目 。它通过一个简单的 XML 文件(pom.xml)来管理项目的构建、报告和文档。在这个文件中,你可以定义项目的基本信息,如项目名称、版本、描述等,还能声明项目的依赖库、构建插件以及其他配置信息。
(二)Maven 的优势
- 强大的依赖管理:在传统的 Java 项目开发中,管理项目依赖是一项繁琐的任务。开发人员需要手动下载各种依赖库,并且要确保这些库的版本兼容性。稍有不慎,就可能引发依赖冲突,导致项目无法正常运行。而 Maven 的依赖管理功能则极大地简化了这一过程。它使用坐标(groupId、artifactId、version)来唯一标识一个依赖项,你只需在 pom.xml 文件中声明依赖,Maven 就会自动从中央仓库或其他配置的仓库中下载相应的依赖,并处理依赖的传递关系。例如,当我们开发一个基于 Spring Boot 的项目时,只需要在 pom.xml 中添加 Spring Boot 相关的依赖坐标,Maven 就会自动下载 Spring Boot 及其所有依赖的库文件,确保项目的依赖环境准确无误。
- 标准化的项目结构:Maven 提供了一套标准的项目目录结构,这使得不同的项目具有一致的布局。源代码存放在 src/main/java 目录下,测试代码放在 src/test/java 目录下,资源文件放在 src/main/resources 目录等。这种标准化的结构让项目的组织和管理更加清晰,无论是新加入项目的开发人员,还是进行代码审查、维护的人员,都能迅速熟悉项目的架构,提高开发效率和团队协作能力。
- 丰富的插件生态:Maven 拥有丰富的插件生态系统,这些插件可以帮助你完成各种构建任务,如编译、测试、打包、部署等。例如,Maven Compiler 插件用于编译 Java 代码,Maven Surefire 插件用于运行测试用例,Maven Jar 插件用于将项目打包成 JAR 文件,Maven War 插件用于将 Web 项目打包成 WAR 文件。通过配置这些插件,你可以轻松实现自动化的构建流程,并且可以根据项目的需求自定义构建过程。
- 多模块项目支持:对于大型项目,通常会将其拆分为多个模块进行开发和管理。Maven 提供了强大的多模块项目支持功能,它允许你将一个项目划分为多个独立的模块,每个模块都有自己的 pom.xml 文件,可以独立进行构建、测试和部署。同时,模块之间可以方便地进行依赖管理,提高了项目的可维护性和可扩展性。
三、准备工作
在开始创建第一个 Maven 项目之前,我们需要完成一些必要的准备工作,以确保开发环境的完整性和稳定性。这些准备工作包括安装 Java JDK、安装 Maven 以及选择合适的开发工具。下面将详细介绍每个步骤的具体操作。
(一)安装 Java JDK
Java Development Kit(JDK)是 Java 开发的核心工具包,它包含了 Java 运行时环境(JRE)、Java 编译器(javac)以及一系列开发工具。安装 JDK 是进行 Java 开发的首要步骤,以下是安装 JDK 的详细步骤:
- 下载 JDK:
-
- 打开浏览器,访问 Oracle 官方网站的 JDK 下载页面:JDK 下载。
-
- 根据你的操作系统(如 Windows、Mac OS、Linux)选择对应的 JDK 版本进行下载。例如,如果你使用的是 64 位 Windows 系统,就下载 Windows x64 Installer。
- 安装 JDK:
-
- 下载完成后,双击安装程序开始安装。
-
- 在安装向导中,按照提示逐步完成安装过程。可以选择默认的安装路径,也可以根据自己的需求自定义安装目录。例如,你可以将其安装在C:\Program Files\Java\jdk11.0.11(以 JDK 11.0.11 版本为例)。
- 配置环境变量:
-
- 安装完成后,需要配置系统环境变量,以便在任何目录下都能使用 Java 命令。
-
- 右键点击 “此电脑”(或 “我的电脑”),选择 “属性”。
-
- 在弹出的窗口中,点击 “高级系统设置”。
-
- 在 “系统属性” 窗口中,点击 “环境变量” 按钮。
-
- 在 “系统变量” 区域,找到 “Path” 变量,双击进行编辑。
-
- 在 “Path” 变量值的末尾添加 JDK 的 bin 目录路径,例如;C:\Program Files\Java\jdk11.0.11\bin(注意前面的分号是为了分隔不同的路径)。
-
- 点击 “确定” 保存设置。
- 验证安装:
-
- 按下 Win+R 键,打开 “运行” 对话框,输入 “cmd” 并回车,打开命令提示符。
-
- 在命令提示符中输入 “java -version”,如果安装成功,会显示 Java 的版本信息,例如:
java version "11.0.11" 2021-04-20 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode)
这表明 JDK 已经成功安装并配置好了。
(二)安装 Maven
Maven 是我们创建项目的关键工具,它依赖于 JDK,所以在安装 Maven 之前,请确保已经成功安装并配置了 JDK。以下是安装 Maven 的步骤:
- 下载 Maven:
-
- 打开浏览器,访问 Maven 官方网站的下载页面:Maven 下载。
-
- 在下载页面中,选择合适的 Maven 版本进行下载。通常,我们选择最新的稳定版本,下载apache-maven-3.8.6-bin.zip(以 3.8.6 版本为例)这种二进制压缩包。
- 解压 Maven:
-
- 将下载的压缩包解压到你希望安装 Maven 的目录,例如C:\apache-maven-3.8.6。解压后的目录结构包含bin、conf、lib等文件夹,其中bin目录存放着 Maven 的可执行文件,conf目录存放着 Maven 的配置文件。
- 配置环境变量:
-
- 同样在 “系统变量” 中,新建一个名为 “MAVEN_HOME” 的变量,变量值为 Maven 的安装目录,例如C:\apache-maven-3.8.6。
-
- 再次编辑 “Path” 变量,在其末尾添加;%MAVEN_HOME%\bin,这样系统就能找到 Maven 的可执行文件了。
- 验证安装:
-
- 打开命令提示符,输入 “mvn -version”,如果安装成功,会显示 Maven 的版本信息,例如:
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: C:\apache-maven-3.8.6
Java version: 11.0.11, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk11.0.11\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
这表明 Maven 已经成功安装并配置好了。
(三)选择开发工具(以 IDEA 为例)
开发工具的选择对于开发效率和代码质量有着重要影响。在众多 Java 开发工具中,IntelliJ IDEA 以其强大的功能、智能的代码提示和便捷的开发体验而备受开发者青睐。它不仅支持 Maven 项目的创建和管理,还提供了丰富的插件和扩展,能够满足各种开发需求。以下是下载和安装 IDEA 的步骤:
- 下载 IDEA:
-
- 打开浏览器,访问 IDEA 官方网站:IDEA 下载。
-
- IDEA 有两个版本可供选择:Ultimate(旗舰版)和 Community(社区版)。旗舰版功能全面,支持企业级开发和多种框架,但需要付费购买;社区版是免费开源的,适合个人开发者和小型项目,对于初学者来说已经足够使用。这里我们选择下载社区版。
-
- 根据你的操作系统选择对应的安装包进行下载,例如 Windows 系统下载.exe文件。
- 安装 IDEA:
-
- 下载完成后,双击安装程序开始安装。
-
- 在安装向导中,按照提示逐步完成安装过程。可以选择默认的安装路径,也可以自定义安装目录。
-
- 在安装过程中,你可以选择创建桌面快捷方式、关联 Java 文件等选项,根据个人需求进行设置。
- 启动 IDEA:
-
- 安装完成后,从桌面或开始菜单中找到 IDEA 的快捷方式,双击启动。
-
- 首次启动 IDEA 时,会出现一些设置向导,你可以根据自己的喜好进行设置,如主题、字体等。
通过以上步骤,我们完成了创建第一个 Maven 项目所需的准备工作,包括安装 Java JDK、安装 Maven 以及选择并安装开发工具 IDEA。这些准备工作为我们后续的项目创建和开发奠定了坚实的基础。
四、创建第一个 Maven 项目
(一)打开 IDEA 并创建新项目
- 首先,确保你已经成功安装并启动了 IntelliJ IDEA。如果你是首次打开 IDEA,会看到一个欢迎界面。如果你之前已经使用过 IDEA,并且有打开的项目,可以先关闭当前项目,回到欢迎界面。
- 在欢迎界面中,点击 “Create New Project”(创建新项目)选项,也可以在 IDEA 主界面中,点击菜单栏中的 “File”(文件),然后选择 “New”(新建),再点击 “Project”(项目)。
- 此时会弹出 “New Project”(新建项目)对话框,在左侧的项目类型列表中,选择 “Maven”。在右侧,你可以看到一些 Maven 项目的模板选项,默认情况下,IDEA 会勾选 “Create from archetype”(从原型创建),这里我们选择 “maven - archetype - quickstart” 模板,这个模板是 Maven 官方提供的一个简单项目模板,包含了基本的项目结构和文件,非常适合初学者快速上手。选择好模板后,点击 “Next”(下一步)按钮。
(二)填写项目信息
- 在接下来的界面中,需要填写项目的基本信息。
-
- GroupId:它是项目组的唯一标识符,通常采用公司或组织的域名反转形式。例如,如果你的公司域名为 “example.com”,那么 GroupId 可以设置为 “com.example”。这样的命名方式有助于避免不同项目之间的命名冲突,并且能够清晰地标识项目所属的组织。
-
- ArtifactId:它是项目的唯一标识符,通常是项目的名称。例如,你可以将其命名为 “my - first - maven - project”,这个名称会直接影响项目在本地仓库和远程仓库中的存储路径,以及项目打包后的文件名。
-
- Version:项目的版本号。在开发过程中,通常会使用 “1.0 - SNAPSHOT” 来表示这是一个开发中的版本,“SNAPSHOT” 表示该版本是不稳定的,会随着开发的进行不断更新。当项目发布时,需要将版本号修改为正式的版本号,如 “1.0.0”。
-
- Name:项目的显示名称,这个名称可以是任意你喜欢的描述性名称,主要用于在 IDE 中显示,方便你识别项目,它与项目的实际构建和运行没有直接关系。
-
- Description:项目的描述信息,你可以简要描述项目的功能、用途等,这有助于团队成员和其他开发者快速了解项目的背景和目标。
- 填写完上述信息后,点击 “Next”(下一步)按钮。
(三)设置 Maven 选项
- 在这一步,你需要配置 Maven 的相关选项。
-
- Maven home directory:Maven 的安装目录。如果 IDEA 已经自动检测到你之前安装的 Maven 路径,并且该路径正确,你可以直接使用默认值。如果检测到的路径不正确,或者你希望使用其他版本的 Maven,可以点击右侧的 “...” 按钮,手动选择 Maven 的安装目录。
-
- User settings file:Maven 的用户配置文件 settings.xml 的路径。默认情况下,IDEA 会使用 Maven 安装目录下 conf 文件夹中的 settings.xml 文件。你也可以根据自己的需求,指定其他自定义的 settings.xml 文件路径。例如,如果你在自己的用户目录下创建了一个自定义的 settings.xml 文件,用于配置私服地址、本地仓库路径等特殊设置,就可以在这里指定该文件的路径。
-
- Local repository:本地仓库的路径。Maven 会将下载的依赖库和插件存储在本地仓库中。默认情况下,IDEA 会使用 Maven 默认的本地仓库路径,即用户目录下的.m2/repository 文件夹。你可以根据磁盘空间和项目管理的需求,修改本地仓库的路径。例如,你可以将本地仓库设置在一个专门的磁盘分区中,以避免占用系统盘空间。
- 配置好这些选项后,点击 “Finish”(完成)按钮。
(四)等待项目创建完成
点击 “Finish” 后,IDEA 会根据你选择的模板和配置信息,创建 Maven 项目。这个过程中,IDEA 会自动下载项目所需的依赖和插件,这可能需要一些时间,具体时间取决于你的网络速度和项目依赖的大小。在下载过程中,你可以在 IDEA 的底部状态栏中看到下载进度和相关日志信息。
在项目创建过程中,可能会出现一些问题,例如:
- 网络问题:如果下载依赖时出现超时或连接失败的错误,可能是网络不稳定或无法访问 Maven 中央仓库。你可以检查网络连接,或者配置一个国内的镜像源,如阿里云的 Maven 镜像。具体方法是在 settings.xml 文件中添加以下镜像配置:
<mirrors>
<mirror>
<id>aliyunmaven</id>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
- 依赖冲突:如果项目依赖的多个库之间存在版本冲突,可能会导致项目无法正常构建。这种情况下,你需要仔细检查 pom.xml 文件中依赖的版本信息,尝试排除冲突的依赖,或者调整依赖的版本,使其相互兼容。例如,如果两个依赖都依赖于同一个库,但版本不同,你可以通过在 pom.xml 中使用<exclusions>标签来排除其中一个依赖中不需要的库版本,然后手动指定一个统一的版本。
- Maven 配置错误:如果在创建项目时出现与 Maven 配置相关的错误,如无法找到 settings.xml 文件或本地仓库路径错误,需要检查 Maven 的配置选项是否正确。确保 Maven 安装目录、settings.xml 文件路径和本地仓库路径都设置正确,并且没有拼写错误或权限问题。
耐心等待项目创建完成,当创建成功后,你将看到一个完整的 Maven 项目结构,包括 src/main/java(存放源代码)、src/test/java(存放测试代码)、src/main/resources(存放资源文件)、target(项目输出目录)和 pom.xml(项目核心配置文件)等目录和文件。
五、Maven 项目结构解析
当我们成功创建一个 Maven 项目后,打开项目目录,会看到一个清晰且规范的目录结构。这个结构是 Maven 遵循 “约定优于配置” 原则的体现,它让开发者无需过多的配置就能快速上手开发。下面我们来详细解析一下 Maven 项目的主要目录和文件。
(一)src/main/java
src/main/java目录是存放 Java 源代码的地方,它是项目的核心代码所在。在这个目录下,我们按照 Java 的包结构来组织代码文件。例如,我们在创建项目时填写的 GroupId 为 “com.example”,ArtifactId 为 “my - first - maven - project”,那么在src/main/java目录下,就会创建com/example/my - first - maven - project这样的包结构,项目的 Java 类文件就放在这个包路径下。
在这个目录中,我们可以创建各种 Java 类,包括业务逻辑类、工具类、服务类等。比如,我们创建一个简单的HelloWorld类,代码如下:
package com.example.myfirstmavenproject;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Maven!");
}
}
这个类位于src/main/java/com/example/myfirstmavenproject目录下,它是一个简单的 Java 应用程序,用于输出 “Hello, Maven!”。在实际开发中,src/main/java目录会包含大量的 Java 类文件,它们相互协作,实现项目的各种功能。
(二)src/main/resources
src/main/resources目录用于存放项目的资源文件,如配置文件、静态资源等。这些资源文件会被打包到最终的项目中,在运行时被读取和使用。常见的配置文件包括application.properties(用于配置 Spring Boot 项目的各种参数)、log4j.properties(用于配置日志记录)、xml配置文件(如 Spring 框架的配置文件)等。
假设我们的项目使用了日志记录功能,就可以在src/main/resources目录下创建一个log4j.properties文件,内容如下:
log4j.rootLogger=info,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
这个配置文件定义了日志的输出级别、输出目标(控制台)以及输出格式。在项目运行时,log4j框架会读取这个配置文件,按照配置进行日志记录。
除了配置文件,src/main/resources目录还可以存放一些静态资源,如图标、图片、模板文件等。例如,一个 Web 项目可能会在这个目录下存放一些用于页面展示的图标文件,或者一些邮件模板文件,方便在项目中使用。
(三)src/test/java
src/test/java目录是存放测试代码的地方。在这个目录下,我们同样按照包结构来组织测试类文件。测试代码的主要作用是对src/main/java目录下的源代码进行单元测试,确保代码的正确性和稳定性。通常,我们会使用 JUnit、TestNG 等测试框架来编写测试用例。
以 JUnit 为例,我们为前面的HelloWorld类编写一个测试类HelloWorldTest,代码如下:
package com.example.myfirstmavenproject;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class HelloWorldTest {
@Test
public void testHelloWorld() {
HelloWorld helloWorld = new HelloWorld();
// 这里可以添加更多的测试逻辑,比如调用HelloWorld类的其他方法并进行断言
assertNotNull(helloWorld);
}
}
这个测试类位于src/test/java/com/example/myfirstmavenproject目录下,它使用 JUnit 的@Test注解标记了一个测试方法testHelloWorld。在这个方法中,我们创建了HelloWorld类的实例,并使用assertNotNull方法断言实例不为空。通过编写这样的测试用例,我们可以在开发过程中及时发现代码中的问题,保证项目的质量。
(四)src/test/resources
src/test/resources目录用于存放测试相关的资源文件,这些文件主要是为测试代码提供支持,比如测试数据文件、测试配置文件等。与src/main/resources目录类似,src/test/resources目录下的文件也会被包含在测试类的类路径中,方便测试代码读取和使用。
例如,我们在进行数据库相关的测试时,可能需要一些测试数据来验证数据库操作的正确性。这时,我们可以在src/test/resources目录下创建一个testdata.sql文件,里面存放一些插入测试数据的 SQL 语句。在测试类中,我们可以通过读取这个文件,将测试数据插入到数据库中,然后进行数据库操作的测试。
(五)pom.xml
pom.xml是 Maven 项目的核心配置文件,它定义了项目的基本信息、依赖关系、构建配置等内容,对项目的构建和管理起着至关重要的作用。
- 项目基本信息:在pom.xml文件中,通过<groupId>、<artifactId>、<version>等标签定义项目的基本坐标。<groupId>通常是公司或组织的域名反转,用于唯一标识项目所属的组织;<artifactId>是项目的名称,用于唯一标识项目;<version>则表示项目的版本号。例如:
<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.example</groupId>
<artifactId>my-first-maven-project</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
这里定义了项目的 GroupId 为com.example,ArtifactId 为my - first - maven - project,版本号为1.0 - SNAPSHOT,表示这是一个开发中的版本。
- 依赖管理:pom.xml的一个重要功能是管理项目的依赖。通过<dependencies>标签,可以声明项目所需的各种依赖库。每个依赖项通过<dependency>标签来定义,其中包含<groupId>、<artifactId>和<version>,用于指定依赖库的坐标,还可以通过<scope>标签指定依赖的作用范围。例如,我们为项目添加 JUnit 依赖,用于编写测试用例:
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
这里添加了 JUnit 5 的两个依赖,junit - jupiter - api和junit - jupiter - engine,版本号为5.8.2,作用范围为test,表示这两个依赖只在测试阶段使用,不会被打包到最终的项目中。
- 插件配置:Maven 通过插件来完成各种构建任务,如编译、测试、打包等。在pom.xml文件中,可以通过<build>标签下的<plugins>标签来配置这些插件。例如,配置 Maven 编译插件,指定编译的 Java 版本:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
这里配置了maven - compiler - plugin插件,版本号为3.8.1,并在<configuration>标签中指定了编译的源版本和目标版本为 Java 11。通过这样的配置,Maven 在编译项目时,会使用指定版本的 Java 编译器进行编译。
- 其他配置:pom.xml还可以包含其他一些配置信息,如项目的名称、描述、开发者信息、仓库配置、构建配置等。例如,配置项目的名称和描述:
<name>My First Maven Project</name>
<description>This is my first Maven project, used to learn Maven basics.</description>
这些信息可以帮助其他开发者更好地了解项目的背景和用途。
pom.xml文件是 Maven 项目的核心,它通过各种配置信息,实现了项目的依赖管理、构建自动化以及其他相关的项目管理功能。熟练掌握pom.xml文件的配置,是使用 Maven 进行项目开发的关键。
相关文章:
创建第一个 Maven 项目(一)
一、引言 在 Java 开发的广袤天地中,Maven 宛如一位全能的管家,发挥着举足轻重的作用。它是一个基于项目对象模型(POM)的项目管理和构建自动化工具,极大地简化了 Java 项目的开发流程。 Maven 的核心优势之一在于其强…...
深度学习pytorch之19种优化算法(optimizer)解析
提示:有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法,包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等,通过对这些算法的公式和参数说明进行详细解析…...
C#贪心算法
贪心算法:生活与代码中的 “最优选择大师” 在生活里,我们常常面临各种选择,都希望能做出最有利的决策。比如在超市大促销时,面对琳琅满目的商品,你总想用有限的预算买到价值最高的东西。贪心算法,就像是一…...
SSH无密登录配置
SSH无密登录配置 1、在用户目录下创建.ssh目录 mkdir /home/atguigu/.ssh2、在.ssh目录下生成ssh秘钥(需要切换到Hadoop集群使用的用户,再运行命令) ssh-keygen -t rsa然后敲(三个回车),就会生成两个文件…...
Rust并发编程实践:10分钟入门系统级编程
目录 学前一问:Rust为何而出现? 摘要 引言 正文解析: 一、Rust中的并发编程基础 1.1 线程 1.2 协程 二、Rust并发编程的高级特性 2.1 通道 2.2 原子操作 2.3 锁 三、实例展示:优化并发编程性能 1. 并行计算 2. 异步…...
Linux 命令大全完整版(06)
2. 系统设置命令 pwunconv 功能说明:关闭用户的投影密码。语法:pwunconv补充说明:执行 pwunconv 指令可以关闭用户投影密码,它会把密码从 shadow 文件内,重回存到 passwd 文件里。 rdate(receive date) 功能说明&a…...
VSCode 中设置 Git 忽略仅因时间戳修改导致的文件变更【使用deepseek生成的一篇文章】
在 VSCode 中设置 Git 忽略仅因时间戳修改导致的文件变更,可通过以下步骤实现: 确认是否为纯时间戳修改 首先确认文件的修改是否仅涉及时间戳,使用终端运行: git diff -- <file>若输出为空但 Git 仍提示修改,可…...
echarts找不到了?echarts社区最新地址
前言:在之前使用echarts的时候,还可以通过上边的导航栏找到echarts社区,但是如今的echarts变更之后,就找不到echarts社区了。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 如今…...
Git-速查
Git 安装 Git 之后,你可以… 配置全局用户信息(推荐) 全局设置,创建本地仓库时默认分支名称为 main(你需要什么名称就该什么名称)【推荐配置为 main 】 git config --global init.defaultBranch main全…...
AxiosError: Network Error
不知怎么的,项目还在开发阶段,之前还好好的,玩儿了两天再一打开发现页面无法显示数据了,报错如下: 我以为是后端出问题了,但是后端控制台无报错,又用postman测试了一下,可以获取到数…...
ImGui 学习笔记(三)—— 隐藏主窗口窗口关闭检测
ImGui 的主窗口是平台窗口,默认是可见的,这会影响视觉效果。那么怎么隐藏 ImGui 的主窗口呢? 这很简单,但是需要针对后端做一些修改。 本文仅介绍在 glfwopengl3 和 win32dx11 两种实现上如何修改。 在 win32dx11 实现上&#…...
周末总结(2024/02/22)
工作 人际关系核心实践: 要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内,职场社交不要放在5min以外 职场的人际关系在面对利…...
SOME/IP--协议英文原文讲解11
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2.6 Er…...
Spring Boot 概要(官网文档解读)
Spring Boot 概述 Spring Boot 是一个高效构建 Spring 生产级应用的脚手架工具,它简化了基于 Spring 框架的开发过程。 Spring Boot 也是一个“构件组装门户”,何为构件组装门户呢?所谓的“构件组装门户”指的是一个对外提供的Web平台&#x…...
图像处理篇---图像处理中常见参数
文章目录 前言一、分贝(dB)的原理1.公式 二、峰值信噪比(PSNR, Peak Signal-to-Noise Ratio)1.用途2.公式3.示例 三、信噪比(SNR, Signal-to-Noise Ratio)1.用途2.公式3.示例 四、动态范围(Dyna…...
Win11更新系统c盘爆满处理
1.打开磁盘管理 2.右击c盘选择属性,进行磁盘管理,选择详细信息。 3.选择以前安装的文件删除即可释放c盘空间。...
C++关键字之mutable
1.介绍 在C中,mutable是一个关键字,用于修饰类的成员变量。它的主要作用是允许在常量成员函数或常量对象中修改被标记为mutable的成员变量。通常情况下,常量成员函数不能修改类的成员变量,但有些情况下,某些成员变量的…...
vue3 采用xlsx库实现本地上传excel文件,前端解析为Json数据
需求:本地上传excel 文件,但需要对excel 文件的内容进行解析,然后展示出来 1. 安装依赖 首先,确保安装了 xlsx 库: bash复制 npm install xlsx 2. 创建 Vue 组件 创建一个 Vue 组件(如 ExcelUpload.v…...
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解"管理"2.5 系统调用和…...
易语言模拟真人鼠标轨迹算法 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
PHP旅游门票预订系统小程序源码
🌍 旅游门票预订系统:一站式畅游新体验,开启您的梦幻旅程 🌟 一款基于ThinkPHPUniapp精心雕琢的旅游门票预订系统,正翘首以待,为您揭开便捷、高效、全面的旅游预订新篇章!它超越了传统预订平台…...
侯捷 C++ 课程学习笔记:内存管理的每一层面
目录 一、C 应用程序的内存管理架构 二、C 内存原语 三、内存管理的实际应用 四、学习心得 一、C 应用程序的内存管理架构 C 应用程序的内存管理架构可以分为多个层次,从应用程序到操作系统 API,每一层都提供了不同的内存管理功能。 架构图…...
Python开发Django面试题及参考答案
目录 Django 的请求生命周期是怎样的? Django 的 MTV 架构中的各个组件分别是什么? Django 的 URL 路由是如何工作的? Django 的视图函数和视图类有什么区别? Django 的模板系统是如何渲染 HTML 的? Django 的 ORM 是如何工作的? Django 的中间件是什么?它的作用是…...
前端js进阶,ES6语法,包详细
进阶ES6 作用域的概念加深对js理解 let、const申明的变量,在花括号中会生成块作用域,而var就不会生成块作用域 作用域链本质上就是底层的变量查找机制 作用域链查找的规则是:优先查找当前作用域先把的变量,再依次逐级找父级作用域直到全局…...
【三十四周】文献阅读:DeepPose: 通过深度神经网络实现人类姿态估计
目录 摘要AbstractDeepPose: 通过深度神经网络实现人类姿态估计研究背景创新点方法论归一化网络结构级联细化流程 代码实践局限性实验结果总结 摘要 人体姿态估计旨在通过图像定位人体关节,是计算机视觉领域的核心问题之一。传统方法多基于局部检测与图模型&#x…...
将 Vue 项目打包后部署到 Spring Boot 项目中的全面指南
将 Vue 项目打包后部署到 Spring Boot 项目中的全面指南 在现代 Web 开发中,前后端分离架构已经成为主流。然而,在某些场景下,我们可能需要将前端项目(如 Vue)与后端项目(如 Spring Boot)集成部…...
Linux 权限系统和软件安装(二):深入理解 Linux 权限系统
在 Linux 的世界里,权限系统犹如一位忠诚的卫士,严密守护着系统中的文件与目录,确保只有具备相应权限的用户才能进行操作。与其他一些操作系统不同,Linux 并不依据文件后缀名来标识文件的操作权限,而是构建了一套独特且…...
计算机网络常考大题
运输层的主要功能 运输层为应用进程之间提供端到端的逻辑通信。 运输层还要对收到的报文进行差错检测。 运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP 传输控制协议 TCP 概述 TCP 是面向连接的运输层协议。 每一条 TCP 连接只能有两个端点…...
百度首页上线 DeepSeek 入口,免费使用
大家好,我是小悟。 百度首页正式上线了 DeepSeek 入口,这一重磅消息瞬间在技术圈掀起了惊涛骇浪,各大平台都被刷爆了屏。 百度这次可太给力了,PC 端开放仅 1 小时,就有超千万人涌入体验。这速度,简直比火…...
《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战
前一篇文章,使用 AlexNet 实现图片分类 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于学习 9年后重读深度学习奠基作之一:AlexNet【下】【论文精读】】的心得。 《跟李沐…...
Linux搭建Nginx直播流媒体服务RTMP/RTSP转Http-flv视频浏览器在线播放/Vue/Java/ffmpeg
参考文章: https://blog.csdn.net/whatareyouding/article/details/144317654 https://www.cnblogs.com/Gredae/p/18362900 https://www.cnblogs.com/kn-zheng/p/17422707.html https://blog.51cto.com/u_16099344/10281495 https://www.tulingxueyuan.cn/tlzx/jsp…...
Node.js高频面试题精选及参考答案
目录 什么是 Node.js?它的主要特点有哪些? Node.js 的事件驱动和非阻塞 I/O 模型是如何工作的? 为什么 Node.js 适合处理高并发场景? Node.js 与传统后端语言(如 Java、Python)相比,有哪些优势和劣势? 简述 Node.js 的运行原理,包括 V8 引擎的作用。 什么是 Nod…...
公开整理-最新中国城市统计NJExcel+PDF版本(1985-2024年)
数据简介:《中国城市统计NJ》从1985年开始,本NJ内容共分四个部分:第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况;第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括人口、劳动力及土地资源、综合经济、工业、交通…...
ModuleNotFoundError: No module named ‘xgboost‘
问题: --------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) Cell In[1], line 64 import pickle5 from sklearn.metrics import mean_squared_error, r2_…...
应用层协议HTTP
应用层协议HTTP 引言 应用层协议是程序员自己制定的,但是良好的协议是保证网络通信的基础,前代的计算工程师已经帮助我们制定了一些很好用的应用层协议,http(hybertext transfer protocol)(超文本传输协议)就是其中之一。 http协议是客户端…...
常见的“锁”有哪些?
悲观锁 悲观锁认为在并发环境中,数据随时可能被其他线程修改,因此在访问数据之前会先加锁,以防止其他线程对数据进行修改。常见的悲观锁实现有: 1.互斥锁 原理:互斥锁是一种最基本的锁类型,同一时间只允…...
PAT 甲级 1091 Acute Stroke
一开始只是简单的递归(bfs),导致最后两个没法通过(爆栈了) //最后两个案例没有通过,只是最简单的bfs暴力算法 #include<cstdio> using namespace std; int v[62][1288][130]{0}; int find(int i,int…...
flowable适配达梦数据库
文章目录 适配相关问题无法从数据库产品名称“DM DBMS”中推断数据库类型分析解决 构建ibatis SqlSessionFactory时出错:inStream参数为null分析解决 liquibase相关问题问题一:不支持的数据库 Error executing SQL call current_schema: 无法解析的成员访…...
Git入门:数据模型 to 底层原理
版本控制系统(VCS)是软件开发中不可或缺的工具,而Git作为现代版本控制的事实标准,其底层设计远比表面命令更加优雅。本文将从数据模型的角度,揭示Git的核心工作原理。 Git的核心概念 1. 快照(Snapshot&am…...
Bootstrap Blazor UI 中 <Table> 组件 <TableColumn> 使用备忘01:EF Core 外码处理
应用场景:将外码转换为对应的文本进行显示、编辑。 例如,有一个【用户】表,其中有一个【用户类型ID】字段;另有一个【用户类型】表,包含【ID】、【名称】等字段。现在要求在 <Table> 组件显示列表中,…...
Redis过期数据处理
Redis缓存过期后数据还能恢复吗? Redis缓存过期后,数据通常会被删除,但可以通过以下几种方法尝试恢复数据: 1. 数据备份恢复 RDB 持久化恢复:Redis 提供了 RDB(Redis Database Backup)持久化…...
零基础学C/C++160——字符串
题目描述 给定两个由小写字母组成的字符串A和B,判断B中的字符是否全部在A中出现。 输入 输入为多组测试数据。 输入数据只有一行,包含2个字符串A和B,每个字符串后面有一个#字符标记(#不属于A或B),其中B…...
Spring Boot+Vue项目从零入手
Spring BootVue项目从零入手 一、前期准备 在搭建spring bootvue项目前,我们首先要准备好开发环境,所需相关环境和软件如下: 1、node.js 检测安装成功的方法:node -v 2、vue 检测安装成功的方法:vue -V 3、Visu…...
Linux 命令大全完整版(13)
5.文件管理命令 patch 功能说明:修补文件。语 法:patch [-bceEflnNRstTuvZ][-B <备份字首字符串>][-d <工作目录>][-D <标示符号>][-F <监别列数>][-g <控制数值>][-i <修补文件>][-o <输出文件>][-p &l…...
MySQL面试学习
MySQL 1.事务 事务的4大特性 事务4大特性:原子性、一致性、隔离性、持久性 原⼦性: 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么全不执行一致性: 执⾏事务前后,数据保持⼀…...
CentOS中shell脚本对多台机器执行下载安装
1.建立免密ssh连接 详情见这篇: CentOS建立ssh免密连接(含流程剖析)-CSDN博客 2.脚本编写 我这里只是简单写了个demo进行演示,如果服务器很多可以先暂存成文件再逐行读取host进行连接并执行命令 用node1去ssh连接node2和node…...
【Java】多线程和高并发编程(四):阻塞队列(上)基础概念、ArrayBlockingQueue
文章目录 四、阻塞队列1、基础概念1.1 生产者消费者概念1.2 JUC阻塞队列的存取方法 2、ArrayBlockingQueue2.1 ArrayBlockingQueue的基本使用2.2 生产者方法实现原理2.2.1 ArrayBlockingQueue的常见属性2.2.2 add方法实现2.2.3 offer方法实现2.2.4 offer(time,unit)方法2.2.5 p…...
C语言多人聊天室 ---chat(客户端聊天)
head.h #ifndef __HEAD_H #define __HEAD_H// 常用头文件 #include <stdio.h> #include <stdlib.h> #include <string.h>// 网络编程涉及的头文件 #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>#include <…...
设计模式教程:命令模式(Command Pattern)
1. 什么是命令模式? 命令模式(Command Pattern)是一种行为型设计模式。它将请求封装成一个对象,从而使你能够用不同的请求、队列和日志请求以及支持可撤销操作。 简单来说,命令模式通过把请求封装成对象的方式解耦了…...
【华三】STP的角色选举(一文讲透)
【华三】STP的角色选举 一、引言二、STP基础概念扫盲三、根桥选举过程详解四、根端口选举过程详解五、指定端口选举过程详解六、阻塞端口七、总结与配置建议七、附录**1. BPDU字段结构图(文字描述)****2. 华三STP常用命令速查表** 文章总结 一、引言 在…...