IntelliJ Idea Java 使用

时间:2023-03-09 04:01:49
IntelliJ Idea Java 使用

IntelliJ Idea热加载 自动更新

IntelliJ IDEA热加载自动更新(Update classes and resources )

IntelliJ IDEA默认文件是自动保存的,但是手头有个项目jsp文件改动后,在tomcat中不能立即响应变化。想要jsp文件改动后立刻看到变化,可以通过修改配置来实现。
      在IDEA tomcat 中server的配置里,有个On frame deactivation,选择Update classes and resources。另外有个配置on update action,就是手动操作的时候采取什么动作,可以重启服务器,也可以像上面一样更新类和资源文件,我选的是Update classes and resources,也可以选择Redeploy。
IntelliJ Idea Java 使用
On update action:当发现更新时的操作   选择Update classes and resources 
On frame deactivation:当IDEA 切换时的操作 (比如缩下去、打开网页等) 选择Update classes and resources
       可是当前项目没有Update classes and resources这个选项,有个Hot Swap classes。这是由于服务器添加的Artifact类型问题,一般一个module对应两种类型的Artifact,一种是war,一种是war explored。war就是已war包形式发布,当前项目是这种形式,在这种形式下On frame deactivation配置没有Update classes and resources选项。war explored是发布文件目录,选择这种形式,On frame deactivation中就出现Update classes and resources选项了。
在debug模式下,修改某个方法名会自动class reload
IntelliJ Idea Java 使用
intellij idea在debug模式下,会自动 检测class的修改,等会儿会自动class reload.注意,不是debug是不会的。不设置update classes and resouces, class修改后是不会自动class reload的。所以之前设置update classes and resources是有必要的.

JVM之-----热部署hotswap

热部署是在不重启 Java 虚拟机的前提下,能自动侦测到 class 文件的变化,更新运行时 class 的行为。

  目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。对于某些大型的应用来说,每次的重启都需 要花费大量的时间成本。虽然 osgi 架构的出现,让模块重启成为可能,但是如果模块之间有调用关系的话,这样的操作依然会让应用出现短暂的功能性休克。本文将探索如何在不破坏 Java 虚拟机现有行为的前提下,实现某个单一类的热部署,让系统无需重启就完成某个类的更新。

默认的虚拟机行为只会在启动时加载类,如果后期有一个类需要更新的话,单纯替换编译的 class 文件,Java 虚拟机是不会更新正在运行的 class。如果要实现热部署,最根本的方式是修改虚拟机的源代码,改变 classloader 的加载行为,使虚拟机能监听 class 文件的更新,重新加载 class 文件,这样的行为破坏性很大,为后续的 JVM 升级埋下了一个大坑。

另 一种友好的方法是创建自己的 classloader 来加载需要监听的 class(终极方案),这样就能控制类加载的时机,从而实现热部署。

难点:

这种自上而下(父类优先加载)的加载方式的好处是,让每个 classloader 执行自己的加载任务,不会重复加载类。但是这种方式却使加载顺序非常难改变,让自定义 classloader 抢先加载需要监听改变的类成为了一个难题。

不过我们可以换一个思路,虽然无法抢先加载该类,但是仍然可以用自定义 classloader 创建一个功能相同的类,让每次实例化的对象都指向这个新的类。当这个类的 class 文件发生改变的时候,再次创建一个更新的类,之后如果系统再次发出实例化请求,创建的对象讲指向这个全新的类。

实现:

下面来简单列举一下需要做的工作。

  • 创建自定义的 classloader,加载需要监听改变的类,在 class 文件发生改变的时候,重新加载该类。
  • 改变创建对象的行为,使他们在创建时使用自定义 classloader 加载的 class。

This new feature encapsulates the ability to substitute modified code in a running application through the debugger APIs. 
——'HotSwapping' using JVM:http://www.jug.mk/blogs/ipenov/entry/hotswapping_using_jvm

