后端开发-Maven

环境说明:

windows系统:11版本

idea版本:2023.3.2

Maven

介绍

Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型(POM),通过一组构建规则和约定来管理项目的构建,报告和文档。Maven 可以处理 Java 项目从构建、文档化到部署的整个生命周期。

特点

  1. 依赖管理:Maven 能够自动下载项目所需的库,并且处理这些库之间的依赖关系。它还能够解析版本冲突并选择合适的版本。

  2. 项目构建:自动画项目构建方式

  3. 统一的项目结构:提供标准统一的项目结构

Jar包

介绍

JAR(Java ARchive)是一种压缩文件格式,主要用于打包 Java 类和相关的元数据和资源(如图像、属性文件等)。JAR 文件格式本质上类似于 ZIP 格式,但它提供了额外的功能,比如对类路径的支持和数字签名能力。

用途

打包类和资源:

JAR 文件可以包含多个 .class 文件(编译后的 Java 字节码),以及相关的资源文件。这样可以将一个或多个相关的类文件打包成单个文件,便于管理和分发。
类路径管理:

JAR 文件可以被添加到 Java 应用程序的类路径中。这意味着当应用程序运行时,Java 虚拟机(JVM)会搜索类路径中的 JAR 文件来查找需要加载的类。
自包含应用程序:

通过使用 jar 工具的 mf 参数指定清单文件(Manifest file),可以在 JAR 文件中包含必要的元数据,使 JAR 文件成为自包含的应用程序。清单文件可以指定主类(Main-Class),这是应用程序的入口点。
签名:

JAR 文件可以被数字签名,这允许用户验证 JAR 文件的来源和完整性,确保没有被篡改过。

创建jar文件

  • 编译 Java 源代码生成 .class 文件。
  • 使用 jar 工具或者 IDE 中的功能来创建 JAR 文件。
  • 如果需要的话,可以使用 jar 工具的 -C 参数来指定目录,将目录下的所有文件打包进 JAR 文件。
  • 添加清单文件以指定主类或者其他元数据。
  • 对于需要签名的 JAR 文件,还需要使用 Java 的 jarsigner 工具来进行签名。

仓库:

用于存储资源,管理各种jar包。

  • 本地仓库:自己计算机上的一个目录
  • 中央仓库:由Maven团队维护的全球唯一的

