环境说明:
windows系统:11版本
idea版本:2023.3.2
Maven
介绍
Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型(POM),通过一组构建规则和约定来管理项目的构建,报告和文档。Maven 可以处理 Java 项目从构建、文档化到部署的整个生命周期。
特点
依赖管理:Maven 能够自动下载项目所需的库,并且处理这些库之间的依赖关系。它还能够解析版本冲突并选择合适的版本。
项目构建:自动画项目构建方式
统一的项目结构:提供标准统一的项目结构
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>标签,修改本地仓库路径
<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
<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环境是否配置成功
输入:
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-SNAPSHOT 。SNAPSHOT 版本是指尚未发布的版本,常用于开发中的版本 |
packaging | 表示项目的主要打包类型,默认是 jar。其他常见的打包类型包括 war(Web 应用程序)、ear(企业应用程序)、pom(项目描述符文件)等。 |
classifier | 这是一个可选的部分,用于区分具有相同 groupId、artifactId 和 version 的不同打包类型。例如,如果你有两个 JAR 文件,一个是普通的 JAR 文件,另一个是包含源代码的 JAR 文件,你可以分别为它们指定 null 和 sources 作为 classifier。 |
eg:
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<classifier>sources</classifier>
使用坐标
当你在 pom.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
<!-- 导入当前项目所需的所有依赖资源 -->
<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: 请求协议/版本
请求数据方式:
响应数据方式:
// 请求读取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();
}