当Java源代码中包含中文字符时,我们在用javac编译时会出现“错误:编码GBK的不可映射字符”。

由于JDK是国际版的,我们在用javac编译时,编译程序首先会获得我们操作系统默认采用的编码格式(GBK),然后JDK就把Java源文件从GBK编码格式转换为Java内部默认的Unicode格式放入内存中,然后javac把转换后的Unicode格式的文件编译成class类文件,此时,class文件是Unicode编码的,它暂存在内存中,紧接着,JDK将此以Unicode格式编码的class文件保存到操作系统中形成我们见到的class文件。当我们不加设置就编译时,相当于使用了参数:javac -encoding GBK Test.java,就会出现不兼容的情况。

使用-encoding参数指明编码方式:javac -encoding UTF-8 Test.java,就可以了。

转载:错误:编码GBK的不可映射字符

打开环境变量窗口

右键 This PC(此电脑) -> Properties(属性) -> Advanced system settings(高级系统设置) -> Environment Variables(环境变量)

微信截图_20200716151758.png

微信截图_20200716151834.png

微信截图_20200716151910.png

新建JAVA_HOME 变量

1
2
变量名:JAVA_HOME
变量值:电脑上JDK安装的绝对路径

微信截图_20200716152023.png

新建/修改 CLASSPATH 变量

如果存在 CLASSPATH 变量,选中点击 Edit(编辑)。

如果没有,点击 New(新建)… 新建。

输入/在已有的变量值后面添加:

1
2
变量名:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

微信截图_20200716152137.png

修改Path 变量

由于 win10 的不同,当选中 Path 变量的时候,系统会很方便的把所有不同路径都分开了,不会像 win7 或者 win8 那样连在一起。

微信截图_20200716152234.png

新建两条路径:

1
2
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin

验证

1
2
3
java
java -version
javac

参考:

Windows 10 配置Java 环境变量

转载:

IDEA最好用插件推荐

Alibaba Java Coding Guidelines

安装该插件后,代码超过 80 行、手动创建线程池等,这些和《手册》中的规约不符时,IDEA中会给出警告提示。

建议大家一定要安装该插件,它会帮助你检查出很多隐患,督促你写更规范的代码。

地址:Alibaba Java Coding Guidelines

jclasslib bytecode viewer

地址:jclasslib bytecode viewer

jclasslib:一款可视化的字节码查看插件。

大家可以直接在 IDEA 插件管理中安装(安装步骤略)。

使用方法:

1,在 IDEA 打开想研究的类。
2,编译该类或者直接编译整个项目( 如果想研究的类在 jar 包中,此步可略过)。
3,打开“view” 菜单,选择“Show Bytecode With jclasslib” 选项。
4,选择上述菜单项后 IDEA 中会弹出 jclasslib 工具窗口。

那么有自带的强大的反汇编工具 javap 还有必要用这个插件吗?

这个插件的强大之处在于:

不需要敲命令,简单直接,在右侧方便和源代码进行对比学习。
字节码命令支持超链接,点击其中的虚拟机指令即可跳转到 jvms 相关章节,超级方便。
该插件对我们学习虚拟机指令有极大的帮助。

具体可以参考:IDEA字节码学习查看神器介绍

Codota

支持智能代码自动提示,该功能可以增强 IDEA 的代码提示功能。
支持 JDK 和知名第三方库的函数的使用方法搜索,可以看到其他知名开源项目对该函数的用法。
当我们第一次使用某个类,对某个函数不够熟悉时,可以通过该插件搜索相关用法,快速模仿学习。
可以使用该插件查看知名开源项目的用法。插件窗口顶部还给出了该类最常用的函数,可以点击查看相关用法案例,每个案例右侧的 “view source”可以跳转到该片段对应的开源项目的源码中。

地址:Codota

Auto filling Java call arguments