(仓库地址:Central Repository:

  • 远程仓库(私服):一般由公司团队搭建的私有仓库

安装Maven

(IDEA集成了Maven,如果使用IDEA作为开发工具,这一步可以省略)

1.官网下载安装包:

Maven -- Welcome to Apache Mavenhttps://maven.apache.org/

2. 配置本地仓库:

找到conf文件夹下的settings.xml中的<localRepository>标签,修改本地仓库路径

XML 复制代码
<localRepository>
D:\Users\maven\apache-maven-3.6.1-bin\apache-maven-3.6.1\maven_repository
</localRepository>

3.配置阿里云私服:

修改conf文件夹下的settings.xml中的<mirrors>标签,为其添加如下子标签
仓库服务https://developer.aliyun.com/mvn/guide

XML 复制代码
<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

Maven环境配置

1.MAVEN_HOME变量

在设置中打开编辑系统环境变量

打开环境变量

在系统变量下,新建一个变量,变量名位MAVEN_HOME,变量值为maven的解压目录

2.加入path

在用户变量下新建%MAVEN_HOME%\bin

3.检查环境

查看maven环境是否配置成功

输入:

bash 复制代码
mvn -v

若能输出版本号,则说明配置成功

IDEA

创建maven项目

Maven坐标

介绍

在 Maven 中,"坐标"(Coordinates)是指定一个项目的唯一标识符集合。Maven 使用这些坐标来唯一确定一个库或项目的位置,这对于依赖管理和构建过程非常重要。

组成

组成 说明
groupId 表示项目的组织名或公司名。通常使用反向域名的形式来避免命名冲突,例如 com.example。
artifactId 表示项目中的具体模块或者组件的名字。例如,在一个名为 myproject 的 groupId 下,可能有 core, ui, service 等不同的 artifactId。
version 表示项目的版本号。版本号遵循一定的规则,如 1.0.0 或者 2.3.1-SNAPSHOTSNAPSHOT 版本是指尚未发布的版本,常用于开发中的版本
packaging 表示项目的主要打包类型,默认是 jar。其他常见的打包类型包括 war(Web 应用程序)、ear(企业应用程序)、pom(项目描述符文件)等。
classifier 这是一个可选的部分,用于区分具有相同 groupId、artifactId 和 version 的不同打包类型。例如,如果你有两个 JAR 文件,一个是普通的 JAR 文件,另一个是包含源代码的 JAR 文件,你可以分别为它们指定 null 和 sources 作为 classifier。

eg:

XML 复制代码
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<classifier>sources</classifier>

使用坐标

当你在 pom.xml 文件中声明依赖时,你需要提供完整的坐标来指定你要使用的库

XML 复制代码
<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>myproject</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

依赖配置

介绍

指当前项目运行所需要的jar包,一个项目可以引入多个依赖

pom.xml中依赖配置查询网址:

https://mvnrepository.com/

配置

  1. 在pom.xml中编写<dependencies>标签

2.在<dependencies>标签中使用<dependency>引入坐标

3.定义坐标的groupId,artifactId,version

XML 复制代码
<!-- 导入当前项目所需的所有依赖资源  -->
    <dependencies>
        <dependency>
            <!-- 组织名 -->
            <groupId>ch.qos.logback</groupId>
            <!-- 模块名 -->
            <artifactId>logback-classic</artifactId>
            <!-- 版本号 -->
            <version>1.2.3</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

依赖特点

依赖传递

1.依赖具有传递性:

直接依赖:在当前项目中通过依赖配置建立的依赖关系

间接依赖:被依赖的资源如果依赖其它资源,当前项目也和其它资源具有依赖关系

2.排除传递

排除依赖指主动断开依赖资源,被排除的资源无需指定版本

依赖范围

在Maven中,依赖范围是在pom.xml文件中通过<scope>元素定义的

1.Compile(编译)

这些依赖项是项目编译期间必需的,也是最常见的依赖范围。它们会被包含在编译类路径中,因此在编译源代码时会被使用到。
2.Provided(已提供)

类似于编译范围,但在运行时假设该依赖项会被容器或框架提供,因此不会打包到最终的应用程序中。例如,在Java Web应用中,Servlet API通常会被Web容器提供。
3.Runtime(运行时)

这些依赖项在编译期间不需要,但在运行应用程序时是必要的。例如,JDBC驱动通常只在运行时需要。
4.Test(测试)

测试范围的依赖项仅用于构建和运行测试代码,不会被包含在生产环境中。JUnit或Mockito这样的测试框架就属于此类。

生命周期

1. Clean 生命周期

Clean 生命周期主要用于清理项目,删除之前构建时生成的所有文件。这对于重新开始构建非常有用,以确保没有旧的输出影响新的构建。它包括以下几个阶段:

  • pre-clean: 执行任何必要的特殊清理前任务。
  • clean: 清除先前构建的所有输出。
  • post-clean: 清理之后的任务。

2. Default 生命周期

这是最常用的生命周期,涵盖了项目的构建过程,从源码编译到最后的部署。Default 生命周期包括但不限于:

  • validate: 验证项目是否正确,所有需要的资源都存在,并且系统处于稳定状态。
  • compile: 编译源代码。
  • test: 使用适当的单元测试/集成测试框架来测试编译后的代码。这些测试不允许失败。
  • package: 将编译好的代码打包成可分发的形式,如 JAR、WAR、EAR 文件等。
  • integration-test: 处理集成测试(如果必要的话)。
  • verify: 运行任何检查以验证包是否有效且符合质量要求。
  • install: 将包安装到本地存储库,以供其他项目作为依赖来使用。
  • deploy: 将最终的包复制到远程存储库,以与其他团队成员共享此包。

3. Site 生命周期

Site 生命周期用于生成项目文档,这些文档通常被称为站点。站点提供了关于项目的重要信息,比如报告和其他文档。

  • pre-site: 在生成站点之前做准备工作。
  • site: 生成项目站点文档。
  • post-site: 在站点生成之后的操作。
  • site-deploy: 将生成的站点文档部署到服务器上。

SpringBoot

创建项目:

1.在idea中用spring initializer的方式创建一个项目

2.会自动生成启动类Application

Http协议:

定义:

超文本传输协议,规定了浏览器和服务器之间数据传输的规则

Request Headers : 请求的数据

Response Headers: 响应的数据

请求行:

GET: 请求方式

/hello: 请求资源路径

HTTP/1.1: 请求协议/版本

请求数据方式:
响应数据方式:
复制代码
java 复制代码
 // 请求读取HTTP请求
        boolean requestOk = false;
        String first = reader.readLine(); // 读取请求行
        if (first.startsWith("GET / HTTP/1.")){
            requestOk = true; // 请求成功
        }
        // 从第二行开始读取请求头的信息
        for (;;) {
            String header = reader.readLine();
            if (header.isEmpty()) { // 空行,请求结束
                break;
            }
            System.out.println(header);
        }
​
        // 响应数据
        if (requestOk) {
            // 读取html文件,转换为字符串
            /*
                Server.class:这是指向Server类的Class对象的引用。
                getClassLoader():这个方法返回加载Server类的类加载器。类加载器负责加载类,并且也可以用来加载其他资源。
                getResourceAsStream(String path):这个方法根据给定的路径获取一个输入流。路径是相对于classpath的根目录。
             */
            InputStream is = Server.class.getClassLoader().getResourceAsStream("static/01.GET-POST.html");
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuilder data = new StringBuilder();
​
            String line = null;
            while ((line = br.readLine()) != null) {
                data.append(line);
            }
            br.close();
​
            int len = data.toString().getBytes(StandardCharsets.UTF_8).length;
            // 响应数据
            writer.write("HTTP/1.1 200 OK\r\n");
            writer.write("Connection: keep-alive\r\n");
            writer.write("Content-Type: text/html\r\n");
            writer.write("Content-Length: " + len + "\r\n");
            writer.write("\r\n");
            writer.write(data.toString());
            writer.flush();
        } else {
            writer.write("HTTP/1.0 404 Not Found\r\n");
            writer.write("Content-Length: 0\r\n");
            writer.write("\r\n");
            writer.flush();
        }
相关推荐
庞传奇31 分钟前
【LC】191. 位1的个数
java·数据结构·算法·leetcode
禁默2 小时前
深入浅出:Java 抽象类与接口
java·开发语言
小万编程3 小时前
【2025最新计算机毕业设计】基于SSM的医院挂号住院系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】
java·spring boot·毕业设计·计算机毕业设计·项目源码·毕设源码·java毕业设计
白宇横流学长3 小时前
基于Java的银行排号系统的设计与实现【源码+文档+部署讲解】
java·开发语言·数据库
123yhy传奇3 小时前
【学习总结|DAY027】JAVA操作数据库
java·数据库·spring boot·学习·mybatis
想要打 Acm 的小周同学呀3 小时前
亚信科技Java后端外包一面
java·求职·java后端
lishiming03087 小时前
TestEngine with ID ‘junit-jupiter‘ failed to discover tests 解决方法
java·junit·intellij-idea
HEU_firejef7 小时前
设计模式——工厂模式
java·开发语言·设计模式
Kobebryant-Manba7 小时前
单元测试学习2.0+修改私有属性
java·单元测试·log4j
fajianchen7 小时前
应用架构模式
java·开发语言