好记性不如烂笔头,其实有好多使用心得,之前一直没有整理,导致好多都忘了,慢慢追加到这里。

idea 设置

默认设置

  1. 进入默认设置菜单
  2. Maven 的默认设置,选中本机安装配置的 Maven 目录。如果不修改默认配置文件位置,则需要把 Maven 目录下的配置文件 copy 至下图画圈儿的位置。
  3. 修改配置目录为 Maven 在本机的配置目录。

默认项目配置

配置窗口,主要是配置 jdk 以及编译目标版本。

默认编码设置

在默认设置里改,以后新建项目时,不需要修改项目设置。

项目编码设置

如果项目是在修改默认编码设置之前就添加的,则需要单独设置。

其它

用 idea 的默认设置即可。一般不要修改。

IDEA 本身(非编码区)字体设置

IDEA 编码区字体设置

IntelliJ IDEA,代码行宽度超出限制时设置自动换行

当我们使用IDE写代码时,为了保证代码的可阅读性和优雅性,通常会借助IDE的代码风格设置功能,令IDE智能完成的代码部分或者格式化输入的代码,可以按照预期的格式输出。其中有一项设置就是限制一行代码的宽度,以IDEA举例,默认限制为120。
那么如何在IDEA中修改这个限制数值呢?
在File->settings->Editor->Code Style中,修改“Right margin (columns)”的值即可改变代码行宽度的限制。

如果输入的代码超出宽度界线时,如何让IDE自动将代码换行?有两种方式!第一种,在上述的“Right margin (columns)”的下方,有“Wrap when typing”选项,选中它。

第一种方式是在输入代码时触发,还有第二种方式,在File->settings->Code Style->Java中,选中“Wrapping and Braces”选项卡,在“Keep when reformatting”中有一个“Ensure rigth margin is not exceeded”,选中它,是什么效果呢?从配置项的字面意思很容易理解,在格式化Java代码时,确保代码没有超过宽度界线。
即输入的代码超出界线后, 不要紧,按下“Ctrl+Alt+L”格式化代码。

IDE所给出的宽度界线是好的,但真正控制、优化代码宽度的格式需要我们编码时养成良好的习惯,避免单行代码过长,避免不了时自己手动找到合适的截点,进行换行处理,且更符合各自实际的编码格式需求。

.sql 文件自动换行问题

项目中有一个 .sql 文件,里面的 update 语句比较长,总是自动换行,调整编辑区域时,会随时编辑区域的大小而自动调整每行显示的字符,相当于就是在自动换行。
由于 sql 语句自动换行后,可读性变差,我不希望它自动换行。
应用上面的参数,根本无效。只好放弃。

一开始这个文件是在一个 static web 模块下,这个模块仅用来保存文档。后来在另外一个 spring boot 项目,跟 scr 在同一目录下的 doc 目录下的 .sql 文件却不会自动换行。最开始怀疑是在 static web 下导致,于是 copy 至 spring boot 项目下,依旧。

最终解决办法:在 IDEA 新建一个 .sql 文件,然后把会自动换行文件里的内容原封不动的 copy 过来,在新的 .sql 文件里,就不会自动换行了。
应该是文件的编码导致的,会自动换行的文件,之前是用 Notepad++ 创建的。
提交 git,文件内容没有差异,显示的差异为:Contents have differences only in line separators
根据提示,差异仅仅在换行符,但是我从不会自动换行的文件里 copy 过去,依然会换行,所以,是跟文件相关的,而不是跟文件内容相关。

Performing Code Analysis…

IDEA 或者 WebStorm 提交代码时会分析代码以及查找 todo 事项,导致提交需要较长时间。如果不需要,以下配置项取消勾选即可:

IDEA + Tomcat 调试 JavaScript 代码

浏览器需要安装 JetBrains IDE Support 插件,请参考:像用 IDEA 调试 Java 代码一样,用 WebStorm 调试 react 代码