网上很多人误解热部署和热加载的概念,所以造成乱配置的行为,这里提示一下.
热部署:就是容器状态在运行的情况下部署或者重新部署整个项目.在这种情况下一般整个内存会清空,重新加载.简单来说就是Tomcat或者其他的web服务器会帮我们重新加载项目.这种方式可能会造成sessin丢失等情况.
热加载:就是容器状态在运行的情况下重新加载改变编译后的类.在这种情况下内存不会清空,sessin不会丢失,但容易造成内存溢出,或者找不到方法。因为内存无法转变成对像. 一般改变类的结构和模型就会有异常,在已经有的变量和方法中改变是不会出问题的。在中模式最好是在调试过程中使用,免得整个项目加载.
debug模式都支持热加载.很方便使用.
——IDEA TOMCAT WEB开发 SSH开发 修改类不重启 热部署 热加载 IDEA8:http://3000pzj.javaeye.com/blog/503222

部署在项目开发过程中是常有的事,特别是debug的时候。但是如果每次fix一个bug都要把整个项目重新部署一遍以便测试fix的效果或者继续debug其他bug,那对开发人员来说无疑是一大噩梦。不过谁都不想噩梦连连,有了JVM的hotSwap以及Intellij Idea对debug,hotSwap的支持,从此美梦相伴(夸张了点:))。今天通过这篇文章介绍一下通过对Intellij Idea热部署的设置达到最方便的最高效的debug效果。
我想在介绍具体设置之前,不妨了解一些背景知识和概念。
HotSwap:“HotSwap”是JPDA(Java Platform Debugger Architecture)中的一个特性,JPDA增强是自Java 2 SDK1.4新增的功能。HotSwap允许将JVM中的类定义替换为新的类定义,这就允许开发人员在debug时,将修改过的class替换JVM中旧有的class,无需重新启动服务器。不过,目前HotSwap只支持对方法body的修改,不支持对类和方法签名的修改(比如修改类名,方法名,方法参数等)。考虑这些限制,也是有理由的,替换类定义,就需要新类和旧类之间有一个关联,这里关联就是类的全名(或许还有其他信息),类名都改了,就不知道替换哪个类了。至于方法签名的修改,应该是考虑到运行时方法的调用,通过方法签名替换已有的方法调用。 
——精通Intellij Idea之热部署:http://blog.buyihanshe.com/20090606/mastering-intellij-idea-hot-deploy.htm

IntelliJ IDEA 自动导入包 快捷方式

dea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动Alt+Enter设置

设置idea导入包

IntelliJ Idea Java 使用

勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化导入的包,比如自动去掉一些没有用到的包。 
勾选标注 2 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们导入需要用到的包。但是对于那些同名的包,还是需要手动 Alt + Enter 进行导入的

========================================================================================

idea有很多快捷方式(Alt+Insert),比如get,set,构造函数,hashcode,equlas....

IntelliJ Idea Java 使用

https://www.zhihu.com/question/23648034

http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/introduce.html

http://www.ituring.com.cn/article/37792

http://blog.csdn.net/chenshun123/article/details/51285890

IntelliJ Idea Java 使用

快捷键

查找相关

  1. 双击Shift 查找项目中所有目录中的文件
  2. Ctr+F 在当前文件中查找指定内容
  3. Ctrl+Shift+F 在当前项目查找包含查找内容的文件
  4. Ctrl+N 查找类 (n:navigate)
  5. Ctrl+Shift+N 查找类和文件
  6. Ctrl + E 显示最近使用过的文件
  7. Alt + F7 查找函数或者变量或者类的所有引用到的地方
  8. Ctrl+Shift+Alt+N 查找类中的方法或变量

https://www.zhihu.com/question/20783392

intellij idea maven projects工具条消失问题的解决

点击idea左下脚的如下按钮,maven projects工具条会马上出来:

IntelliJ Idea Java 使用

按钮之后的效果图如下:

IntelliJ Idea Java 使用

修改IntelliJ IDEA中tomcat的输出路径 (另外修改发布路径)

IntelliJ Idea Java 使用

IntelliJ Idea Java 使用

下图有个Application Context 就是发布路径:)

IntelliJ Idea Java 使用

IntelliJ Idea Java 使用

svn显示差异:

INtelliJ Ideal是有这个功能的,包括修改代码后的颜色变化。蓝色(修改),绿色(新增),灰色(删除).

修改颜色:
setting->file status:

IntelliJ Idea Java 使用

但是发现改了这里后是version control那里的local change颜色变了,左侧栏没有变动

intellij idea svn 修改文件后,父文件夹也标注修改

svn文件修改后,默认只有当前文件更改而父文件没有标注,很不直观;查了一顿后,发现,可以设置;

File—->settings—->version control—–>勾选show directories with changed descendants

IntelliJ Idea Java 使用

下面就是比较这个编辑器比eclipse的版本管理好的地方啦。

也就是这个本地代码在修改之后,他可以按你的想法分文件夹存放。

以方便把任务一个个的分开,做完一个提交一个。而不是在你提交的时候,你得自己仔细仔细的查找哪个和哪个是一个任务的,然后再提交,下面看图示范。

IntelliJ Idea Java 使用

图上,忘记打箭头啦(那个绿色的加号可以添加类别,红色减号,删除类别。就不示范了)。

可以看到我又添加了2个列表,一个是“线程测试”,一个是“system测试”。

这相当于是2个任务,他们又互不相干。你干完一个,你就可以选中一个列表,然后提交。

而不是下面这种。三个修改的文件放在一起,提交的时候,得自己找你完成了哪个任务,提交哪个文件。

IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结

intellij在切换代码选项卡的时候左侧的代码目录树窗口跟着联动:

左右窗口联动的实现:

IntelliJ Idea Java 使用

IntelliJ IDEA 设置选中标识符高亮

设置为黄色显眼一点。

 IntelliJ Idea Java 使用

IntelliJ idea快捷键:

alt+enter,选中一个类的时候可以自动导入包

IntelliJ IDEA的全局搜索快捷键:ctrl+shift+F

Intellij idea中优化包导入用的快捷键是 ctrl + alt + o, (optimize import)

alter+En ter: Alt + Enter Show intention actions and quick-fixes

Double Shift :Search everywhere

Ctrl + N :Go to class

Ctrl + Shift + N: Go to file

Ctrl + B or Ctrl + Click :Go to declaration

Ctrl + Alt + B :Go to implementation(s) 或者鼠标点击,跳转到实现类,这个非常实用。

IntelliJ IDEA的函数链接:按住ctrl,再鼠标点击选中的函数,就可以查看函数的源码

IntelliJ IDEA里java工程的java原文件及实现文件:进入源文件后,再按ctrl+H就可在右侧直接显示出实现它的文件,后缀是impl 。

显示打开的文件:

Ctrl + E :Recent files popup

ctrl+tab:显示switcher

十大Intellij IDEA快捷键

1 智能提示

Intellij首当其冲的当然就是Intelligence智能!基本的代码提示用Ctrl+Space,还有更智能地按类型信息提示Ctrl+Shift+Space,但因为Intellij总是随着我们敲击而自动提示,所以很多时候都不会手动敲这两个快捷键(除非提示框消失了)。用F2/ Shift+F2移动到有错误的代码,Alt+Enter快速修复(即Eclipse中的Quick Fix功能)。当智能提示为我们自动补全方法名时,我们通常要自己补上行尾的反括号和分号,当括号嵌套很多层时会很麻烦,这时我们只需敲Ctrl+Shift+Enter就能自动补全末尾的字符。而且不只是括号,例如敲完if/for时也可以自动补上{}花括号。

最后要说一点,Intellij能够智能感知Spring、Hibernate等主流框架的配置文件和类,以静制动,在看似“静态”的外表下,智能地扫描理解你的项目是如何构造和配置的。

5 查找打开

类似Eclipse,Intellij的Ctrl+N/Ctrl+Shift+N可以打开类或资源,但Intellij更加智能一些,我们输入的任何字符都将看作模糊匹配,省却了Eclipse中还有输入*的麻烦。最新版本的IDEA还加入了Search Everywhere功能,只需按Shift+Shift即可在一个弹出框中搜索任何东西,包括类、资源、配置项、方法等等。

类的继承关系则可用Ctrl+H打开类层次窗口,在继承层次上跳转则用Ctrl+B/Ctrl+Alt+B分别对应父类或父方法定义和子类或子方法实现,查看当前类的所有方法用Ctrl+F12

