使用 VuePress。
parent
b18f48b652
commit
08e2818d3f
|
@ -0,0 +1,12 @@
|
|||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = false
|
||||
insert_final_newline = false
|
|
@ -0,0 +1,3 @@
|
|||
node_modules
|
||||
.temp
|
||||
.cache
|
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
File diff suppressed because it is too large
Load Diff
|
@ -1,43 +1,43 @@
|
|||
---
|
||||
title: Hello World
|
||||
date: 2020-03-18 16:05:50
|
||||
categories:
|
||||
- others
|
||||
---
|
||||
[Hexo](https://hexo.io/) 自带的一篇文章,里面介绍了 Hexo 的几个常用的命令。第一篇文章我就保留它的内容,以便日后使用时作为参考。同时以此为纪念。
|
||||
|
||||
<div style="text-align: right"> ZhouXY </div>
|
||||
|
||||
## 快点开始吧
|
||||
|
||||
### 新建文章
|
||||
|
||||
``` bash
|
||||
$ hexo new "My New Post"
|
||||
```
|
||||
|
||||
查看更多: [Writing](https://hexo.io/docs/writing.html)
|
||||
|
||||
### 启动服务器
|
||||
|
||||
``` bash
|
||||
$ hexo server
|
||||
```
|
||||
|
||||
查看更多: [Server](https://hexo.io/docs/server.html)
|
||||
|
||||
### 生成静态文件
|
||||
|
||||
``` bash
|
||||
$ hexo generate
|
||||
```
|
||||
|
||||
查看更多: [Generating](https://hexo.io/docs/generating.html)
|
||||
|
||||
### 部署到远程站点
|
||||
|
||||
``` bash
|
||||
$ hexo deploy
|
||||
```
|
||||
|
||||
查看更多: [Deployment](https://hexo.io/docs/one-command-deployment.html)
|
||||
---
|
||||
title: Hello World
|
||||
date: 2020-03-18 16:05:50
|
||||
categories:
|
||||
- others
|
||||
---
|
||||
[Hexo](https://hexo.io/) 自带的一篇文章,里面介绍了 Hexo 的几个常用的命令。第一篇文章我就保留它的内容,以便日后使用时作为参考。同时以此为纪念。
|
||||
|
||||
<div style="text-align: right"> ZhouXY </div>
|
||||
|
||||
## 快点开始吧
|
||||
|
||||
### 新建文章
|
||||
|
||||
``` bash
|
||||
$ hexo new "My New Post"
|
||||
```
|
||||
|
||||
查看更多: [Writing](https://hexo.io/docs/writing.html)
|
||||
|
||||
### 启动服务器
|
||||
|
||||
``` bash
|
||||
$ hexo server
|
||||
```
|
||||
|
||||
查看更多: [Server](https://hexo.io/docs/server.html)
|
||||
|
||||
### 生成静态文件
|
||||
|
||||
``` bash
|
||||
$ hexo generate
|
||||
```
|
||||
|
||||
查看更多: [Generating](https://hexo.io/docs/generating.html)
|
||||
|
||||
### 部署到远程站点
|
||||
|
||||
``` bash
|
||||
$ hexo deploy
|
||||
```
|
||||
|
||||
查看更多: [Deployment](https://hexo.io/docs/one-command-deployment.html)
|
|
@ -0,0 +1 @@
|
|||
# Hello VuePress
|
|
@ -1,227 +1,227 @@
|
|||
---
|
||||
title: 使用 Maven 创建 Spring MVC 项目
|
||||
date: 2020-11-11 15:52:52
|
||||
tags:
|
||||
- Spring
|
||||
- Spring MVC
|
||||
- Maven
|
||||
categories:
|
||||
- Spring
|
||||
---
|
||||
> Maven 可以用来创建 Java 项目,并管理依赖,创建出来的项目不依赖于特定的 IDE,可以用 Eclipse、IDEA 社区版、IDEA 旗舰版,甚至 VSCode 来开发。_(具体 VSCode 怎么配置 Java 开发环境,这里不再赘述)_
|
||||
|
||||
> Maven 创建项目时,需要从国外的服务器上下载项目的依赖、插件等,速度会很慢,甚至导致创建项目失败,具体如何配置,请参考我的另一篇博客 [Maven 的相关配置](http://zhouxy.xyz/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Maven-%E7%9A%84%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE/)。
|
||||
|
||||
## 一、创建 Java Web 项目
|
||||
|
||||
### 1. 使用 maven 创建 Java Web 项目
|
||||
|
||||
启动开发环境,用 Maven 创建项目,从原型中选择“maven-archetype-webapp”,再依次指定 groupId、artifactId 等信息,不同的 IDE 创建 Maven 项目的过程略有不同,但大同小异。
|
||||
|
||||
### 2. 完善目录结构
|
||||
|
||||
在 `main` 文件夹中创建 `java` 和 `resources` 两个文件夹;在 `src` 文件夹中创建 `test` 文件夹,并中其中也创建 `java` 和 `resources` 两个文件夹。
|
||||
|
||||
- ${basedir}/src/main/java 文件夹中创建 Java 包和类;
|
||||
- ${basedir}/src/main/resources 文件夹中存放静态文件;
|
||||
- ${basedir}/src/test/java 文件夹中创建项目的测试类,比如说 Junit 代码;
|
||||
- ${basedir}/src/test/resources 存放测试用的资源。
|
||||
|
||||
> 在 IDEA 中新建目录时,会有几个提示,因为 IDEA 通过 pom.xml 文件知道这是个 maven 项目,猜测并帮助你创建标准的 maven 项目骨架。这时候按住 shift 键,并按住下方向键,可将其全部选中,再按回车,即可一次性创建好所有文件夹并标记好,这样就不用一个一个创建并标记了。在 VSCode 中,并不会对项目中的文件夹进行标记(VSCode 的一些图标可能会根据文件名进行猜测),所以一个一个创建文件夹就完事了。
|
||||
|
||||
初始的项目路径如下:
|
||||
![初始项目结构](http://zhouxy.xyz/img/163635_48fc6498_6543055.png)
|
||||
我们需要完善其目录结构:
|
||||
![完善后的目录结构](http://zhouxy.xyz/img/164009_81ccdf56_6543055.png)
|
||||
|
||||
### 3. 添加 Servlet 和 JSP 的依赖包
|
||||
在 pom.xml 文件中的 `dependencies` 标签中添加 Servlet 和 JSP 的依赖:
|
||||
```xml
|
||||
<!-- Servlet -->
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>javax.servlet-api</artifactId>
|
||||
<version>4.0.1</version>
|
||||
</dependency>
|
||||
|
||||
<!-- JSP 和 标签库(用不着的话就不用导) -->
|
||||
<dependency>
|
||||
<groupId>javax.servlet.jsp</groupId>
|
||||
<artifactId>javax.servlet.jsp-api</artifactId>
|
||||
<version>2.3.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jstl</groupId>
|
||||
<artifactId>jstl</artifactId>
|
||||
<version>1.2</version>
|
||||
</dependency>
|
||||
```
|
||||
这样,一个 Java Web 项目就创建好了。
|
||||
|
||||
|
||||
## 二、配置 Spring MVC
|
||||
|
||||
### 1. 导入 Spring、Spring MVC 的依赖
|
||||
|
||||
在 pom.xml 文件中的 `dependencies` 标签中添加如下依赖:
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-webmvc</artifactId>
|
||||
<version>5.2.8.RELEASE</version>
|
||||
</dependency>
|
||||
```
|
||||
> 导入 spring-webmvc 好像就会自动导入 spring-aop、spring-beans、spring-context、spring-core、spring-expression、spring-web 这些个依赖。
|
||||
|
||||
### 2. 配置并启用 Spring MVC
|
||||
|
||||
以前(包括现在很多人)配置 Spring MVC 都是通过 web.xml 配置的,随着 Java 和 Spring 的发展,现在完全可以不使用 xml 配置并启用 Spring MVC。
|
||||
|
||||
下面的配置适用于 Spring 3.2 及以上版本(我写本文时,Spring 的版本已经是 5.2.9 了),且 Servlet 容器支持 Servlet 3.0(2009 年 12 月发布)。所以,你的开发环境大概率支持以下配置方法。
|
||||
|
||||
#### 2.1.1 创建 RootConfig 配置类
|
||||
|
||||
**RootConfig 类将用于非 web 部分的配置。** *本示例中重在与 Web 相关的配置,所以 `RootConfig` 相对简单,实际项目中将会有很多非 Web 的配置来充实完善 RootConfig。*
|
||||
|
||||
```java
|
||||
package xyz.zhouxy.chapter01.config;
|
||||
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.FilterType;
|
||||
import org.springframework.context.annotation.ComponentScan.Filter;
|
||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||
|
||||
@Configuration
|
||||
@ComponentScan(basePackages = "xyz.zhouxy.chapter01",
|
||||
excludeFilters = {
|
||||
@Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
|
||||
public class RootConfig {
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.1.2 创建 WebConfig 配置类
|
||||
|
||||
WebConfig 将用于 DispatcherServlet 应用程序上下文配置。
|
||||
|
||||
```java
|
||||
package xyz.zhouxy.chapter01.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.ViewResolver;
|
||||
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
|
||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
import org.springframework.web.servlet.view.InternalResourceViewResolver;
|
||||
|
||||
@Configuration
|
||||
@EnableWebMvc
|
||||
@ComponentScan("xyz.zhouxy.chapter01.web")
|
||||
public class WebConfig implements WebMvcConfigurer {
|
||||
|
||||
@Bean
|
||||
public ViewResolver viewResolver() {
|
||||
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
|
||||
resolver.setPrefix("/WEB-INF/views/");
|
||||
resolver.setSuffix(".jsp");
|
||||
resolver.setExposeContextBeansAsAttributes(true);
|
||||
return resolver;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
|
||||
configurer.enable();
|
||||
}
|
||||
}
|
||||
```
|
||||
- `@EnableWebMvc` 注解启动 Spring MVC;
|
||||
- `@ComponentScan` 启用组件扫描;所指定的包中的所有带有 `@Controller` 注解的类都会成为 Spring bean。
|
||||
- `viewResolver` 方法配置 JSP 视图解析器,将 `InternalResourceViewResolver` 类的实例声明为 bean;
|
||||
- 重写的 `configureDefaultServletHandling` 方法,通过调用 `DefaultServletHandlerConfigurer` 的 `enable()`,要求 `DispatcherServlet` 将对静态资源的请求转发到 Servlet 容器中默认的 Servlet 上,而不是使用 `DispatcherServlet` 本身来处理此类请求。
|
||||
|
||||
|
||||
> 《Spring 实战(第4版)》中,WebConfig 是继承自 `WebMvcConfigurerAdapter` 类,但当前的版本,该类已经过时,`WebConfig` 类实现 `WebMvcConfigurer` 接口即可。
|
||||
|
||||
#### 2.1.3 创建 WebAppInitializer 类
|
||||
|
||||
当我们创建了 `RootConfig` 和 `WebConfig` 配置类之后,怎么让它们应用于我们的项目呢?答案是通过写一个 `WebAppInitializer`。
|
||||
|
||||
`WebAppInitializer` 类继承自 `AbstractAnnotationConfigDispatcherServletInitializer`,所以它会自动地配置 `DispatcherServlet` 和 Spring 应用上下文,Spring 应用上下文会位于应用程序的 Servlet 上下文中。
|
||||
|
||||
```java
|
||||
package xyz.zhouxy.chapter01.config;
|
||||
|
||||
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
|
||||
|
||||
public class WebAppInitializer
|
||||
extends AbstractAnnotationConfigDispatcherServletInitializer {
|
||||
|
||||
@Override
|
||||
protected Class<?>[] getRootConfigClasses() {
|
||||
return new Class<?>[]{ RootConfig.class };
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class<?>[] getServletConfigClasses() {
|
||||
return new Class<?>[]{ WebConfig.class };
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getServletMappings() {
|
||||
return new String[] { "/" };
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
> **更多细节:**
|
||||
> 在 Servlet 3.0 环境中,容器会在类路径中查找 `javax.servlet.ServletContainerInitializer` 接口的实现类,找到的话,就用它来配置 Servlet 容器。Spring 的 `SpringServletContainerInitializer` 类即为该接口的实现类,`SpringServletContainerInitializer` 又会查找实现 `WebApplicationInitializer` 的类并将配置的任务交给它们来完成。
|
||||
>
|
||||
> Spring 3.2 中引入了一个便利的 `WebApplicationInitializer` 基础实现,也就是 `AbstractAnnotationConfigDispatcherServletInitializer`。
|
||||
>
|
||||
> 因为我们的 `WebAppInitializer` 继承自 `AbstractAnnotationConfigDispatcherServletInitializer`(同时也就实现了 `WebApplicationInitializer` 接口),因此当部署到 Servlet 3.0 容器中的时候,容器会自动发现它,并用它来配置 Servlet 上下文。
|
||||
|
||||
|
||||
## 三、使用 Spring MVC
|
||||
|
||||
前面我们已经配置好了 Spring MVC,接下来我们编写一个 Controller 来测试一下吧。
|
||||
|
||||
### 1. 创建页面
|
||||
在 ${basedir}/src/main/webapp/WEB-INF/ 文件夹中新建一个 `views` 文件夹,再在 `views` 文件夹中新建 `test.jsp` 文件:
|
||||
```html
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Test</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Test Page</h1>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
### 2. 创建 TestController
|
||||
```java
|
||||
package xyz.zhouxy.chapter01.web;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
||||
@Controller
|
||||
public class TestController {
|
||||
|
||||
@GetMapping("/test")
|
||||
public String toTestPage() {
|
||||
return "test";
|
||||
}
|
||||
}
|
||||
```
|
||||
### 3. 部署项目
|
||||
将项目部署到 Tomcat,应用上下文为 `chapter01`。
|
||||
> 不同 IDE 配置 Tomcat 部署项目具体细节找时间再写吧。
|
||||
|
||||
在浏览器输入 http://localhost:8080/chapter01/test ,由于上面的映射,`toTestPage()` 方法将被执行,它返回字符串“test”,被视作视图的名称,由 `WebConfig` 类中配置的视图解析器解析为具体的视图 `/WEB-INF/views/test.jsp`。
|
||||
---
|
||||
title: 使用 Maven 创建 Spring MVC 项目
|
||||
date: 2020-11-11 15:52:52
|
||||
tags:
|
||||
- Spring
|
||||
- Spring MVC
|
||||
- Maven
|
||||
categories:
|
||||
- Spring
|
||||
---
|
||||
> Maven 可以用来创建 Java 项目,并管理依赖,创建出来的项目不依赖于特定的 IDE,可以用 Eclipse、IDEA 社区版、IDEA 旗舰版,甚至 VSCode 来开发。_(具体 VSCode 怎么配置 Java 开发环境,这里不再赘述)_
|
||||
|
||||
> Maven 创建项目时,需要从国外的服务器上下载项目的依赖、插件等,速度会很慢,甚至导致创建项目失败,具体如何配置,请参考我的另一篇博客 [Maven 的相关配置](http://zhouxy.xyz/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Maven-%E7%9A%84%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE/)。
|
||||
|
||||
## 一、创建 Java Web 项目
|
||||
|
||||
### 1. 使用 maven 创建 Java Web 项目
|
||||
|
||||
启动开发环境,用 Maven 创建项目,从原型中选择“maven-archetype-webapp”,再依次指定 groupId、artifactId 等信息,不同的 IDE 创建 Maven 项目的过程略有不同,但大同小异。
|
||||
|
||||
### 2. 完善目录结构
|
||||
|
||||
在 `main` 文件夹中创建 `java` 和 `resources` 两个文件夹;在 `src` 文件夹中创建 `test` 文件夹,并中其中也创建 `java` 和 `resources` 两个文件夹。
|
||||
|
||||
- ${basedir}/src/main/java 文件夹中创建 Java 包和类;
|
||||
- ${basedir}/src/main/resources 文件夹中存放静态文件;
|
||||
- ${basedir}/src/test/java 文件夹中创建项目的测试类,比如说 Junit 代码;
|
||||
- ${basedir}/src/test/resources 存放测试用的资源。
|
||||
|
||||
> 在 IDEA 中新建目录时,会有几个提示,因为 IDEA 通过 pom.xml 文件知道这是个 maven 项目,猜测并帮助你创建标准的 maven 项目骨架。这时候按住 shift 键,并按住下方向键,可将其全部选中,再按回车,即可一次性创建好所有文件夹并标记好,这样就不用一个一个创建并标记了。在 VSCode 中,并不会对项目中的文件夹进行标记(VSCode 的一些图标可能会根据文件名进行猜测),所以一个一个创建文件夹就完事了。
|
||||
|
||||
初始的项目路径如下:
|
||||
![初始项目结构](http://zhouxy.xyz/img/163635_48fc6498_6543055.png)
|
||||
我们需要完善其目录结构:
|
||||
![完善后的目录结构](http://zhouxy.xyz/img/164009_81ccdf56_6543055.png)
|
||||
|
||||
### 3. 添加 Servlet 和 JSP 的依赖包
|
||||
在 pom.xml 文件中的 `dependencies` 标签中添加 Servlet 和 JSP 的依赖:
|
||||
```xml
|
||||
<!-- Servlet -->
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>javax.servlet-api</artifactId>
|
||||
<version>4.0.1</version>
|
||||
</dependency>
|
||||
|
||||
<!-- JSP 和 标签库(用不着的话就不用导) -->
|
||||
<dependency>
|
||||
<groupId>javax.servlet.jsp</groupId>
|
||||
<artifactId>javax.servlet.jsp-api</artifactId>
|
||||
<version>2.3.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jstl</groupId>
|
||||
<artifactId>jstl</artifactId>
|
||||
<version>1.2</version>
|
||||
</dependency>
|
||||
```
|
||||
这样,一个 Java Web 项目就创建好了。
|
||||
|
||||
|
||||
## 二、配置 Spring MVC
|
||||
|
||||
### 1. 导入 Spring、Spring MVC 的依赖
|
||||
|
||||
在 pom.xml 文件中的 `dependencies` 标签中添加如下依赖:
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-webmvc</artifactId>
|
||||
<version>5.2.8.RELEASE</version>
|
||||
</dependency>
|
||||
```
|
||||
> 导入 spring-webmvc 好像就会自动导入 spring-aop、spring-beans、spring-context、spring-core、spring-expression、spring-web 这些个依赖。
|
||||
|
||||
### 2. 配置并启用 Spring MVC
|
||||
|
||||
以前(包括现在很多人)配置 Spring MVC 都是通过 web.xml 配置的,随着 Java 和 Spring 的发展,现在完全可以不使用 xml 配置并启用 Spring MVC。
|
||||
|
||||
下面的配置适用于 Spring 3.2 及以上版本(我写本文时,Spring 的版本已经是 5.2.9 了),且 Servlet 容器支持 Servlet 3.0(2009 年 12 月发布)。所以,你的开发环境大概率支持以下配置方法。
|
||||
|
||||
#### 2.1.1 创建 RootConfig 配置类
|
||||
|
||||
**RootConfig 类将用于非 web 部分的配置。** *本示例中重在与 Web 相关的配置,所以 `RootConfig` 相对简单,实际项目中将会有很多非 Web 的配置来充实完善 RootConfig。*
|
||||
|
||||
```java
|
||||
package xyz.zhouxy.chapter01.config;
|
||||
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.FilterType;
|
||||
import org.springframework.context.annotation.ComponentScan.Filter;
|
||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||
|
||||
@Configuration
|
||||
@ComponentScan(basePackages = "xyz.zhouxy.chapter01",
|
||||
excludeFilters = {
|
||||
@Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
|
||||
public class RootConfig {
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.1.2 创建 WebConfig 配置类
|
||||
|
||||
WebConfig 将用于 DispatcherServlet 应用程序上下文配置。
|
||||
|
||||
```java
|
||||
package xyz.zhouxy.chapter01.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.ViewResolver;
|
||||
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
|
||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
import org.springframework.web.servlet.view.InternalResourceViewResolver;
|
||||
|
||||
@Configuration
|
||||
@EnableWebMvc
|
||||
@ComponentScan("xyz.zhouxy.chapter01.web")
|
||||
public class WebConfig implements WebMvcConfigurer {
|
||||
|
||||
@Bean
|
||||
public ViewResolver viewResolver() {
|
||||
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
|
||||
resolver.setPrefix("/WEB-INF/views/");
|
||||
resolver.setSuffix(".jsp");
|
||||
resolver.setExposeContextBeansAsAttributes(true);
|
||||
return resolver;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
|
||||
configurer.enable();
|
||||
}
|
||||
}
|
||||
```
|
||||
- `@EnableWebMvc` 注解启动 Spring MVC;
|
||||
- `@ComponentScan` 启用组件扫描;所指定的包中的所有带有 `@Controller` 注解的类都会成为 Spring bean。
|
||||
- `viewResolver` 方法配置 JSP 视图解析器,将 `InternalResourceViewResolver` 类的实例声明为 bean;
|
||||
- 重写的 `configureDefaultServletHandling` 方法,通过调用 `DefaultServletHandlerConfigurer` 的 `enable()`,要求 `DispatcherServlet` 将对静态资源的请求转发到 Servlet 容器中默认的 Servlet 上,而不是使用 `DispatcherServlet` 本身来处理此类请求。
|
||||
|
||||
|
||||
> 《Spring 实战(第4版)》中,WebConfig 是继承自 `WebMvcConfigurerAdapter` 类,但当前的版本,该类已经过时,`WebConfig` 类实现 `WebMvcConfigurer` 接口即可。
|
||||
|
||||
#### 2.1.3 创建 WebAppInitializer 类
|
||||
|
||||
当我们创建了 `RootConfig` 和 `WebConfig` 配置类之后,怎么让它们应用于我们的项目呢?答案是通过写一个 `WebAppInitializer`。
|
||||
|
||||
`WebAppInitializer` 类继承自 `AbstractAnnotationConfigDispatcherServletInitializer`,所以它会自动地配置 `DispatcherServlet` 和 Spring 应用上下文,Spring 应用上下文会位于应用程序的 Servlet 上下文中。
|
||||
|
||||
```java
|
||||
package xyz.zhouxy.chapter01.config;
|
||||
|
||||
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
|
||||
|
||||
public class WebAppInitializer
|
||||
extends AbstractAnnotationConfigDispatcherServletInitializer {
|
||||
|
||||
@Override
|
||||
protected Class<?>[] getRootConfigClasses() {
|
||||
return new Class<?>[]{ RootConfig.class };
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class<?>[] getServletConfigClasses() {
|
||||
return new Class<?>[]{ WebConfig.class };
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getServletMappings() {
|
||||
return new String[] { "/" };
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
> **更多细节:**
|
||||
> 在 Servlet 3.0 环境中,容器会在类路径中查找 `javax.servlet.ServletContainerInitializer` 接口的实现类,找到的话,就用它来配置 Servlet 容器。Spring 的 `SpringServletContainerInitializer` 类即为该接口的实现类,`SpringServletContainerInitializer` 又会查找实现 `WebApplicationInitializer` 的类并将配置的任务交给它们来完成。
|
||||
>
|
||||
> Spring 3.2 中引入了一个便利的 `WebApplicationInitializer` 基础实现,也就是 `AbstractAnnotationConfigDispatcherServletInitializer`。
|
||||
>
|
||||
> 因为我们的 `WebAppInitializer` 继承自 `AbstractAnnotationConfigDispatcherServletInitializer`(同时也就实现了 `WebApplicationInitializer` 接口),因此当部署到 Servlet 3.0 容器中的时候,容器会自动发现它,并用它来配置 Servlet 上下文。
|
||||
|
||||
|
||||
## 三、使用 Spring MVC
|
||||
|
||||
前面我们已经配置好了 Spring MVC,接下来我们编写一个 Controller 来测试一下吧。
|
||||
|
||||
### 1. 创建页面
|
||||
在 ${basedir}/src/main/webapp/WEB-INF/ 文件夹中新建一个 `views` 文件夹,再在 `views` 文件夹中新建 `test.jsp` 文件:
|
||||
```html
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>Test</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Test Page</h1>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
### 2. 创建 TestController
|
||||
```java
|
||||
package xyz.zhouxy.chapter01.web;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
||||
@Controller
|
||||
public class TestController {
|
||||
|
||||
@GetMapping("/test")
|
||||
public String toTestPage() {
|
||||
return "test";
|
||||
}
|
||||
}
|
||||
```
|
||||
### 3. 部署项目
|
||||
将项目部署到 Tomcat,应用上下文为 `chapter01`。
|
||||
> 不同 IDE 配置 Tomcat 部署项目具体细节找时间再写吧。
|
||||
|
||||
在浏览器输入 http://localhost:8080/chapter01/test ,由于上面的映射,`toTestPage()` 方法将被执行,它返回字符串“test”,被视作视图的名称,由 `WebConfig` 类中配置的视图解析器解析为具体的视图 `/WEB-INF/views/test.jsp`。
|
||||
![运行结果](http://zhouxy.xyz/img/233117_0a37d814_6543055.png "屏幕截图.png")
|
|
@ -1,42 +1,46 @@
|
|||
---
|
||||
title: 前端路由 history 模式刷新 404 的问题
|
||||
date: 2020-04-13 18:05:23
|
||||
tags:
|
||||
- 前端
|
||||
- 前端路由
|
||||
categories:
|
||||
- 前端
|
||||
---
|
||||
|
||||
> 能在官方文档中找到答案的问题,都是我们自己没认真看文档的问题。
|
||||
> <p align="right">——ZhouXY</p>
|
||||
|
||||
前段时间由于要做一个东西而接触了 Vue,这两天因为某些需要又开始接触 Angular,有那么一点点点点点的 Vue 的知识,看 Angular 的基础其实不算太吃力。
|
||||
|
||||
## 问题描述
|
||||
今天学习的过程中用到了路由,在开发环境中执行 `ng serve`,然后在浏览器上访问 `http://localhost:4200/test`,跑起来一切正常,但当我执行 `ng build` 进行构建并把它部署到 Nginx 中的时候就出事了。像 `http://example.com/test` 这种***深链接***,一刷新就 `404`。
|
||||
|
||||
上网找了一圈,几乎所有的博客、文章教程都是教怎么把路由改成 hash 模式的。我就纳闷了,路由提供了 history 模式,就用都不能用了?~~重点是,我真心觉得带`#`的地址好难看!~~ 在网上找了半天才反应过来我居然把最重要的官方文档给忘了……~~被自己蠢哭了 T^T~~
|
||||
|
||||
## 怎么解决
|
||||
官方文档讲的很清楚:
|
||||
> ### 带路由的应用必须以 index.html 作为后备页面
|
||||
> Angular 应用很适合用简单的静态 HTML 服务器提供服务。 你不需要服务端引擎来动态合成应用页面,因为 Angular 会在客户端完成这件事。
|
||||
>
|
||||
> 如果该应用使用 Angular 路由器,你就必须配置服务器,让它对不存在的文件返回应用的宿主页(index.html)。
|
||||
>
|
||||
> 带路由的应用应该支持“深链接”。 所谓深链接就是指一个 URL,它用于指定到应用内某个组件的路径。 比如,http://www.mysite.com/heroes/42 就是一个到英雄详情页面的深链接,用于显示 id: 42 的英雄。
|
||||
>
|
||||
> 当用户从运行中的客户端应用导航到这个 URL 时,这没问题。 Angular 路由器会拦截这个 URL,并且把它路由到正确的页面。
|
||||
>
|
||||
> 但是,当从邮件中点击链接或在浏览器地址栏中输入它或仅仅在英雄详情页刷新下浏览器时,所有这些操作都是由浏览器本身处理的,在应用的控制范围之外。 浏览器会直接向服务器请求那个 URL,路由器没机会插手。
|
||||
>
|
||||
> 静态服务器会在收到对 http://www.mysite.com/ 的请求时返回 index.html,但是会拒绝对 http://www.mysite.com/heroes/42 的请求, 并返回一个 404 - Not Found 错误,除非,它被配置成了返回 index.html。
|
||||
|
||||
具体不同的服务器改怎么配置,点击链接直接看[官方文档](https://angular.cn/guide/deployment#server-configuration)吧。
|
||||
|
||||
我记得之前学 Vue 的时候,Vue 的[官方文档](https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90)也提到了这一点,只不过当时我用的是 hash 模式,这次遇到这种问题没第一时间反应过来。~~再一次被自己蠢哭了。~~
|
||||
|
||||
---
|
||||
## 后记
|
||||
---
|
||||
title: 前端路由 history 模式刷新 404 的问题
|
||||
date: 2020-04-13 18:05:23
|
||||
tags:
|
||||
- 前端
|
||||
- 前端路由
|
||||
categories:
|
||||
- 前端
|
||||
---
|
||||
|
||||
# 前端路由 history 模式刷新 404 的问题
|
||||
|
||||
---
|
||||
|
||||
> 能在官方文档中找到答案的问题,都是我们自己没认真看文档的问题。
|
||||
> <p align="right">——ZhouXY</p>
|
||||
|
||||
前段时间由于要做一个东西而接触了 Vue,这两天因为某些需要又开始接触 Angular,有那么一点点点点点的 Vue 的知识,看 Angular 的基础其实不算太吃力。
|
||||
|
||||
## 问题描述
|
||||
今天学习的过程中用到了路由,在开发环境中执行 `ng serve`,然后在浏览器上访问 `http://localhost:4200/test`,跑起来一切正常,但当我执行 `ng build` 进行构建并把它部署到 Nginx 中的时候就出事了。像 `http://example.com/test` 这种***深链接***,一刷新就 `404`。
|
||||
|
||||
上网找了一圈,几乎所有的博客、文章教程都是教怎么把路由改成 hash 模式的。我就纳闷了,路由提供了 history 模式,就用都不能用了?~~重点是,我真心觉得带`#`的地址好难看!~~ 在网上找了半天才反应过来我居然把最重要的官方文档给忘了……~~被自己蠢哭了 T^T~~
|
||||
|
||||
## 怎么解决
|
||||
官方文档讲的很清楚:
|
||||
> ### 带路由的应用必须以 index.html 作为后备页面
|
||||
> Angular 应用很适合用简单的静态 HTML 服务器提供服务。 你不需要服务端引擎来动态合成应用页面,因为 Angular 会在客户端完成这件事。
|
||||
>
|
||||
> 如果该应用使用 Angular 路由器,你就必须配置服务器,让它对不存在的文件返回应用的宿主页(index.html)。
|
||||
>
|
||||
> 带路由的应用应该支持“深链接”。 所谓深链接就是指一个 URL,它用于指定到应用内某个组件的路径。 比如,http://www.mysite.com/heroes/42 就是一个到英雄详情页面的深链接,用于显示 id: 42 的英雄。
|
||||
>
|
||||
> 当用户从运行中的客户端应用导航到这个 URL 时,这没问题。 Angular 路由器会拦截这个 URL,并且把它路由到正确的页面。
|
||||
>
|
||||
> 但是,当从邮件中点击链接或在浏览器地址栏中输入它或仅仅在英雄详情页刷新下浏览器时,所有这些操作都是由浏览器本身处理的,在应用的控制范围之外。 浏览器会直接向服务器请求那个 URL,路由器没机会插手。
|
||||
>
|
||||
> 静态服务器会在收到对 http://www.mysite.com/ 的请求时返回 index.html,但是会拒绝对 http://www.mysite.com/heroes/42 的请求, 并返回一个 404 - Not Found 错误,除非,它被配置成了返回 index.html。
|
||||
|
||||
具体不同的服务器改怎么配置,点击链接直接看[官方文档](https://angular.cn/guide/deployment#server-configuration)吧。
|
||||
|
||||
我记得之前学 Vue 的时候,Vue 的[官方文档](https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90)也提到了这一点,只不过当时我用的是 hash 模式,这次遇到这种问题没第一时间反应过来。~~再一次被自己蠢哭了。~~
|
||||
|
||||
---
|
||||
## 后记
|
||||
官方文档永远都是最权威最完整的资料,能在官方文档中找到答案的问题,都是我们自己没认真看文档的问题。开发过程中一定要重视官方文档,可以省下去百度到处被误导的时间。
|
|
@ -1,28 +1,34 @@
|
|||
---
|
||||
title: VS Code 占用 CPU 100%
|
||||
date: 2020-03-25 10:03:26
|
||||
tags:
|
||||
- VS Code
|
||||
- 开发工具
|
||||
categories:
|
||||
- 开发工具
|
||||
---
|
||||
|
||||
VS Code 作为 Microsoft 开发的代码编辑器,免费、开源、跨平台,而且颜值高,关键是插件丰富,支持多种语言、IntelliSense 智能感知、强大的调试功能、内置 git 操作等等,让我对这款软件爱不释手,在这里跟网友安利一波。
|
||||
|
||||
VS Code 平时我用着也没什么问题,~~(可能是因为我平时项目小),~~不过最近需要用 Vue 写前端,使用 Vue CLI 新建了一个项目:
|
||||
```
|
||||
vue init webpack my-project
|
||||
```
|
||||
然后用 VS Code 打开,这下子不得了,电脑的 CPU 占用率居然到了 100%,风扇“转呀转呀转不停”,整个电脑变得特别卡。艰难地打开了任务管理器,在 VS Code 下看到了两个 `rg.exe` 的进程,CPU 基本上都是被它占满的。上网找了下,早在 2018 年就有人遇到了这个问题,~~话说这都 2020 年了,~~**解决方法是在设置里将 `Search: Follow Symlinks` 关掉**。
|
||||
|
||||
```json
|
||||
"search.followSymlinks": false
|
||||
```
|
||||
|
||||
|
||||
|
||||
> 相关链接:
|
||||
> Visual Studio Code 官网:<https://code.visualstudio.com>
|
||||
> Vue.js 官网:<https://cn.vuejs.org>
|
||||
|
||||
---
|
||||
title: VS Code 占用 CPU 100%
|
||||
date: 2020-03-25 10:03:26
|
||||
tags:
|
||||
- VS Code
|
||||
- 开发工具
|
||||
categories:
|
||||
- 开发工具/VS Code
|
||||
---
|
||||
|
||||
# VS Code 占用 CPU 100%
|
||||
|
||||
date: *2020-03-25 10:03:26*
|
||||
|
||||
---
|
||||
|
||||
VS Code 作为 Microsoft 开发的代码编辑器,免费、开源、跨平台,而且颜值高,关键是插件丰富,支持多种语言、IntelliSense 智能感知、强大的调试功能、内置 git 操作等等,让我对这款软件爱不释手,在这里跟网友安利一波。
|
||||
|
||||
VS Code 平时我用着也没什么问题,~~(可能是因为我平时项目小),~~不过最近需要用 Vue 写前端,使用 Vue CLI 新建了一个项目:
|
||||
```
|
||||
vue init webpack my-project
|
||||
```
|
||||
然后用 VS Code 打开,这下子不得了,电脑的 CPU 占用率居然到了 100%,风扇“转呀转呀转不停”,整个电脑变得特别卡。艰难地打开了任务管理器,在 VS Code 下看到了两个 `rg.exe` 的进程,CPU 基本上都是被它占满的。上网找了下,早在 2018 年就有人遇到了这个问题,~~话说这都 2020 年了,~~**解决方法是在设置里将 `Search: Follow Symlinks` 关掉**。
|
||||
|
||||
```json
|
||||
"search.followSymlinks": false
|
||||
```
|
||||
|
||||
|
||||
|
||||
> 相关链接:
|
||||
> Visual Studio Code 官网:<https://code.visualstudio.com>
|
||||
> Vue.js 官网:<https://cn.vuejs.org>
|
||||
|
|
@ -1,114 +1,114 @@
|
|||
---
|
||||
title: VSCode 运行 Spring Boot 项目时找不到主类的问题
|
||||
date: 2020-12-09 16:42:30
|
||||
tags:
|
||||
- VS Code
|
||||
- Spring
|
||||
- Spring Boot
|
||||
categories:
|
||||
- Spring Boot
|
||||
---
|
||||
|
||||
## 开发环境
|
||||
|
||||
VSCode 众多的插件极大地扩展了它的功能,使得它可以做很多开发,如 C/C++、Java、Python、Vue 等。有时候,我会拿它来做 Spring Boot 的开发。
|
||||
|
||||
我安装的插件有:
|
||||
- [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack)
|
||||
- [Java Extension Pack](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)
|
||||
|
||||
> 这两个扩展包中包含了必要的插件。
|
||||
|
||||
> 本文默认你已经安装配置好了 JDK 和 maven。
|
||||
|
||||
## 问题描述
|
||||
|
||||
当我们执行了 maven 的 clean 操作之后,点击 `main` 函数上面的 `run` 视图运行项目时,会出现“找不到主类”的问题,如下所示:
|
||||
```
|
||||
错误: 找不到或无法加载主类 xyz.zhouxy.demo.DemoApplication
|
||||
原因: java.lang.ClassNotFoundException: xyz.zhouxy.demo.DemoApplication
|
||||
```
|
||||
|
||||
## 问题分析
|
||||
|
||||
这是因为,当我们执行 clean 之后,target 文件夹被删除了,也就是编译后的 class 文件都被删掉了,所以当我们点击 run 试图运行项目时,Java 找不到主类。
|
||||
|
||||
### 为什么 IDEA 不会出现这种问题?
|
||||
|
||||
IDEA 默认在运行项目之前,有一个 build 的过程。我们打开“运行/调试配置”窗口可以看到,在“执行前”列表中有一个“构建”,如果我们按下方的减号(-)把它去掉,并执行 `mvn clean`,点击“运行”或者“调试”按钮的话,也会同样“找不到主类”。
|
||||
|
||||
## 解决方法
|
||||
|
||||
我们可以在运行项目前,先执行 `mvn compile` 命令,或者打开 pom.xml 文件,然后右键,点击“Update Project”,完成对项目的编译。
|
||||
|
||||
## 配置
|
||||
|
||||
每次运行项目之前都得先执行编译命令,这样的开发体验并不好,我们可以通过 VSCode 的一些配置来解决。
|
||||
|
||||
### 1. 配置 launch.json
|
||||
|
||||
如果你安装前面所说装好了插件,那么在左侧的资源管理器面板中,应该会出现一个 **SPRING-BOOT DASHBOARD** 面板,上面列出了当前 Spring Boot 项目的名称,在改项目名称上右键,点击“start”。
|
||||
|
||||
这时候,如果你的项目已经编译好的话,则可以在下方的“调试控制台”看到输出;如果你执行了 `mvn clean` 的话,也可以在“调试控制台”看到讨厌的“找不到主类”。
|
||||
|
||||
实际上,你会发现在项目中多了一个 `.vscode` 文件夹,里面有一个 `launch.json` 文件,内容类似于下面这样:
|
||||
```JSON
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"type": "java",
|
||||
"name": "Spring Boot-DemoApplication<demo>",
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "internalConsole",
|
||||
"mainClass": "xyz.zhouxy.demo.DemoApplication",
|
||||
"projectName": "demo",
|
||||
"args": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
其中,mainClass 和 projectName 的值会与这里的不同,是插件根据你的项目生成的,不用改。我们要做的是,在 `args` 后面再添加一个 `preLaunchTask` 属性,值为 `"build"`:
|
||||
```JSON
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"type": "java",
|
||||
"name": "Spring Boot-DemoApplication<demo>",
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "internalConsole",
|
||||
"mainClass": "xyz.zhouxy.demo.DemoApplication",
|
||||
"projectName": "demo",
|
||||
"args": "",
|
||||
"preLaunchTask": "build"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
也就是说,我们希望在运行/调试这个项目之前,都执行一遍 `build` 这个任务。`build` 的具体内容,则是在 tasks.json 中配置的。
|
||||
|
||||
### 2. 配置 tasks.json
|
||||
|
||||
在 `.vscode` 文件夹中,新建一个名为 `tasks.json` 的文件,内容如下:
|
||||
```JSON
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"options": {
|
||||
"cwd": "${workspaceRoot}"
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"label": "build",
|
||||
"type": "shell",
|
||||
"command": "mvn clean compile"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
我们在其中配置了一个名为 `build` 的任务,让它在 shell 中执行 `mvn clean compile` 命令,这样在每次运行/调试项目之前,都会在“**终端**”中执行一次 `mvn clean compile` 命令,而 Spring Boot 的输出,会在“调试控制台”显示。
|
||||
|
||||
> 其实,launch.json 中的 `console` 属性的值,我们可以配置为 `integratedTerminal`,这样 Spring Boot 的输出也会在终端中显示,但我还是建议 `console` 的值保持为 `internalConsole`,因为它可以设置筛选器,过滤出需要的输出。
|
||||
|
||||
---
|
||||
title: VSCode 运行 Spring Boot 项目时找不到主类的问题
|
||||
date: 2020-12-09 16:42:30
|
||||
tags:
|
||||
- VS Code
|
||||
- Spring
|
||||
- Spring Boot
|
||||
categories:
|
||||
- Spring Boot
|
||||
---
|
||||
|
||||
## 开发环境
|
||||
|
||||
VSCode 众多的插件极大地扩展了它的功能,使得它可以做很多开发,如 C/C++、Java、Python、Vue 等。有时候,我会拿它来做 Spring Boot 的开发。
|
||||
|
||||
我安装的插件有:
|
||||
- [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack)
|
||||
- [Java Extension Pack](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)
|
||||
|
||||
> 这两个扩展包中包含了必要的插件。
|
||||
|
||||
> 本文默认你已经安装配置好了 JDK 和 maven。
|
||||
|
||||
## 问题描述
|
||||
|
||||
当我们执行了 maven 的 clean 操作之后,点击 `main` 函数上面的 `run` 视图运行项目时,会出现“找不到主类”的问题,如下所示:
|
||||
```
|
||||
错误: 找不到或无法加载主类 xyz.zhouxy.demo.DemoApplication
|
||||
原因: java.lang.ClassNotFoundException: xyz.zhouxy.demo.DemoApplication
|
||||
```
|
||||
|
||||
## 问题分析
|
||||
|
||||
这是因为,当我们执行 clean 之后,target 文件夹被删除了,也就是编译后的 class 文件都被删掉了,所以当我们点击 run 试图运行项目时,Java 找不到主类。
|
||||
|
||||
### 为什么 IDEA 不会出现这种问题?
|
||||
|
||||
IDEA 默认在运行项目之前,有一个 build 的过程。我们打开“运行/调试配置”窗口可以看到,在“执行前”列表中有一个“构建”,如果我们按下方的减号(-)把它去掉,并执行 `mvn clean`,点击“运行”或者“调试”按钮的话,也会同样“找不到主类”。
|
||||
|
||||
## 解决方法
|
||||
|
||||
我们可以在运行项目前,先执行 `mvn compile` 命令,或者打开 pom.xml 文件,然后右键,点击“Update Project”,完成对项目的编译。
|
||||
|
||||
## 配置
|
||||
|
||||
每次运行项目之前都得先执行编译命令,这样的开发体验并不好,我们可以通过 VSCode 的一些配置来解决。
|
||||
|
||||
### 1. 配置 launch.json
|
||||
|
||||
如果你安装前面所说装好了插件,那么在左侧的资源管理器面板中,应该会出现一个 **SPRING-BOOT DASHBOARD** 面板,上面列出了当前 Spring Boot 项目的名称,在改项目名称上右键,点击“start”。
|
||||
|
||||
这时候,如果你的项目已经编译好的话,则可以在下方的“调试控制台”看到输出;如果你执行了 `mvn clean` 的话,也可以在“调试控制台”看到讨厌的“找不到主类”。
|
||||
|
||||
实际上,你会发现在项目中多了一个 `.vscode` 文件夹,里面有一个 `launch.json` 文件,内容类似于下面这样:
|
||||
```JSON
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"type": "java",
|
||||
"name": "Spring Boot-DemoApplication<demo>",
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "internalConsole",
|
||||
"mainClass": "xyz.zhouxy.demo.DemoApplication",
|
||||
"projectName": "demo",
|
||||
"args": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
其中,mainClass 和 projectName 的值会与这里的不同,是插件根据你的项目生成的,不用改。我们要做的是,在 `args` 后面再添加一个 `preLaunchTask` 属性,值为 `"build"`:
|
||||
```JSON
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"type": "java",
|
||||
"name": "Spring Boot-DemoApplication<demo>",
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "internalConsole",
|
||||
"mainClass": "xyz.zhouxy.demo.DemoApplication",
|
||||
"projectName": "demo",
|
||||
"args": "",
|
||||
"preLaunchTask": "build"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
也就是说,我们希望在运行/调试这个项目之前,都执行一遍 `build` 这个任务。`build` 的具体内容,则是在 tasks.json 中配置的。
|
||||
|
||||
### 2. 配置 tasks.json
|
||||
|
||||
在 `.vscode` 文件夹中,新建一个名为 `tasks.json` 的文件,内容如下:
|
||||
```JSON
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"options": {
|
||||
"cwd": "${workspaceRoot}"
|
||||
},
|
||||
"tasks": [
|
||||
{
|
||||
"label": "build",
|
||||
"type": "shell",
|
||||
"command": "mvn clean compile"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
我们在其中配置了一个名为 `build` 的任务,让它在 shell 中执行 `mvn clean compile` 命令,这样在每次运行/调试项目之前,都会在“**终端**”中执行一次 `mvn clean compile` 命令,而 Spring Boot 的输出,会在“调试控制台”显示。
|
||||
|
||||
> 其实,launch.json 中的 `console` 属性的值,我们可以配置为 `integratedTerminal`,这样 Spring Boot 的输出也会在终端中显示,但我还是建议 `console` 的值保持为 `internalConsole`,因为它可以设置筛选器,过滤出需要的输出。
|
||||
|
||||
现在,不论你 **点击主函数上的 run 或者 debug**、**在运行面板中点击运行按钮**,还是**在 SPRING-BOOT DASHBOARD 面板中点击运行项目**,都会调用 maven 进行编译,然后再运行。
|
|
@ -0,0 +1,129 @@
|
|||
---
|
||||
date: 2023-02-23
|
||||
---
|
||||
# Git 工作流
|
||||
|
||||
## 0. 创建仓库
|
||||
| | |
|
||||
| -------- | ---- |
|
||||
| 主分支 | main |
|
||||
| 开发分支 | dev |
|
||||
|
||||
## 1. 创建新特性
|
||||
### 1.1 创建 feature 分支
|
||||
```
|
||||
git flow feature start new-feature
|
||||
```
|
||||
Coding and commit...
|
||||
|
||||
> **远程 feature 分支**
|
||||
> ```
|
||||
> git push orgin feature/new-feature
|
||||
> ```
|
||||
> - 该远程分支只是为了同步工作而已,如果没有这方面的需要,等到需要 Pull Request 时创建一个临时的分支即可。
|
||||
> - 其他成员可以将仓库 fork 到 Ta 自己的仓库,并创建分支进行开发,PR 时将 Ta 自己的远程分支合并到项目仓库的 main。
|
||||
|
||||
### 1.2 完成新特性分支
|
||||
|
||||
#### 1.2.1 变基远程 dev 最新的更改到 feature 分支(可选)
|
||||
拉取远程最新(main 和)dev
|
||||
```
|
||||
git pull origin main # 可选
|
||||
git pull origin dev
|
||||
```
|
||||
|
||||
变基到本地 feature 分支
|
||||
```
|
||||
git checkout feature/new-feature
|
||||
git rebase dev
|
||||
```
|
||||
#### 1.2.2 提交 Pull Request
|
||||
|
||||
1. 推送远程分支:
|
||||
```
|
||||
git push orgin feature/new-feature
|
||||
```
|
||||
或
|
||||
```
|
||||
git push --force orgin feature/new-feature
|
||||
```
|
||||
2. 提交一个 Pull Request,项目管理者可使用 `squash and merge` 将分支上的多个提交合并为 dev 上的一个提交;
|
||||
3. 删除远程的 feature 分支:
|
||||
```
|
||||
git push orgin -d feature/new-feature
|
||||
```
|
||||
4. 更新本地的(main 和)dev 分支:
|
||||
```
|
||||
git pull origin main # 可选
|
||||
git pull origin dev
|
||||
```
|
||||
5. 删除本地 feature 分支:
|
||||
```
|
||||
git checkout dev
|
||||
git branch -d feature/new-feature
|
||||
```
|
||||
|
||||
## 2. bugfix
|
||||
|
||||
流程基本和 feature 一样。
|
||||
|
||||
```
|
||||
git flow bugfix start issue-msg
|
||||
git push orgin bugfix/issue-msg
|
||||
```
|
||||
|
||||
> 这里的 bugfix 指的是发布正式版本前需要修复的 bug。
|
||||
|
||||
> 此时 main 的 版本号为 x.x.x-SNAPSHOT,不断合并不同的 feature 和 bugfix。
|
||||
|
||||
## 3. 发布正式版本
|
||||
|
||||
**规约:版本号格式为:主版本号.次版本号.修订号**
|
||||
|
||||
> 假设现在发布 `0.1.0`。
|
||||
|
||||
发布前,确定未合并到 dev 的 bugfix 和 feature 是为下一个版本准备的。
|
||||
|
||||
1. 创建发布分支:
|
||||
```
|
||||
git flow release start 0.1.0
|
||||
```
|
||||
2. 做发布前的准备 *(包括 test、fix、以及可能存在的几次预发布,`0.1.0-SNAPSHOT` -> `0.1.0-rc1` -> `0.1.0-rc2` -> `0.1.0`)* ;
|
||||
3. 创建版本分支并将 release 合并到 dev 和 main:
|
||||
```
|
||||
git checkout release/0.1.0
|
||||
git branch v0.1.x
|
||||
git push orgin v0.1.x
|
||||
git flow release finish 0.1.0
|
||||
```
|
||||
4. 修改 dev 的版本号为 `0.2.0-SNAPSHOT`;
|
||||
5. 推送 main 和 dev 到远程:
|
||||
```
|
||||
git push orgin main --tags
|
||||
git push orgin dev --tags
|
||||
```
|
||||
|
||||
> 预发布时的代码修改,可以直接提交。也可以创建新的 bugfix 分支修复 bug 后合并回 release 分支,但该修复分支其它分支可以不需要知道,只要最后随着 release 合并回 main 和 dev 就好。
|
||||
|
||||
> `v0.1.0` 分支此时的版本号为 `0.1.0`;
|
||||
> `main` 的版本号为 `0.2.0-SNAPSHOT`,为发布 `0.2.0` 做准备,直到创建 `v0.2.x` 分支发布 `0.2.0`。
|
||||
|
||||
## 4. hotfix
|
||||
|
||||
### 4.1 多版本修复
|
||||
hotfix 用于修复当前支持的发布版本中需要修复的 bug,如果与其它支持中的版本兼容,则也将其合并到该发布分支中。
|
||||
|
||||
1. 如果没有 issue 则自行创建;
|
||||
2. 基于 main 上合适的某次提交创建分支 hotfix/issue-name,该节点为需要应用的最后一个版本分支签出时的节点;
|
||||
3. 修复 bug,提交时描述可包含 `fixed #issue-code`;
|
||||
4. 发布分支:`git push origin hotfix/issue-name`;
|
||||
5. 提交 Pull Request 到 main、dev 和需要应用的版本分支;
|
||||
6. 删除该 hotfix 分支:
|
||||
```
|
||||
git branch -d hotfix/issue-name
|
||||
git push origin --delete hotfix/issue-name
|
||||
```
|
||||
7. 各版本分支各自修订号加一(`0.1.0` -> `0.1.1`),提交,加 tag,推送;
|
||||
|
||||
### 4.2 单版本修复
|
||||
各版本分支可创建各自的 hotfix 分支修复 bug,不影响其它版本分支。
|
|
@ -1,104 +1,104 @@
|
|||
---
|
||||
title: Maven 的相关配置
|
||||
date: 2020-09-29 20:51:38
|
||||
tags:
|
||||
- 开发工具
|
||||
- Maven
|
||||
categories:
|
||||
- 开发工具
|
||||
---
|
||||
> Apache Maven,是一个软件(特别是 Java 软件)项目管理及自动构建工具,由 Apache 软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven 利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
|
||||
>
|
||||
> Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
|
||||
>
|
||||
> <p style="text-align:right;">——《维基百科》</p>
|
||||
|
||||
由于众所周知的原因,Maven 下载东西的时候总会特别慢,直到失败。下面列出几个常见配置:
|
||||
|
||||
## 一、将 archetypeCatalog 参数设为 internal
|
||||
|
||||
在 maven 的 VM Options 加上 -DarchetypeCatalog=internal 参数。
|
||||
|
||||
- IntelliJ IDEA : 设置中的 **Build, Execution, Deployment** -> **Build Tools** -> **Maven** -> **Runner** 的 VM Options 中输入 `-DarchetypeCatalog=internal`。
|
||||
- VS Code : 设置中的 **扩展** -> **Maven for Java** -> Maven > Executable: **Options** 中输入 `-DarchetypeCatalog=internal`。
|
||||
|
||||
---
|
||||
|
||||
## 二、配置阿里云镜像
|
||||
|
||||
### 1. 为单个项目配置阿里云镜像
|
||||
|
||||
我们可以在项目的 pom.xml 文件的 project 节点中为该项目单独配置阿里云镜像,如下所示:
|
||||
|
||||
```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
|
||||
https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
...
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>aliyun</id>
|
||||
<url>https://maven.aliyun.com/repository/public</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>aliyun-plugin</id>
|
||||
<url>https://maven.aliyun.com/repository/public</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
...
|
||||
</project>
|
||||
```
|
||||
|
||||
这样,当我们从 git 上拉取项目之后,就可以直接使用阿里云的镜像。
|
||||
|
||||
> 注意:别忘了 pluginRepositories 节点的配置。网上不少文章只介绍了 repositories 的配置,但是这样可能会出现依赖包从阿里云下载,而 Maven 插件依旧从 repo.maven.apache.org 下载的情况,最终下载缓慢甚至报错。
|
||||
|
||||
### 2. 修改 Maven 的配置文件
|
||||
|
||||
我们还可以修改 Maven 安装目录下 `conf` 文件夹中的 `settings.xml` 文件,找到其中的 `mirrors` 节点,在其中添加如下配置:
|
||||
|
||||
```xml
|
||||
<mirror>
|
||||
<id>alimaven</id>
|
||||
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
|
||||
<name>aliyun maven</name>
|
||||
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
|
||||
</mirror>
|
||||
```
|
||||
|
||||
> 一些软件默认会去使用 `${用户文件夹}/.m2/settings.xml` 配置文件,我们可以手动指定 settings.xml 文件的路径。我个人的做法是干脆将修改后的 `settings.xml` 拷贝一份到 .m2 文件夹中,这样不管哪个软件从哪里加载配置文件,都是一样的内容。
|
||||
|
||||
---
|
||||
|
||||
## 三、本地仓库
|
||||
|
||||
Maven 默认的本地仓库位于 `个人文件夹\.m2\repository`,比如 `C:\Users\zhouxy\.m2\repository`、`~\.m2\repository`,这个我一般就不去修改了。总之下载过的依赖都会放在这里,而每次创建、打开项目,Maven 都会先从这里寻找依赖。你也可以在 settings.xml 中修改这个路径。
|
||||
|
||||
在 `settings` 的开始标签下面就有被注释的内容说明如何配置,也就是在 `settings` 节点中添加如下代码:
|
||||
|
||||
```xml
|
||||
<localRepository>D:/ZhouXY/.m2/repository</localRepository>
|
||||
```
|
||||
|
||||
这样 maven 就会把 `D:/ZhouXY/.m2/repository` 这个目录当成本地仓库,你可以替换成你自己的文件夹。
|
||||
|
||||
## 随便说点什么
|
||||
|
||||
好久没更新博客了,最近在学 Spring,由于有点赶时间,所以笔记没有整理得很整齐,示例程序也零零散散,等有时间整理好了,再一并发布吧。
|
||||
|
||||
另外,博客换了个主题,有些东西还没配置好,就先这样将就吧。
|
||||
---
|
||||
title: Maven 的相关配置
|
||||
date: 2020-09-29 20:51:38
|
||||
tags:
|
||||
- 开发工具
|
||||
- Maven
|
||||
categories:
|
||||
- 开发工具/Maven
|
||||
---
|
||||
> Apache Maven,是一个软件(特别是 Java 软件)项目管理及自动构建工具,由 Apache 软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven 利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
|
||||
>
|
||||
> Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
|
||||
>
|
||||
> <p style="text-align:right;">——《维基百科》</p>
|
||||
|
||||
由于众所周知的原因,Maven 下载东西的时候总会特别慢,直到失败。下面列出几个常见配置:
|
||||
|
||||
## 一、将 archetypeCatalog 参数设为 internal
|
||||
|
||||
在 maven 的 VM Options 加上 -DarchetypeCatalog=internal 参数。
|
||||
|
||||
- IntelliJ IDEA : 设置中的 **Build, Execution, Deployment** -> **Build Tools** -> **Maven** -> **Runner** 的 VM Options 中输入 `-DarchetypeCatalog=internal`。
|
||||
- VS Code : 设置中的 **扩展** -> **Maven for Java** -> Maven > Executable: **Options** 中输入 `-DarchetypeCatalog=internal`。
|
||||
|
||||
---
|
||||
|
||||
## 二、配置阿里云镜像
|
||||
|
||||
### 1. 为单个项目配置阿里云镜像
|
||||
|
||||
我们可以在项目的 pom.xml 文件的 project 节点中为该项目单独配置阿里云镜像,如下所示:
|
||||
|
||||
```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
|
||||
https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
...
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>aliyun</id>
|
||||
<url>https://maven.aliyun.com/repository/public</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>aliyun-plugin</id>
|
||||
<url>https://maven.aliyun.com/repository/public</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
...
|
||||
</project>
|
||||
```
|
||||
|
||||
这样,当我们从 git 上拉取项目之后,就可以直接使用阿里云的镜像。
|
||||
|
||||
> 注意:别忘了 pluginRepositories 节点的配置。网上不少文章只介绍了 repositories 的配置,但是这样可能会出现依赖包从阿里云下载,而 Maven 插件依旧从 repo.maven.apache.org 下载的情况,最终下载缓慢甚至报错。
|
||||
|
||||
### 2. 修改 Maven 的配置文件
|
||||
|
||||
我们还可以修改 Maven 安装目录下 `conf` 文件夹中的 `settings.xml` 文件,找到其中的 `mirrors` 节点,在其中添加如下配置:
|
||||
|
||||
```xml
|
||||
<mirror>
|
||||
<id>alimaven</id>
|
||||
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
|
||||
<name>aliyun maven</name>
|
||||
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
|
||||
</mirror>
|
||||
```
|
||||
|
||||
> 一些软件默认会去使用 `${用户文件夹}/.m2/settings.xml` 配置文件,我们可以手动指定 settings.xml 文件的路径。我个人的做法是干脆将修改后的 `settings.xml` 拷贝一份到 .m2 文件夹中,这样不管哪个软件从哪里加载配置文件,都是一样的内容。
|
||||
|
||||
---
|
||||
|
||||
## 三、本地仓库
|
||||
|
||||
Maven 默认的本地仓库位于 `个人文件夹\.m2\repository`,比如 `C:\Users\zhouxy\.m2\repository`、`~\.m2\repository`,这个我一般就不去修改了。总之下载过的依赖都会放在这里,而每次创建、打开项目,Maven 都会先从这里寻找依赖。你也可以在 settings.xml 中修改这个路径。
|
||||
|
||||
在 `settings` 的开始标签下面就有被注释的内容说明如何配置,也就是在 `settings` 节点中添加如下代码:
|
||||
|
||||
```xml
|
||||
<localRepository>D:/ZhouXY/.m2/repository</localRepository>
|
||||
```
|
||||
|
||||
这样 maven 就会把 `D:/ZhouXY/.m2/repository` 这个目录当成本地仓库,你可以替换成你自己的文件夹。
|
||||
|
||||
## 随便说点什么
|
||||
|
||||
好久没更新博客了,最近在学 Spring,由于有点赶时间,所以笔记没有整理得很整齐,示例程序也零零散散,等有时间整理好了,再一并发布吧。
|
||||
|
||||
另外,博客换了个主题,有些东西还没配置好,就先这样将就吧。
|
|
@ -0,0 +1 @@
|
|||
Home
|
|
@ -1,90 +1,90 @@
|
|||
---
|
||||
title: Ubuntu 安装MySQL(MariaDB)过程
|
||||
date: 2020-07-22 22:54:29
|
||||
tags:
|
||||
- Linux
|
||||
- Ubuntu
|
||||
- MySQL
|
||||
- MariaDB
|
||||
- 数据库
|
||||
categories:
|
||||
- MariaDB
|
||||
---
|
||||
|
||||
> 本文内容简单,只是整理了一下常规操作而已。
|
||||
|
||||
> MariaDB 是 MySQL 的一个分支主要由开源社区在维护,采用 GPL 授权许可。开发这个分支的原因之一是:甲骨文公司收购 MySQL 后,有将 MySQL 闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
|
||||
>
|
||||
> MariaDB 的目的是完全兼容 MySQL,包括 API 和命令行,使之能轻松成为 MySQL 的代替品。
|
||||
|
||||
> 一般情况下我在个人的学习和开发中都会使用 MariaDB 来代替 MySQL,就像我会使用 Open JDK 来代替 Oracle JDK 一样。
|
||||
|
||||
## 1. 安装
|
||||
|
||||
在 Ubuntu 上安装 MySQL:
|
||||
```
|
||||
sudo apt-get install mysql-client mysql-server
|
||||
```
|
||||
|
||||
安装 MariaDB 的话,把 "mysql" 改成 "mariadb" 即可:
|
||||
```
|
||||
sudo apt-get install mariadb-client mariadb-server
|
||||
```
|
||||
|
||||
一般来说安装完成之后都是自动运行的,如果没有运行,可以执行 `sudo service mysql start` 启动它(MySQL 和 MariaDB 都一样)。
|
||||
|
||||
> 关闭服务:`sudo service mysql stop`
|
||||
> 查看服务状态:`sudo service mysql status`
|
||||
|
||||
> 我在阿里云的 Ubuntu 20.04 上安装 MySQL,版本输出信息为:
|
||||
> Server version: 8.0.20-0ubuntu0.20.04.1 (Ubuntu)
|
||||
>
|
||||
> 在本地机的 Ubuntu 18.04.4 MariaDB,版本输出信息为:
|
||||
> Server version: 10.1.44-MariaDB-0ubuntu0.18.04.1 18.04
|
||||
|
||||
## 2. 初始化
|
||||
|
||||
```
|
||||
mysqld -initialize
|
||||
```
|
||||
耐心等待命令执行完成。
|
||||
|
||||
## 3. 设置
|
||||
|
||||
### 3.1 登录数据库
|
||||
切换系统 root 用户,输入
|
||||
```
|
||||
mysql -u root -p
|
||||
```
|
||||
不用输入密码,直接回车,登录 MariaDB(或者 MySQL)。
|
||||
|
||||
### 3.2 修改密码
|
||||
```
|
||||
set password for root@localhost = password('123');
|
||||
```
|
||||
> 否则默认密码为空。
|
||||
|
||||
### 3.3 修改 `plugin` 属性为 `mysql_native_password`
|
||||
```sql
|
||||
use mysql;
|
||||
update user set plugin='mysql_native_password' where user='root';
|
||||
```
|
||||
然后输入 `flush privileges;` 使之生效。
|
||||
|
||||
> 否则系统的其他用户无法登录数据库的 root 用户。
|
||||
> ERROR 1698 (28000): Access denied for user 'root'@'localhost'
|
||||
|
||||
### 3.4 将 `host` 属性设置为 `%`
|
||||
```sql
|
||||
use mysql;
|
||||
update user set host = '%' where user = 'root';
|
||||
```
|
||||
然后输入 `flush privileges;` 使之生效。
|
||||
> 否则其它设备上的客户端(DataGrid、Netcat 以及我们自己编写的程序等)无法登录数据库的 root 用户。
|
||||
|
||||
## 4. 注意!!!
|
||||
上面的 3.3、3.4 针对的是我学习生活中需要在其他设备、其他系统用户上登录数据库的 root 用户。实际上,为了安全,我们可能不会允许这么做。
|
||||
|
||||
例如我们可能保留 root 用户的 plugin 属性为 unix_socket,系统的普通用户也只能登录数据库的其他用户,只有系统的 root 用户才能登录数据库的 root 用户。
|
||||
|
||||
---
|
||||
title: Ubuntu 安装MySQL(MariaDB)过程
|
||||
date: 2020-07-22 22:54:29
|
||||
tags:
|
||||
- Linux
|
||||
- Ubuntu
|
||||
- MySQL
|
||||
- MariaDB
|
||||
- 数据库
|
||||
categories:
|
||||
- MariaDB
|
||||
---
|
||||
|
||||
> 本文内容简单,只是整理了一下常规操作而已。
|
||||
|
||||
> MariaDB 是 MySQL 的一个分支主要由开源社区在维护,采用 GPL 授权许可。开发这个分支的原因之一是:甲骨文公司收购 MySQL 后,有将 MySQL 闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
|
||||
>
|
||||
> MariaDB 的目的是完全兼容 MySQL,包括 API 和命令行,使之能轻松成为 MySQL 的代替品。
|
||||
|
||||
> 一般情况下我在个人的学习和开发中都会使用 MariaDB 来代替 MySQL,就像我会使用 Open JDK 来代替 Oracle JDK 一样。
|
||||
|
||||
## 1. 安装
|
||||
|
||||
在 Ubuntu 上安装 MySQL:
|
||||
```
|
||||
sudo apt-get install mysql-client mysql-server
|
||||
```
|
||||
|
||||
安装 MariaDB 的话,把 "mysql" 改成 "mariadb" 即可:
|
||||
```
|
||||
sudo apt-get install mariadb-client mariadb-server
|
||||
```
|
||||
|
||||
一般来说安装完成之后都是自动运行的,如果没有运行,可以执行 `sudo service mysql start` 启动它(MySQL 和 MariaDB 都一样)。
|
||||
|
||||
> 关闭服务:`sudo service mysql stop`
|
||||
> 查看服务状态:`sudo service mysql status`
|
||||
|
||||
> 我在阿里云的 Ubuntu 20.04 上安装 MySQL,版本输出信息为:
|
||||
> Server version: 8.0.20-0ubuntu0.20.04.1 (Ubuntu)
|
||||
>
|
||||
> 在本地机的 Ubuntu 18.04.4 MariaDB,版本输出信息为:
|
||||
> Server version: 10.1.44-MariaDB-0ubuntu0.18.04.1 18.04
|
||||
|
||||
## 2. 初始化
|
||||
|
||||
```
|
||||
mysqld -initialize
|
||||
```
|
||||
耐心等待命令执行完成。
|
||||
|
||||
## 3. 设置
|
||||
|
||||
### 3.1 登录数据库
|
||||
切换系统 root 用户,输入
|
||||
```
|
||||
mysql -u root -p
|
||||
```
|
||||
不用输入密码,直接回车,登录 MariaDB(或者 MySQL)。
|
||||
|
||||
### 3.2 修改密码
|
||||
```
|
||||
set password for root@localhost = password('123');
|
||||
```
|
||||
> 否则默认密码为空。
|
||||
|
||||
### 3.3 修改 `plugin` 属性为 `mysql_native_password`
|
||||
```sql
|
||||
use mysql;
|
||||
update user set plugin='mysql_native_password' where user='root';
|
||||
```
|
||||
然后输入 `flush privileges;` 使之生效。
|
||||
|
||||
> 否则系统的其他用户无法登录数据库的 root 用户。
|
||||
> ERROR 1698 (28000): Access denied for user 'root'@'localhost'
|
||||
|
||||
### 3.4 将 `host` 属性设置为 `%`
|
||||
```sql
|
||||
use mysql;
|
||||
update user set host = '%' where user = 'root';
|
||||
```
|
||||
然后输入 `flush privileges;` 使之生效。
|
||||
> 否则其它设备上的客户端(DataGrid、Netcat 以及我们自己编写的程序等)无法登录数据库的 root 用户。
|
||||
|
||||
## 4. 注意!!!
|
||||
上面的 3.3、3.4 针对的是我学习生活中需要在其他设备、其他系统用户上登录数据库的 root 用户。实际上,为了安全,我们可能不会允许这么做。
|
||||
|
||||
例如我们可能保留 root 用户的 plugin 属性为 unix_socket,系统的普通用户也只能登录数据库的其他用户,只有系统的 root 用户才能登录数据库的 root 用户。
|
||||
|
||||
我们还可能保留 root 用户的 host 属性为 localhost,或者只允许在指定的主机上登录 root,还可以添加另一个数据库用户(设置好适合的权限),用来在其他设备上登录并操作数据库。
|
|
@ -0,0 +1 @@
|
|||
Home
|
|
@ -0,0 +1 @@
|
|||
Home
|
|
@ -0,0 +1 @@
|
|||
Home
|
|
@ -0,0 +1 @@
|
|||
Home
|
|
@ -0,0 +1,19 @@
|
|||
tags
|
||||
|
||||
- 前端
|
||||
- 前端理由
|
||||
- Vue
|
||||
- git
|
||||
- Spring
|
||||
- Spring MVC
|
||||
- Maven
|
||||
- Linux
|
||||
- Ubuntu
|
||||
- 数据库
|
||||
- PostgreSQL
|
||||
- MySQL
|
||||
- MariaDB
|
||||
- Oracle
|
||||
- DB2
|
||||
- 开发工具
|
||||
- VS Code
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "blog",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"docs:dev": "vuepress dev docs",
|
||||
"docs:build": "vuepress build docs"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@vuepress/client": "2.0.0-beta.60",
|
||||
"vue": "^3.2.47",
|
||||
"vuepress": "2.0.0-beta.60"
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,7 @@
|
|||
import { defineClientConfig } from "@vuepress/client";
|
||||
|
||||
export default defineClientConfig({
|
||||
enhance({ app, router, siteData }) {},
|
||||
setup() {},
|
||||
rootComponents: [],
|
||||
});
|
|
@ -0,0 +1,87 @@
|
|||
import { defineUserConfig, defaultTheme } from "vuepress";
|
||||
|
||||
export default defineUserConfig({
|
||||
lang: "zh-CN",
|
||||
title: "Code108 的在线笔记",
|
||||
description: "博客、笔记、文档",
|
||||
port: 8190,
|
||||
theme: defaultTheme({
|
||||
logo: "/imgs/favicon.ico",
|
||||
navbar: [
|
||||
{
|
||||
text: "首页",
|
||||
link: "/"
|
||||
},
|
||||
{
|
||||
text: "Spring",
|
||||
link: "/articles/Spring",
|
||||
},
|
||||
{
|
||||
text: "开发工具",
|
||||
link: "/articles/开发工具",
|
||||
activeMatch: '^/开发工具/',
|
||||
children: [
|
||||
{
|
||||
text: "git",
|
||||
link: "/articles/开发工具/git"
|
||||
},
|
||||
{
|
||||
text: "maven",
|
||||
link: "/articles/开发工具/maven"
|
||||
},
|
||||
{
|
||||
text: "VS Code",
|
||||
link: "/articles/开发工具/VSCode"
|
||||
},
|
||||
{
|
||||
text: "JMeter",
|
||||
link: "/articles/开发工具/JMeter"
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "前端",
|
||||
link: "/articles/前端",
|
||||
activeMatch: '^/前端/',
|
||||
children: [
|
||||
{
|
||||
text: "commons",
|
||||
link: "/articles/前端/commons"
|
||||
},
|
||||
{
|
||||
text: "Vue",
|
||||
link: "/articles/前端/Vue"
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
text: "数据库",
|
||||
link: "/articles/数据库",
|
||||
activeMatch: '^/数据库/',
|
||||
children: [
|
||||
{
|
||||
text: "commons",
|
||||
link: "/articles/数据库/commons"
|
||||
},
|
||||
{
|
||||
text: "PostgreSQL",
|
||||
link: "/articles/数据库/PostgreSQL"
|
||||
},
|
||||
{
|
||||
text: "MySQL",
|
||||
link: "/articles/数据库/MySQL"
|
||||
},
|
||||
{
|
||||
text: "Oracle",
|
||||
link: "/articles/数据库/Oracle"
|
||||
},
|
||||
{
|
||||
text: "DB2",
|
||||
link: "/articles/数据库/DB2"
|
||||
},
|
||||
]
|
||||
},
|
||||
],
|
||||
repo: 'http://zhouxy.xyz:3000/ZhouXY108/blog',
|
||||
})
|
||||
});
|
Loading…
Reference in New Issue