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。
 
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在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导入包

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

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

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

 

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

快捷键

查找相关

  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中tomcat的输出路径 (另外修改发布路径)

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

svn显示差异:

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

修改颜色:
setting->file status:

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

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

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

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

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

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

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

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

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

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

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

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

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

左右窗口联动的实现:

IntelliJ IDEA 设置选中标识符高亮

设置为黄色显眼一点。

 
 
 
 
 
 

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展示样式是:  or .

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

1、Source Roots(或Source Folders,展示样式: 

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

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

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

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

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

3、Excluded Roots(展示样式:):

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

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

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

显示函数列表:

调出structure视图:

安装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:显示我们自己安装的插件。

IntelliJ Idea Java 使用的更多相关文章

  1. intellij 创建java web项目(maven管理的SSH)

    intellij 创建java web项目(maven管理的SSH) 环境intellij IDEA14.MAVEN.Spring.Struts2.Hibernate.Java Web.工程搭建. 1 ...

  2. Intellij IDEA Java web 项目搭建

    Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring+Hibernate的架构搭建一个 ...

  3. IntelliJ IDEA java文件注释模板

    一.设置 二.注释模板 /*** @version: java version 1.7+* @Author : * @Explain :* @contact: * @Time : ${DATE} ${ ...

  4. IntelliJ IDEA java selenium

    // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...

  5. (转)IntelliJ IDEA java项目导入jar包,打jar包

    以下为转载原文:https://www.cnblogs.com/yulia/p/6824058.html 一.导入 1.java项目在没有导入该jar包之前,如图: 2.点击 File ->   ...

  6. IntelliJ IDEA java项目导入jar包,打jar包

    一.导入 1.java项目在没有导入该jar包之前,如图: 2.点击 File ->  Project Structure(快捷键 Ctrl + Alt + Shift + s),点击Proje ...

  7. IntelliJ IDEA Java项目中添加jar包

    1. 事先下载完成需要的javacsv.jar包. java项目在没有导入该jar包之前,显示如下图所示 2. 点击 File ->  Project Structure(快捷键 Ctrl + ...

  8. IntelliJ IDEA java开发 WebService

    测试的功能是通过访问solr服务器,获取相关信息,然后以webservice的形式供客户端访问来获取数据.通过查询资料,现在把过程记录如下: 1.环境 IntelliJ IDEA 2017.2.6 J ...

  9. Intellij格式化java和xml

    使用Intellij的这段时间,一直在寻找一些技巧,不断提高对它的熟练度.接下来告诉大家一个小秘密,带大家体验一下Intellij半自动格式化代码的快感.那要使用这个功能还得安装一个插件--Eclip ...

随机推荐

  1. 洛谷P1029 最小公约数和最大公倍数问题【数论】

    题目:https://www.luogu.org/problemnew/show/P1029 题意: 给定两个数$x$和$y$,问能找到多少对数$P$$Q$,使得他们的最小公约数是$x$最大公倍数是$ ...

  2. javascript中call、apply、bind详解

    1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和call的定 ...

  3. 9 tips to improve spoken english

    https://www.youtube.com/watch?v=FUW_FN8uzy0 1. don't translate everything into your native language ...

  4. linux screen工具

    https://www.cnblogs.com/lpfuture/p/5786843.html 一.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长 ...

  5. jQuery -- 监听input、textarea输入框值变化

    $('textarea').bind('input propertychange', function(){ if($(".textareachange").val() != &q ...

  6. 洛谷 P3521 ROT-Tree Rotations [POI2011] 线段树

    正解:线段树合并 解题报告: 传送门! 今天学了下线段树合并,,,感觉线段树相关的应用什么的还是挺有趣的,今天晚上可能会整理一下QAQ? 然后直接看这道题 现在考虑对一个节点nw,现在已经分别处理出它 ...

  7. QUIC:基于udp的传输新技术

    Google研发 https://blog.csdn.net/b2222505/article/details/79391430

  8. python-面向对象-02_类和对象

    类和对象 目标 类和对象的概念 类和对象的关系 类的设计 01. 类和对象的概念 类 和 对象 是 面向对象编程的 两个 核心概念 1.1 类 类 是对一群具有 相同 特征 或者 行为 的事物的一个统 ...

  9. Docker镜像推送(push)到Docker Hub

    镜像构建成功后,只要有docker环境就可以使用,但必须将镜像推送到Docker Hub上去.我们之前创建的镜像不符合Docker Hub的tag要求,因为 在Docker Hub注册的用户名是boo ...

  10. innodb_flush_method理解【转】

    innodb_flush_method这个参数控制着innodb数据文件及redo log的打开.刷写模式,对于这个参数,文档上是这样描述的: 有三个值:fdatasync(默认),O_DSYNC,O ...