spring boot 项目的自动启动暂时没发现支持 IDEA 直接调试 javascript 代码,不过,可以用 Tomcat 来作为 Web 容器,这样可以直接调试 JavaScript 代码,配置如下:

将 with JavaScript debugger 项勾选上,启动调试即可。
另外,On ‘Update’ action 一定要选 Update classes and resources,这样在修改 js 或 html 时,刷新页面即可应用最新代码,不用重启 Tomcat,否则调试起来,效率就太低了。
需要注意的是:当且仅当在 Deployment 配置页,选的是 XXX exploded(XXX 为项目名),即开发模式,才会出现该选项。

至于 On frame deactivation,作用是:IDE失去焦点的情况下自动触发,建议设置为:Update classes and resources,这样前台页面获得更新的速度会快一些,不这可能会导致电脑资源占用过多,自己权衡。

Server returns invalid timezone. Go to ‘Advanced’ tab and set ‘serverTimezone’ property manually.

serverTimezone 设置值:Asia/Shanghai

IDEA 2017.2 中文输入法看不到输入窗口

环境:
IDEA:2017.2、2017.2.4
JDK:jdk1.8.0_141,安装的时候没有选择安装公共的 jre,jdk 目录下默认就有,无须安装。
OS:windows 7 64 位

原因:估计是安装目录下自带的 java 运行库 jre64 存在某种 bug。
解决:先关掉打开的 IDEA,安全起见,先重命名安装目录下 jre64 目录为 jre64_bak,再次启动 IDEA,解决了此问题。如果一切运行正常,就可以直接删除那个目录了。
看样子,这个目录直接删除也是可以的,没有这个目录,IDEA 会找到系统安装的 jdk(默认包含jre)。

JetBrains WebStorm 2017.2.4 x64 的解决方法也是一样的。

索引卡死的问题

今天研究 spring 官方示例:React.js and Spring Data REST,在各个项目下执行 cnpm install 之后,再用 IDEA 打开项目,就卡死了。反复试了好几次都一样。
正常情况下,打开普通的 react 项目,执行 cnpm install 下载依赖之前,为了避免 IDEA/WebStorm 索引 node_modules 目录下的文件导致卡死,我一般是先关掉项目,等 cnpm install 完成之后再打开,这样操作,IDEA/WebStorm 一般都会把 node_modules 自动识别为 library root,这样的话,是不会对这个目录索引的,所以,并不会卡死。从下面这个界面去看,可以确认这一点。被排除的目录,才能看到 Not Excluded 选项。

然而,多个非根目录下的 node_modules 可能不能被自动识别为 library root,于是我研究了一下已经把 node_modules 识别为 library root 的项目根目录下的 .idea 下的文件,找到了解决方案。
.idea 目录下的文件 workspace.xml,在节点 project 下添加如下内容:

1
2
3
4
5
6
7
<component name="NodeModulesDirectoryManager">
<handled-path value="$PROJECT_DIR$/basic/node_modules" />
<handled-path value="$PROJECT_DIR$/conditional/node_modules" />
<handled-path value="$PROJECT_DIR$/events/node_modules" />
<handled-path value="$PROJECT_DIR$/hypermedia/node_modules" />
<handled-path value="$PROJECT_DIR$/security/node_modules" />
</component>

再次打开项目,不再卡了,victory!

Could not autowire. No beans of ‘XXX’

eclipse 没有这个问题。

  1. 原因:bean 通过 @Autowired 自动注入,而 spring 配置文件中配置的自动扫描,而 idea 在编辑情况下,找不到对应的 bean,于是有 Could not autowire. No beans of ‘XXX’ 的错误提示。实际上,可以 build 项目且能正常运行的。
  2. 解决:
    • 在 File -> Settings -> Editor -> Inspections,使用搜索功能找到 Autowiring for Bean Class,将 Severity 的级别由之 Error 改成 Warning(或其它可以忽略的级别)。
    • 不搜索的话,完整的设置路径在:File -> Settings -> Editor -> Inspections -> Spring -> Spring Core -> Code -> Autowiring for Bean Class。不过,通过上图也可以看出来完整路径。