开发中,我们通常会调用其他已经编写好的函数,调用后需要填充参数,但是绝大多数情况下,传入的变量名称和该函数的参数名一致,当参数较多时,手动单个填充参数非常浪费时间。

该插件就可以帮你解决这个问题。

安装完该插件以后,调用一个函数,使用 Alt+Enter 组合键,调出 “Auto fill call parameters” 自动使用该函数定义的参数名填充。

GenerateO2O、GenerateAllSette

我们定义好从 A 类转换到 B 类的函数转换函数后,使用这两个插件可以自动调用 Getter 和 Setter 函数实行自动转换。

实际开发中还有一个非常常见的场景: 我们创建一个对象后,想依次调用 Setter 函数对属性赋值,如果属性较多很容易遗漏或者重复。

可以使用这 GenerateAllSetter 提供的功能,自动调用所有 Setter 函数(可填充默认值),然后自己再跟进实际需求设置属性值。

Rainbow Brackets

由于很多人没有养成好的编码风格,没有随手 format 代码的习惯,甚至有些同事会写代码超过几百行,阅读起来将非常痛苦。

痛苦的原因之一就是找到上下文,由于括号太多,不确定当前代码行是否属于某个代码块,此时这个插件就会帮上大忙。

插件 github 地址:https://github.com/izhangzhihao/intellij-rainbow-brackets

Maven Helper

现在 Java 项目通常会使用 maven 或者 gradle 构建,对于maven 项目来说, jar 包冲突非常常见。

那么如何更容易地查看和解决 jar 包冲突呢?

大家可以安装该插件,安装后 IDEA 中打开 pom.xml 文件时,就会多出一个 “Dependency Analyzer” 选项卡。

如上图所示,该插件支持值插件冲突的 jar 包,可以选择冲突的 jar 包将其 exclude 掉。

FindBugs

FindBugs 作为静态代码检查插件,可以检查你代码中的隐患,并给出原因。

地址:FindBugs-IDEA

SequenceDiagram

SequenceDiagram 可以根据代码调用链路自动生成时序图,超级赞,超级推荐!

这对研究源码,梳理工作中的业务代码有极大的帮助,堪称神器。

安装完成后,在某个类的某个函数中,右键 –> Sequence Diagaram 即可调出。

如下图是 Netty 的源码,可以通过该插件绘制出当前函数的调用链路。

双击顶部的类名可以跳转到对应类的源码中,双击调用的函数名可以直接调入某个函数的源码,总之非常强大。

地址:SequenceDiagram

Stack trace to UML

Stack trace to UML 支持根据 JVM 异常堆栈画 UML时序图和通信图。

打开方式 Analyze > Open Stack trace to UML plugin + Generate UML diagrams from stacktrace from debug

地址:Stack trace to UML

Java Stream Debugger

Stream 非常好用,可以灵活对数据进行操作,但是对很多刚接触的人来说,不好理解。

那么 Java Stream Debugger 这款神器的 IDEA 就可以帮到你。它可以将 Stream 的操作步骤可视化,非常有助于我们的学习。

地址:Java Stream Debugger

JOL Java Object Layout

查看对象布局和大小的插件,非常赞。

地址:JOL Java Object Layout

转载:

Java格式化输出printf例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import java.util.Date;