要找类或方法的使用也很简单,Alt+F7。要查找文本的出现位置就用Ctrl+F/Ctrl+Shift+F在当前窗口或全工程中查找,再配合F3/Shift+F3前后移动到下一匹配处。

Intellij更加智能的又一佐证是在任意菜单或显示窗口,都可以直接输入你要找的单词,Intellij就会自动为你过滤。

IntelliJ IDEA 项目相关的几个重要概念介绍

必备材料介绍

Project 和 Module 介绍

这两个概念是 IntelliJ IDEA 的必懂知识点之一,请务必要学会。

如 果你是 Eclipse 用户,并且已经看了上面给的链接,那 IntelliJ IDEA 首先告诉你一个非常重要的事情:IntelliJ IDEA 没有类似 Eclipse 工作空间(workspace)的概念的。很多从 Eclipse 转过来的人总是下意识地要再同一个窗口管理 n 个项目,这在 IntelliJ IDEA 是无法得到。IntelliJ IDEA 提供的体验是:一个 Project 打开一个 Window 窗口。

对于 Project,IntelliJ IDEA 是这样解释的:

  • Whatever you do in IntelliJ IDEA, you do that in the context of a project. A project is an organizational unit that represents a complete software solution. It serves as a basis for coding assistance, bulk refactoring, coding style consistency, etc.
  • Your finished product may be decomposed into a series of discrete, isolated modules, but it's a project definition that brings them together and ties them into a greater whole.
  • Projects don't themselves contain development artifacts such as source code, build scripts, or documentation. They are the highest level of organization in the IDE, and they define project-wide settings as well as collections of what IntelliJ IDEA refers to as modules and libraries.
  • 链接地址:https://www.jetbrains.com/idea/help/project.html

对于 Module,IntelliJ IDEA 是这样解释的:

  • A module is a discrete unit of functionality which you can compile, run, test and debug independently.
  • Modules contain everything that is required for their specific tasks: source code, build scripts, unit tests, deployment descriptors, and documentation. However, modules exist and are functional only in the context of a project.
  • Configuration information for a module is stored in a .iml module file. By default, such a file is located in the module's content root folder.
  • Development teams, normally, share the .iml module files through version control.
  • 链接地址:https://www.jetbrains.com/idea/help/module.html

通 过上面的介绍我们知道,在 IntelliJ IDEA 中 Project 是最*的级别,次级别是 Module。一个 Project 可以有多个 Module。目前主流的大型项目结构都是类似这种多 Module 结构,这类项目一般是这样划分的,比如:core Module、web Module、plugin Module、solr Module 等等,模块之间彼此可以相互依赖。通过这些 Module 的命名也可以看出,他们之间应该都是处于同一个项目业务情况下的模块,彼此之间是有不可分割的业务关系的。

所以我们现在总结:一个 Project 是由一个或多个 Module 组成,模块之间尽量是处在同一个项目业务的的情况下,彼此之间互相依赖关联。这里用的是 尽量,因为 IntelliJ IDEA 的 Project 是一个没有具备任何编码设置、构建等开发功能的,主要起到一个项目定义、范围约束、规范等类型的效果,也许我们可以简单地理解为就是一个单纯的目录,只是这个目录命名上必须有其代表性的意义。

下面我们以著名的 spring-framework 项目为例介绍多 Module 的结构的:

  • 项目主页:https://github.com/spring-projects/spring-framework
  • 该项目的 Project 命名是:spring-framework。该目录主要作用为各个 Module 的顶层目录进行约束,告诉协同者,这个目录下都是 spring-framework 相关的,我绝不对放 Android 相关源码、文档、文件在上面的。该目录并不是以一个实际性的目录来提现的,所以你访问主页是看不到的,但是当你 checkout 的时候,你必须为这个项目命名,至于命名默认就是 spring-framework
  • 该 Project 下有二十来个 Module,各个 Module 的命名也是有含义的,比如:spring-corespring-jdbcspring-jmsspring-ormspring-webspring-webmvc 等等,我们通过这些命名也能清楚地知道他们要表达的含义,这些 Module 下也都各自有 src 编码目录,可以自行编码和构建。
  • 相比较于多 Module 项目,小项目就无需搞得这么复杂。只有一个 Module 的结构 IntelliJ IDEA 也是支持的,并且 IntelliJ IDEA 创建项目的时候,默认就是单 Module 的结构的。
  • 如上图 Gif 图演示,在输入 Project name 的时候,Module name 和 Module file Location 自动进行改变,同时 Project location 和 Module file Location 完全一样,这也就表示,Project 目录和 Module 目录是同一个,所以此时 Project 目录下就会有 src 目录,但是我们应该明白其本质还是 Module 的目录。