使用 Spring-boot-devTools 无效解决办法

添加依赖

1
2
3
4
5
6
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖此项目的项目如果想要使用devtools,需要重新引入 -->
<optional>true</optional>
</dependency>

设置:compiler->Build project automatically,打勾
然后 Shift+Ctrl+Alt+/,选择Registry
进去之后,找到如下图所示的选项(compiler.automake.allow.when.app.running),打勾


重启一下项目,然后改一下类里面的内容,IDEA就会自动去make了。

编译缓存

用 IDEA 的调度功能查看页面。分页组件:JQuery.datatables

一次做一个新页面,有关分页的,该页面分页组件是在项目里很多地方用的,用法也跟其它一样,但是,第一页那【1】,点击之后就是没反应,重新查询,本来应该跳到第一页的,也不管用,每次都是上一次的页数。
反复检查,看官方帮助,都无果,正痛苦的测试中,突然电脑死机了。
让我万万没想到的是,重新开机之后,竟然完全正常了。
没法儿解释呀!
只能说,下次遇到这种从代码级别看明显没有问题的情况,可以考虑用 IDEA 的 Rebuild Project 功能试试。猜想应该是缓存导致的,是浏览器还是 IDEA 的,现在还说不清楚。
先记录一下。

其实是使用了两个 table 导致的,只不过,死机之前,我正好注释掉了一个,本来也是要看是不是两个导致,汗…

Cannot load project

1
com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing 'com.intellij.xdebugger.XDebuggerManager'

一次正调试程序的过程中,用的是 idea 启动的 web 项目,浏览器用的是 google 的 chrome 调试 js,正调试呢,死机了,屏幕黑屏,键盘类灭了,鼠标灯也灭了。
再次开机,打开之前的项目,得到如上提示。
但打开非 java 项目,则没有问题。
照着输入法的方案把安装目录下的 jre64 目录删除,再打开,就 OK 了。

备注,新安装的 win10 pro, idea 为 2017.2.5,中文输入法没有问题。

网上的方案:
解决办法:
清空windows上c:\Users.IntelliJIdea11<版本>\config\plugins\这个目录,然后
重启即可

spring boot 启动项目,打 war 包

通过初始向导创建的项目,选 war 包,启动有问题,还没仔细研究。选了默认的 jar 项目,但又想打包。
于是,直接将 pom.xml 时的 jar 改为 war,在 项目设置里,随便添加一个 war,指向 boot 项目,然后 Build artifacts…,注意,右下角提示需要 maven 依赖,启用之,会自动添加 boot 项目的 war 及 exploded,然后将手工添加的删除即可。
总结,idea 强大!

Project Structure -> Artifacts, delete all
modify pom.xml jar to war, pay attention, idea right down “Maven projects need to be …”, click “Import Changes” or click “Enable Auto-Import”, that’s ok!

Maven 传递依赖排除、禁止传递依赖

A 依赖 B, B 依赖 C, 那么,A 可以直接访问 C,如果不想这样,可以在依赖里排除。

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>open.isv</groupId>
<artifactId>alibaba.service</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>open.isv</groupId>
<artifactId>dal</artifactId>
</exclusion>
</exclusions>
</dependency>

但是问题来了,如果项目 A 调用 B 里某个类的方法 F,这个 F 又需要调用 C 的某个类,那么上面的排除会带来运行时错误。
只有你能确保项目运行过程不会引用到 C 里的类,那么这种排除才是安全的。

如果要去掉全部的传递依赖

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>open.isv</groupId>
<artifactId>alibaba.service</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<artifactId>*</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>

多 module 组织方式