/**
* 使用printf输出
*/
/**关键技术点
* 使用java.io.PrintStream的printf方法实现C风格的输出
* printf 方法的第一个参数为输出的格式,第二个参数是可变长的,表示待输出的数据对象
*/
public class Printf {

public static void main(String[] args) {
/*** 输出字符串 ***/
// %s表示输出字符串,也就是将后面的字符串替换模式中的%s
System.out.printf("%s", new Integer(1212));
// %n表示换行
System.out.printf("%s%n", "end line");
// 还可以支持多个参数
System.out.printf("%s = %s%n", "Name", "Zhangsan");
// %S将字符串以大写形式输出
System.out.printf("%S = %s%n", "Name", "Zhangsan");
// 支持多个参数时,可以在%s之间插入变量编号,1$表示第一个字符串,3$表示第3个字符串
System.out.printf("%1$s = %3$s %2$s%n", "Name", "san", "Zhang");

/*** 输出boolean类型 ***/
System.out.printf("true = %b; false = ", true);
System.out.printf("%b%n", false);

/*** 输出整数类型***/
Integer iObj = 342;
// %d表示将整数格式化为10进制整数
System.out.printf("%d; %d; %d%n", -500, 2343L, iObj);
// %o表示将整数格式化为8进制整数
System.out.printf("%o; %o; %o%n", -500, 2343L, iObj);
// %x表示将整数格式化为16进制整数
System.out.printf("%x; %x; %x%n", -500, 2343L, iObj);
// %X表示将整数格式化为16进制整数,并且字母变成大写形式
System.out.printf("%X; %X; %X%n", -500, 2343L, iObj);

/*** 输出浮点类型***/
Double dObj = 45.6d;
// %e表示以科学技术法输出浮点数
System.out.printf("%e; %e; %e%n", -756.403f, 7464.232641d, dObj);
// %E表示以科学技术法输出浮点数,并且为大写形式
System.out.printf("%E; %E; %E%n", -756.403f, 7464.232641d, dObj);
// %f表示以十进制格式化输出浮点数
System.out.printf("%f; %f; %f%n", -756.403f, 7464.232641d, dObj);
// 还可以限制小数点后的位数
System.out.printf("%.1f; %.3f; %f%n", -756.403f, 7464.232641d, dObj);

/*** 输出日期类型***/
// %t表示格式化日期时间类型,%T是时间日期的大写形式,在%t之后用特定的字母表示不同的输出格式
Date date = new Date();
long dataL = date.getTime();
// 格式化年月日
// %t之后用y表示输出日期的年份(2位数的年,如99)
// %t之后用m表示输出日期的月份,%t之后用d表示输出日期的日号
System.out.printf("%1$ty-%1$tm-%1$td; %2$ty-%2$tm-%2$td%n", date, dataL);
// %t之后用Y表示输出日期的年份(4位数的年),
// %t之后用B表示输出日期的月份的完整名, %t之后用b表示输出日期的月份的简称
System.out.printf("%1$tY-%1$tB-%1$td; %2$tY-%2$tb-%2$td%n", date, dataL);

// 以下是常见的日期组合
// %t之后用D表示以 "%tm/%td/%ty"格式化日期
System.out.printf("%1$tD%n", date);
//%t之后用F表示以"%tY-%tm-%td"格式化日期
System.out.printf("%1$tF%n", date);

/*** 输出时间类型***/
// 输出时分秒
// %t之后用H表示输出时间的时(24进制),%t之后用I表示输出时间的时(12进制),
// %t之后用M表示输出时间的分,%t之后用S表示输出时间的秒
System.out.printf("%1$tH:%1$tM:%1$tS; %2$tI:%2$tM:%2$tS%n", date, dataL);
// %t之后用L表示输出时间的秒中的毫秒
System.out.printf("%1$tH:%1$tM:%1$tS %1$tL%n", date);
// %t之后p表示输出时间的上午或下午信息
System.out.printf("%1$tH:%1$tM:%1$tS %1$tL %1$tp%n", date);

// 以下是常见的时间组合
// %t之后用R表示以"%tH:%tM"格式化时间
System.out.printf("%1$tR%n", date);
// %t之后用T表示以"%tH:%tM:%tS"格式化时间
System.out.printf("%1$tT%n", date);
// %t之后用r表示以"%tI:%tM:%tS %Tp"格式化时间
System.out.printf("%1$tr%n", date);

/*** 输出星期***/
// %t之后用A表示得到星期几的全称
System.out.printf("%1$tF %1$tA%n", date);
// %t之后用a表示得到星期几的简称
System.out.printf("%1$tF %1$ta%n", date);

// 输出时间日期的完整信息
System.out.printf("%1$tc%n", date);
}
}
/**
*printf方法中,格式为"%s"表示以字符串的形式输出第二个可变长参数的第一个参数值;
*格式为"%n"表示换行;格式为"%S"表示将字符串以大写形式输出;在"%s"之间用"n$"表示
*输出可变长参数的第n个参数值.格式为"%b"表示以布尔值的形式输出第二个可变长参数
*的第一个参数值.
*/
/**
* 格式为"%d"表示以十进制整数形式输出;"%o"表示以八进制形式输出;"%x"表示以十六进制
* 输出;"%X"表示以十六进制输出,并且将字母(A、B、C、D、E、F)换成大写.格式为"%e"表
* 以科学计数法输出浮点数;格式为"%E"表示以科学计数法输出浮点数,而且将e大写;格式为
* "%f"表示以十进制浮点数输出,在"%f"之间加上".n"表示输出时保留小数点后面n位.
*/
/**
* 格式为"%t"表示输出时间日期类型."%t"之后用y表示输出日期的二位数的年份(如99)、用m
* 表示输出日期的月份,用d表示输出日期的日号;"%t"之后用Y表示输出日期的四位数的年份
* (如1999)、用B表示输出日期的月份的完整名,用b表示输出日期的月份的简称."%t"之后用D
* 表示以"%tm/%td/%ty"的格式输出日期、用F表示以"%tY-%tm-%td"的格式输出日期.
*/
/**
* "%t"之后用H表示输出时间的时(24进制),用I表示输出时间的时(12进制),用M表示输出时间
* 分,用S表示输出时间的秒,用L表示输出时间的秒中的毫秒数、用 p 表示输出时间的是上午还是
* 下午."%t"之后用R表示以"%tH:%tM"的格式输出时间、用T表示以"%tH:%tM:%tS"的格式输出
* 时间、用r表示以"%tI:%tM:%tS %Tp"的格式输出时间.
*/
/**
* "%t"之后用A表示输出日期的全称,用a表示输出日期的星期简称.
*/