关于 IntelliJ IDEA 的 Project 和 Module 终于解释清楚了,但是由于 IntelliJ IDEA 官网上又有一段话对此解释得不够好,特别是对 Eclipse 用户来讲:https://www.jetbrains.com/idea/help/eclipse-faq.html,其中有这样两句话:

  • An Eclipse workspace is similar to a project in IntelliJ IDEA
  • An Eclipse project maps to a module in IntelliJ IDEA

你可以把 IntelliJ IDEA 的 Project 当做 workspace 使用,IntelliJ IDEA 也是支持的,但是就像我们前面解释的那么那么多,这样是非常不符合其初衷的,所以请别把这段话当做教义去学习。对此 zeroturnaround 的大牛也有针对此进行了说明:http://zeroturnaround.com/rebellabs/getting-started-with-intellij-idea-as-an-eclipse-user/3/

Content Root:

Content Root是包含组成Module的所有文件的文件夹。

一个Module可以包含多个Content Root,但但多数情况一个Content Root就够了。在特殊情况下,没有Content Root的module也很有用。

在Intellij IDEA中Content Root展示样式是: IntelliJ Idea Java 使用 or IntelliJ Idea Java 使用.

分类:一个Content Root里的文件夹分为以下几类:

1、Source Roots(或Source Folders,展示样式: IntelliJ Idea Java 使用

标为此类的文件夹,告诉Intellij IDEA,此文件夹及其子文件夹应作为构建过程的一部分进行编译。

在Java的Module中,Source Roots的子文件夹代表着Java的包结构。

2、Resource Roots(或Resource Folders,展示样式: IntelliJ Idea Java 使用 ,只有Java Module才可用):

在我们的应用中,是给resource文件用的。如,图片文件、各种各样的xml配置文件和properties属性文件等。

在构建过程中,所有resource Roots下的内容将原封不动得拷贝到Output文件夹。

3、Excluded Roots(展示样式:IntelliJ Idea Java 使用):

Intellij IDEA对该文件夹基本忽略,对该文件夹下的文件提供非常有限的代码辅助。即便是搜索,Intellij IDEA也不会查找这个文件夹下的内容。

把一些不怎么重要的文件夹标记为Excluded Roots,可以提高Intellij IDEA的用户体验。

如果一个Module只是作为一个单独的依赖库,显然是不需要Content Root的。

显示函数列表:

调出structure视图:

IntelliJ Idea Java 使用

IntelliJ Idea Java 使用

安装mybatis插件:

搜索:Mybatis plugin

、作用
  • xml和mapper之间的有用导航
  • 支持生成语句,@Param注释和xml的映射器
  • 在xml中支持一些有用的mapper重命名
  • 支持mapper xml中select语句的正确结果类型
  • 支持mapper xml的正确无法解析的属性值
  • 支持在重命名mapper接口时重构mapper xml文件的名称
  • 支持mapper xml中基于id的标记的重构
  • 支持查找映射器接口和映射器xml元素的用法
  • 突出显示mapper xml的冲突元素为错误
  • 自动注册映射器为spring bean
  • 在编辑sql时,Mapper参数在xml中自动完成
  • #{} yourParameter
  • 基于@Param注解
  • 协会支持

CodeGlance

显示右侧代码缩略图

标注 1:显示 IntelliJ IDEA 的插件分类,

  1. All plugins:显示 IntelliJ IDEA 支持的所有插件;
  2. Enabled:显示当前以前启用的插件;
  3. Disabled:显示当前未启用的插件;
  4. Bundled:显示 IntelliJ IDEA 所有自带的插件;
  5. Custom:显示我们自己安装的插件。