ideaMoveModuleToGroup 给多个 module 分组

告别 module 太多导致太乱影响开发效率


最佳实践:利用 pom.xml 的 modules 属性

如果是新项目,或者你可以大刀阔斧的重新整理项目结构,那么,可以把相关 module 放到一个文件夹下,然后用一个 pom.xml 文件来组织,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>io.github.uncleAndyChen</groupId>
<artifactId>bbs-api-biz</artifactId>
<packaging>pom</packaging>
<version>0.0.1</version>

<modules>
<module>bbs-api-biz-facade</module>
<module>bbs-api-biz-service</module>
<module>bbs-api-biz-model</module>
<module>bbs-api-biz-dal</module>
<module>bbs-api-biz-enumeration</module>
</modules>

</project>

可以参考这个项目的多模块组织方式:https://github.com/uncleAndyChen/spring-boot-bbs-api

该项目的 module 目录结构如下:

1
2
3
4
5
6
7
8
9
10
├─bbs-api-biz
│ ├─bbs-api-biz-dal
│ ├─bbs-api-biz-enumeration
│ ├─bbs-api-biz-facade
│ ├─bbs-api-biz-model
│ └─bbs-api-biz-service
├─bbs-api-common
│ ├─bbs-api-common-lib
│ └─bbs-api-common-model
└─bbs-api-spring-boot

在 IDEA 中打开,是这个样子:

项目 rebuild 之后,依然有旧的代码影响,直接导致项目发布后,启动失败。

初次解决这种问题可能会非常痛苦,因为本地运行正常,检查代码也是正常的,重新上传更新,问题依旧。

1
21:29:31,671 <org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext>  WARN [localhost-startStop-1]: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from URL [file:/home/utomcat/webapps/apg/apg/WEB-INF/classes/mvcConfig.xml]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'apgConfig' for bean class [apg.config.ApgConfig] conflicts with existing, non-compatible bean definition of same name and class [apg.boot.config.ApgConfig]

解决:

  1. mvn clean
  2. 或者直接到项目根目录搜索 target,然后全部删除。
  3. 然后 rebuild project (IDEA),再然后 Build Artifacts…,上传打包好的文件,重新更新到服务器。搞定。

如果有循环依赖,则会报如下错误

1
Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [jos.service,boot.jos,biz.service] are excluded from annotation processing

查看依赖关系,IDEA 菜单:Analyze->Analyze Module Dependencies…
“电路板”查看:右边 Maven 菜单,Show Dependences … (Ctrl+Alt+Shift+U)

传统 web 项目,tomcat 调试设置

两步:


idea设置tomcat虚拟路径

上述第二步操作之后,显示如下:

红框处的虚拟目录名是根据项目的这个配置<artifactId>permission</artifactId>自动生成,以artifactId 对应的值为前缀,在这里是 permission

然而,通常 web 项目的根路径是 /,在项目中路径跳转都以 / 为默认根路径,所以,使用自动生成的虚拟路径名会有冲突。
而解决办法也很简单,将自动生成的虚拟路径名改为 / 即可。

特别地,如果点【Fix】之后没有下拉选项,那么需要先在 Project Structure -> Artifacts 去添加,如下图:

IntelliJ IDEA2017 + tomcat 即改即生效 实现热部署

点击 idea 中 tomcat 设置

  • Deployment 一项,需要选择 exploded。
  • 将 server 的项 “On Update action”、”On frame deactivation” 都选择 update classes and resources

idea 快捷键失效的问题

Debug 时 F8 快捷键失效

我的是被有道词典的【取词划词】->【开关热键】给占用了,如下图,删除或者换别的快捷键即可。

在项目范围内查找快捷键失效:Ctrl+Shift+F

我的是被搜狗输入法给占用了,如下图,取消勾选即可。