Ctrl+Alt+L:格式化代码;

Ctrl+Q:查询引用;

Alt+Enter:导入包;

F4:查看源码;

Ctrl+Alt+B:导航到抽象方法的实现;

F7:在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果该方法体还有方法,则不会进入该内嵌的方法中

F8:在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则不进入当前方法体内

F9:在 Debug 模式下,恢复程序运行,但是如果该断点下面代码还有断点则停在下一个断点上

F12:回到前一个工具窗口

Ctrl + / :行注释,再次使用,去掉行注释

**Ctrl + Shift + /**:块注释

输入/** :方法注释,点击 Enter,自动根据参数和返回值生成注释模板

https://github.com/judasn/IntelliJ-IDEA-Tutorial/blob/master/keymap-introduce.md

NPM常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 查看版本
npm -v

# 查看安装的包
npm list
npm -global list

# 查看某个模块的全部信息
npm info name

# 查看单个信息
npm info name version
npm info name homepage

# install支持多种手段,包名,git路径,包括本地路径
# 注:离线安装存在包依赖,可能会出错
sudo npm install -global [package name]
npm install git://github.com/package/path.git
npm install git://github.com/package/path.git#0.1.0
npm install package_name@version
npm install path/to/somedir //本地路径

# 清除缓存
npm cache clean

# 查看配置项
npm config list
npm config list -l

参考

npm用法及离线安装方法

联网机器安装NPM包

http-server 为例:

1
2
3
4
5
6
7
8
9
# 首先查看 node npm 版本
C:\Users\DELL>npm -v
6.13.4

C:\Users\DELL>node -v
v12.16.1

# 安装 http-server
npm install http-server -g
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看配置,找到安装目录
npm config list

C:\Users\DELL>npm config list
; cli configs
metrics-registry = "https://registry.npmjs.org/"
scope = ""
user-agent = "npm/6.13.4 node/v12.16.1 win32 x64"

; builtin config undefined
prefix = "C:\\Users\\DELL\\AppData\\Roaming\\npm"

; node bin location = C:\Program Files\nodejs\node.exe
; cwd = C:\Users\DELL
; HOME = C:\Users\DELL
; "npm config ls -l" to show all defaults.

查看 C:\\Users\\DELL\\AppData\\Roaming\\npm 目录,截图如下:

npm-path.png
npm-http-server

通过ftp工具拷贝到未联网服务器

1
2
3
4
# 本地文件夹:C:\\Users\\DELL\\AppData\\Roaming\\npm 下的文件,
# 拷贝到 服务器上 /root/.npm 下 (不存在,使用mkdir命令创建)
http-server
http-server.cmd

如图:

微信截图_20200520102421.png

1
2
3
# 本地文件夹:C:\Users\DELL\AppData\Roaming\npm\node_modules 下的文件夹,
# 拷贝到 服务器上 /root/.npm/node_modules 下
http-server

如图:

微信截图_20200520102513.png

安装启动

1
2
3
4
5
6
7
8
9
10
11
12
# 安装
npm install /root/.npm/node_modules/http-server -g

# 启动
http-server /test/webapp -p 8013

# 查看监听的端口
netstat -lnpt

# curl 命令验证
curl -o /dev/null -s -w %{http_code} -X GET "192.125.30.82:8013/pages/tsjb/lzsp.html" -H "accept: text/html"
curl -X GET "192.125.30.82:8013/pages/tsjb/lzsp.html" -H "accept: text/html"

参考:

https://stackoverflow.com/questions/43064107/how-to-install-npm-package-while-offline/58744517#58744517

npm install

npm 模块安装机制简介

NPM离线包

npmbox

下载解压

离线包:https://nodejs.org/en/download/

1
2
xz -d node-v14.2.0-linux-x64.tar.xz
tar -xvf node-v14.2.0-linux-x64.tar

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 移动到/usr/local
mv node-v14.2.0-linux-x64 /usr/local/nodejs-v14.2

# 添加环境变量

# 进入 /etc/profile 文件
vim /etc/profile
# 在文件末尾添加
export PATH=$PATH:'/usr/local/nodejs-v14.2/bin'

# 使环境变量生效
source /etc/profile

# 验证
node -v
npm -v

参考:

CentOS 7.3 离线二进制安装 nodeJS

原因

1
unix:///tmp/supervisor.sock no such file

supervisor 默认配置会把 socket 文件和 pid 守护进程生成在/tmp/目录下,/tmp/目录是缓存目录,Linux 会根据不同情况自动删除其下面的文件。

修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vi /etc/supervisord.conf

# 英文分号后的内容为注释
[unix_http_server]
;file=/tmp/supervisor.sock ; (the path to the socket file)
file=/var/run/supervisor.sock ; 修改为 /var/run 目录,避免被系统删除

[supervisord]
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile=/var/log/supervisord.log ; 修改为 /var/log 目录,避免被系统删除
pidfile=/var/run/supervisord.pid ; 修改为 /var/run 目录,避免被系统删除
...

[supervisorctl]
; 必须和'unix_http_server'里面的设定匹配
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=unix:///var/run/supervisor.sock ; 修改为 /var/run 目录,避免被系统删除

可选:

  • 修改权限
1
2
sudo chmod 777 /run
sudo chmod 777 /var/log
  • 创建supervisor.sock
1
2
sudo touch /var/run/supervisor.sock
sudo chmod 777 /var/run/supervisor.sock

更新配置文件

1
supervisorctl update

参考:

“unix:///tmp/supervisor.sock no such file” 错误处理 (亲测)

[https://blog.csdn.net/qq_28885149/article/details/79364685](解决unix:///tmp/supervisor.sock no such file的问题)

0%