IDEA设置
字体不规则
在使用idea2019.2时存在中文字体忽大忽小不规范的问题,
File => Settings => Editor => Font
调整Fallback font
为SimHei
、SimSun
、YouYuan
等
自动换行
settings => editor => code style => default options
勾选wrap on typing
settings => editor => code style => java => wrapping and braces
勾选ensure right margin is not exceeded
编译问题
duplicate declaration of version
版本重复,检查pom.xml
定义是否重复
引用自定义包报错
The POM for xxxx is missing, no dependency information available
可能是打包方式错误,使用了
mvn package -Dmaven.test.skip=true
而不是
mvn clean install -Dmaven.test.skip=true
mvn clean package
:删除目标文件夹、编译代码并打包mvn clean install
:删除目标文件夹、编译代码并打包、将打好的包放置到本地仓库中
依赖问题
新下载的项目,下载依赖后依赖还是显示无法找到,或者IDEA
中一直显示波浪线
分为以下两种情况:
依赖未下载完整,文件全部为
*.lastUpdated
依赖文件完整,
IDEA
飘红不报错
对于第一种情况,可以删除相关临时文件后尝试重新下载。
以下为删除脚本,在相应目录下执行:
1 | # windows |
1 | # linux |
对于第二种情况,可能是IDEA
的缓存导致,可以尝试剪切pom.xml
文件中相关依赖,import change
后重新添加并刷新。
启动问题
启动时找不到主类
1 | 错误: 找不到或无法加载主类 XXXX |
大概率是编译结果问题,尝试mvn clean install
。
警告非法的反射访问操作
An illegal reflective access operation has occurred
原因:JDK9
以上模块不能使用反射去访问非公有的成员/成员方法以及构造方法,除非模块标识为opens
去允许反射访问。旧JDK
制作的库(JDK8
及以下)运行在JDK9
上会自动被标识为未命名模块,为了处理该警告,JDK9
以上提出了一个新的JVM
参数:--illegal-access
该参数有四个可选值:
permit
:默认值,允许通过反射访问,因此会提示像上面一样的警告,这个是首次非法访问警告,后续不警告warn
:每次非法访问都会警告debug
:在warn的基础上加入了类似e.printStackTrace()
的功能deny
:禁止所有的非法访问除了使用特别的命令行参数排除的模块,比如使用–add-opens排除某些模块使其能够通过非法反射访问
解决方法一: 设置以下JVM
参数
1 | --illegal-access=deny --add-opens java.base/java.lang=ALL-UNNAMED |
IDEA
可以在运行配置中的VM options
中添加上述参数
如果使用Maven
打包的时候还是会出现警告,可以在IDEA
中的Maven
配置中添加全局的Maven
参数
如果使用Gradle
,在build.gradle
中添加
1 | test { |
MalformedInputException
启动服务时报错:
Caused by: java.nio.charset.MalformedInputException: Input length = 1
编码设置有问题,
File => Settings => Editor => File Encodings
将所有的格式都转成utf-8
格式。
运行问题
MySQL插入emoji报错
Incorrect string value: '\xF0\x9F\x90\x96' for column
原因:
MySQL
的utf8
编码最多3个字节,算不上真正的utf8
字符集。
在MySQL5.5.3
的版本增加了utf8mb4
编码集,专门用于兼容4个字节的unicode
。
检查
MySQL
版本是否支持utf8mb4
编码:select version();
修改
MySQL
配置文件
打开MySQL
配置文件mysql/my.cnf
或mysql/my.ini
, 并且添加如下内容:1
2
3
4
5
6
7
8
9
10
11[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'重启数据库
- Windows到服务管理界面重新启动
MySql
服务:services.msc
- Linux执行命令:
/etc/init.d/mysql restart
- Windows到服务管理界面重新启动
检查数据库配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
|| character_set_client | utf8mb4
|| character_set_connection | utf8mb4
|| character_set_database | utf8mb4
|| character_set_filesystem | binary
|| character_set_results | utf8mb4
|| character_set_server | utf8mb4
|| character_set_system | utf8
|| collation_connection | utf8mb4_unicode_ci
|| collation_database | utf8mb4_unicode_ci
|| collation_server | utf8mb4_unicode_ci
+--------------------------+--------------------+必须保证:
character_set_client
、character_se_connection
、character_set_database
、character_set_results
、character_set_server
为utf8mb4
。更新客户端配置文件
1
2
3
4jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
jdbc.username=username
jdbc.password=password注意:
jdbc.url
的内容,characterEncoding=utf8
可以被自动识别为utf8bm4
修改数据库、表和列的字符集SQL语句:
1
2
3ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name table_name CHANGE column_name VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;修改应用连接字符串(druid):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc-driver}"/>
<property name="url" value="${jdbc-url}"/>
<property name="username" value="${jdbc-user}"/>
<property name="password" value="${jdbc-password}"/>
<property name="filters" value="stat"/>
<property name="maxActive" value="20"/>
<property name="initialSize" value="1"/>
<property name="maxWait" value="60000"/>
<property name="minIdle" value="1"/>
<property name="timeBetweenEvictionRunsMillis" value="3000"/>
<property name="minEvictableIdleTimeMillis" value="300000"/>
<property name="validationQuery" value="SELECT 'x'"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
<property name="connectionInitSqls" value="set names utf8mb4;"/> //必须添加
</bean>注意:
mysql-connector-java
驱动在5.1.13
之前是不支持utf8mb4
,请使用5.1.13
以后的版本。
Collectors.toMap
报错
错误
当
value
为null
时会报错解决方法为
1
List.stream().collect(HashMap::new,(m,v)->m.put(v.getId(),v.getValue()),HashMap::putAll);
当主键重复时会报错,解决方法为
1
List.stream().collect(Collectors.toMap(V::getId, V::getValue, (oldValue, newValue) -> newValue));
原因
以Oracle JDK1.8.0_291
为例,查询Collectors.toMap
调用链,
1 | public static <T, K, U> |
这里找到throwingMerger()
实现
1 | private static <T> BinaryOperator<T> throwingMerger() { |
可以看出默认的合并方法是不允许重复key出现的。
往下继续看,
1 | public static <T, K, U, M extends Map<K, U>> |
找到map.merge
的方法
1 | default V merge(K key, V value, |
从这里就可以看出来默认的toMap
思想是不支持重复键,也不支持空值。
向下找到HashMap
的实现类
1 |
|
可以看出,和默认方法基本一致,也就导致了报错。
- 本文标题:IDEA Spring Boot 项目相关问题
- 创建时间:2019-09-23 23:17:58
- 本文链接:posts/7761f6cf/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!