Intellij idea 错误提示信息不能复制的问题

  • IDEA的错误提示问题,鼠标移动上去后会有黄色/红色框提示,鼠标一移动,提示信息就会消失。有时这个提示信息很有必要复制下来,但又不能及时复制下来。
  • 在 Ctrl+F1 或者点击 “more” 之后,选中,Ctrl+C 不好使。

解决

在鼠标停留在有提示信息的代码处,在 idea 的状态栏,点击右键,会出现 Copy 的按键,点击则可将警告信息复制。

警告信息
警告信息

警告的全部信息
警告的全部信息

复制警告信息
复制警告信息

变量的中文内容是乱码,解决方案:将所有地方的编码设置为 utf-8

  1. 环境:IDEA 2017.2.5 + spring 4.3.2
  2. 现象:restful api,变量赋值中文内容,输出的是乱码。
  3. 解决过程,非常曲折,下面简单的说一下,通过这次解决这个问题的过程,得到的结论是:在解决问题的过程中,不能想当然,要抱着怀疑一切的态度去尝试。
    • 项目是一个 restful api。在 win7 英文版 64 位下正常。后来换到 win10 英文版 64 位后就出现输出的中文是乱码了。
    • IDEA 的配置跟在 win7 下是一样的,所有文件采用 utf-8 编码。新的 api 中文输出乱码,测试了一下之前在 win7 下正常的 api,中文输出也变成乱码了。
    • 但是,api 在调用第三方 api 获取到的中文内容却没有变成乱码,只有自己赋值的中文内容才会输出乱码,真是汗呀。
    • 这种背景下,最先能想到的,肯定就是项目配置了。几乎尝试了网上找到的所有关于中文输出乱码的解决方案,均以失败告终。
    • 同样的代码,换到最新的 spring boot 项目里,正常。
    • 同样的代码,在家里 win8.1 英文 64 位操作系统上测试,正常。
    • 有网友说,先控制台直接输出变量,看是否为乱码,我当时想都没想,就说,那肯定是正常的。我的理由:api 返回的信息中,从第三方获取到的中文,从 excel 读取到的中文均是正常的,IDEA 的文件编码也全是 utf-8,没道理刚赋值就变乱码。
    • 如果你也这么认为,恭喜你,你跟我都犯了想当然的错了。在一次调试过程中,我特意查看了一下,竟然刚赋值,变量的内容就是乱码。这就不得不怀疑文件编码了,于是专门用 notepad++ 打看,查看 encoding,确实是 utf-8 编码。
    • 这个问题,看似已经无解了。本来已经想放弃了,不过还是有一点不甘心,于是又以关键词“idea 变量中文乱码”搜索,找到设置文件编码的一篇文章,这篇文章里介绍的设置编码的方式跟我平时在设置里设置的不一样,抱着死马当活马医的心态尝试了一下,竟然好了!
    • 网上看到的方案中,项目编码设置和 IDEA 的设置都差不多。
    • 真正起作用的步骤是:在代码区域点右键,在弹出的菜单中选择 File Encode,将编码设置为 UTF-8。
  4. 后记:问题解决之后,想看一下到底是哪个文件的编码不对,于是在提交代码之前,从 git 上重新摘取一份儿代码,运行测试,竟然不能重现!汗!应该是 IDEA 在设置一次 File Encode 之后,全局生效了。
  5. 结论:之所以新项目(spring boot)没有乱码问题,应该是所有文件都是基于 IDEA 配置来生成的,即均为 utf8 格式,而出问题的项目,是一个老项目,之前是用 eclipse 编辑的,部分文件的编码影响到了。而 win7 正常,换 win10 不正常,这个,应该是跟 windows 的默认字符集(一般为 GBK)有关。

清理旧的已经不用了的包以及编译后的class文件

  1. 之前有一个包,已经编译过,后来重命名包,通过IDEA再次编译,旧包还存在于target下对应的目录,但直接运行或者调试项目均无问题。
    • 解决:mvn clean