IntelliJ Idea Java 使用
IntelliJ Idea热加载 自动更新
IntelliJ IDEA热加载自动更新(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
勾选标注 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
快捷键
查找相关
- 双击Shift 查找项目中所有目录中的文件
- Ctr+F 在当前文件中查找指定内容
- Ctrl+Shift+F 在当前项目查找包含查找内容的文件
- Ctrl+N 查找类 (n:navigate)
- Ctrl+Shift+N 查找类和文件
- Ctrl + E 显示最近使用过的文件
- Alt + F7 查找函数或者变量或者类的所有引用到的地方
- 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
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 项目相关的几个重要概念介绍
必备材料介绍
- IntelliJ IDEA 对其他 IDE 转过来的用户有特别优待,对其专门整理了非常棒的资料,还请其他 IDE 过来的用户抽时间查看,会有很大帮助:
- Eclipse 用户可以看:https://www.jetbrains.com/idea/help/eclipse.html
- NetBeans 用户可以看:https://www.jetbrains.com/idea/help/netbeans.html
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-core
、spring-jdbc
、spring-jms
、spring-orm
、spring-web
、spring-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 的插件分类,
All plugins
:显示 IntelliJ IDEA 支持的所有插件;Enabled
:显示当前以前启用的插件;Disabled
:显示当前未启用的插件;Bundled
:显示 IntelliJ IDEA 所有自带的插件;Custom
:显示我们自己安装的插件。
IntelliJ Idea Java 使用的更多相关文章
- intellij 创建java web项目(maven管理的SSH)
intellij 创建java web项目(maven管理的SSH) 环境intellij IDEA14.MAVEN.Spring.Struts2.Hibernate.Java Web.工程搭建. 1 ...
- Intellij IDEA Java web 项目搭建
Java web 项目搭建 简介 在上一节java web环境搭建中,我们配置了开发java web项目最基本的环境,现在我们将采用Spring MVC+Spring+Hibernate的架构搭建一个 ...
- IntelliJ IDEA java文件注释模板
一.设置 二.注释模板 /*** @version: java version 1.7+* @Author : * @Explain :* @contact: * @Time : ${DATE} ${ ...
- IntelliJ IDEA java selenium
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...
- (转)IntelliJ IDEA java项目导入jar包,打jar包
以下为转载原文:https://www.cnblogs.com/yulia/p/6824058.html 一.导入 1.java项目在没有导入该jar包之前,如图: 2.点击 File -> ...
- IntelliJ IDEA java项目导入jar包,打jar包
一.导入 1.java项目在没有导入该jar包之前,如图: 2.点击 File -> Project Structure(快捷键 Ctrl + Alt + Shift + s),点击Proje ...
- IntelliJ IDEA Java项目中添加jar包
1. 事先下载完成需要的javacsv.jar包. java项目在没有导入该jar包之前,显示如下图所示 2. 点击 File -> Project Structure(快捷键 Ctrl + ...
- IntelliJ IDEA java开发 WebService
测试的功能是通过访问solr服务器,获取相关信息,然后以webservice的形式供客户端访问来获取数据.通过查询资料,现在把过程记录如下: 1.环境 IntelliJ IDEA 2017.2.6 J ...
- Intellij格式化java和xml
使用Intellij的这段时间,一直在寻找一些技巧,不断提高对它的熟练度.接下来告诉大家一个小秘密,带大家体验一下Intellij半自动格式化代码的快感.那要使用这个功能还得安装一个插件--Eclip ...
随机推荐
- 洛谷P1029 最小公约数和最大公倍数问题【数论】
题目:https://www.luogu.org/problemnew/show/P1029 题意: 给定两个数$x$和$y$,问能找到多少对数$P$$Q$,使得他们的最小公约数是$x$最大公倍数是$ ...
- javascript中call、apply、bind详解
1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和call的定 ...
- 9 tips to improve spoken english
https://www.youtube.com/watch?v=FUW_FN8uzy0 1. don't translate everything into your native language ...
- linux screen工具
https://www.cnblogs.com/lpfuture/p/5786843.html 一.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长 ...
- jQuery -- 监听input、textarea输入框值变化
$('textarea').bind('input propertychange', function(){ if($(".textareachange").val() != &q ...
- 洛谷 P3521 ROT-Tree Rotations [POI2011] 线段树
正解:线段树合并 解题报告: 传送门! 今天学了下线段树合并,,,感觉线段树相关的应用什么的还是挺有趣的,今天晚上可能会整理一下QAQ? 然后直接看这道题 现在考虑对一个节点nw,现在已经分别处理出它 ...
- QUIC:基于udp的传输新技术
Google研发 https://blog.csdn.net/b2222505/article/details/79391430
- python-面向对象-02_类和对象
类和对象 目标 类和对象的概念 类和对象的关系 类的设计 01. 类和对象的概念 类 和 对象 是 面向对象编程的 两个 核心概念 1.1 类 类 是对一群具有 相同 特征 或者 行为 的事物的一个统 ...
- Docker镜像推送(push)到Docker Hub
镜像构建成功后,只要有docker环境就可以使用,但必须将镜像推送到Docker Hub上去.我们之前创建的镜像不符合Docker Hub的tag要求,因为 在Docker Hub注册的用户名是boo ...
- innodb_flush_method理解【转】
innodb_flush_method这个参数控制着innodb数据文件及redo log的打开.刷写模式,对于这个参数,文档上是这样描述的: 有三个值:fdatasync(默认),O_DSYNC,O ...