部署在项目开发过程中是常有的事,特别是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的修改,不支持对类和方法签名的修改(比如修改类名,方法名,方法参数等)。考虑这些限制,也是有理由的,替换类定义,就需要新类和旧类之间有一个关联,这里关联就是类的全名(或许还有其他信息),类名都改了,就不知道替换哪个类了。至于方法签名的修改,应该是考虑到运行时方法的调用,通过方法签名替换已有的方法调用。
-
三种目录:项目的源程序目录,构建输出目录,部署目录(这是我按照我个人理解划分的)。热部署的设置与这些目录有着密切关系。源程序目录包括java文件,资源文件,web资源文件等项目文件的目录;构建输出目录是指通过编译java源文件,copy资源文件构建一个应用程序部署之后应该具有的目录结构;部署目录很好理解,就是应用程序在服务器中可以存在的位置。
通常我们部署一个应用是将该应用打包成war或者ear,而通常开发阶段是构建成Server指定的目录结构来部署到Server上,如果每次要copy来copy去,那麻烦死了。所以我们要想办法减少不必要的copy。
-
第一种方法:在Server部署目录下设置构建输出目录,以tomcat为例,就是在%tomcat_home%\webapps目录下建立一个新的目录,目录名就是你的应用context,具体就是打开项目设置界面(ctrl+alt+shift+S,v8.0),选择Modules,将你的应用Exploded Directory设置为%tomcat_home%\webapps\yourContext。同时,将你各个Module的编译输出路径设置为%tomcat_home%\webapps\yourContext\WEB-INF\classes(可能需要你预先手动建立),这样class文件就自动生成到该目录下。
-
第二种方法:现在一些Server都支持重定向,以tomcat为例,可以在%tomcat_home%\conf\Catalina\localhost下创建一个xml配置文件将部署目录指定为你的构建输出目录。代码片段如:<Context path=”/myApp” docBase=”D:\workspace\myProject\out\exploded\myApp” />。这样每次修改了java文件之后comile一下修改的文件,对于jsp需要make一下,就能达到热部署的目的。其实现在Intellj Idea默认设置使用的就是这种方法,只不过这个重定向的配置文件在你的Documents and Settings里面,所以你如果你使用这样方法,不必自己设置。
其实,这两种方法是异曲同工。
进一步设置:将你的构建输出目录直接设置在源程序目录中,然后重定向的docBase直接指向你的web根目录(就是WEB-INF的父目录)。这样,你只要将编译输出目录设置为WEB-INF\classes就行了,而且,修改JSP文件都不要重新构建,唯一要做的就是修改了java文件之后compile一下。
再进一步设置:打开Setting界面(ctrl+alt+S),然后
- 其一:选择Compiler选项,在Deploy web application to servers after compilatoin下勾选Never,为什么选Never?因为根据我们上面的设置,对于java文件的修改,编译(compile,ctrl+shift+f9)之后已经更新到了部署目录,而对于其他文件(例如jsp),构建(make,ctrl+f9)之后也都更新到了部署目录,当然如果你的部署目录就设置在源程序目录中,那jsp都不要在make了。
- 其二:选择Debugger-HotSwap选项,确保勾选了Make project before reloading classes,同时选择Reload classes after compilation为Always。这样我们在编译某个修改了的java文件之后,就会利用HotSwap机制reload class,而Make project before reloading classes就确保了其他修改过的文件一起同步到部署目录。
这样,经过上面这些设置,在debug时最大程度上减少了Re-deploy和重启服务器的次数。对于内存不足的电脑来说,re-deploy次数多了,就会outOfMemory,然后不得不重启服务器。
小建议:由于HotSwap的限制,能够提前定义好的属性,方法,预先写在类里面,方法body的具体逻辑可以以后再加,这样有利于减少了hotswap失败的次数。
分享到:
相关推荐
Java热部署技术是一种提高开发效率的重要工具,它允许开发者在运行时修改代码并立即生效,无需重新启动应用程序服务器。在传统的开发过程中,每次修改代码后都需要重新编译、打包,然后重启服务器才能看到更改的效果...
Java热部署工具是一种在开发过程中无需重启应用服务器即可更新代码或资源的技术,极大地提高了开发效率。热部署使得开发者能够在运行时动态替换、添加或移除类,而不影响应用程序的正常运行。这种技术对于大型的、...
Java 热部署解决方案详解 Java 热部署是指在不停止应用程序的情况下,动态地更新和替换应用程序中的类、方法或资源。这种技术可以提高开发效率、缩短开发周期、降低维护成本。今天,我们将讨论实现 Java 热部署的几...
java热部署
有没有在为修改java代码 反复重启tomcat而烦恼 下载热部署一切不成问题。内容:1.热部署 2.分给myeclipse 1g内存
本项目“rebu.zip”显然整合了这三个框架,旨在创建一个完整的Java Web应用程序,同时支持热部署功能,以提升开发效率。 首先,让我们深入了解每个框架的核心特性: 1. **SpringBoot**:SpringBoot是由Pivotal团队...
Java 热部署技术是开发过程中的一大挑战,它旨在实现在不重启 Java 虚拟机(JVM)的情况下更新应用程序的部分代码。由于 JVM 默认仅在启动时加载类,一旦类加载,即使原始的 .class 文件发生变化,JVM 也不会自动...
美团IDEA插件实现Java应用的热部署实践 热部署是指在应用程序运行时升级软件,而不需要重新启动应用。对于Java应用程序来说,热部署就是在运行时更新Java类文件,同时触发Spring以及其他常用第三方框架的一系列重新...
在Java开发过程中,为了提高开发效率和调试便捷性,我们经常需要实现类的热替换(Hot Deployment),也就是在不重启应用的情况下更新或替换已加载的类。Java类热替换技术通常涉及类加载器(ClassLoader)的自定义...
JRebel eclipse 热部署
Java热部署技术主要指的是在Java应用运行过程中,无需重启服务就能更新代码并立即生效的能力。这对于开发阶段提高效率和减少停机时间至关重要。虽然标准的Java虚拟机(JVM)并不直接支持类的动态加载和替换,但是...
**Java热部署插件——JRebel 6.5.2** JRebel是一款高效便捷的Java应用热部署工具,它的出现极大地提升了开发者的效率,避免了在开发过程中频繁重启应用服务器来查看代码更改的效果。标题提到的是"jrebel_6.5.2",这...
这篇博文“JAVA类加载器分析--热部署的缺陷”探讨了Java类加载机制以及在热部署场景下可能遇到的问题。热部署允许开发者在不重启应用的情况下更新代码,提高开发效率,但同时也存在一些挑战。 首先,我们来理解类...
在开发过程中,为了提高效率,我们通常希望在不中断应用服务的情况下更新部署的应用程序,这就是所谓的“热部署”配置。这篇博客将探讨如何在JBoss中实现热部署。 首先,理解热部署的基本原理是至关重要的。热部署...
Java 热部署操作笔记。Spring Tool Suite.网上能看到的资源多事mvn 的,再这个文档里面,很详细的介绍了.yml元素的写法。和注意事项。
热部署的原理是基于Java的类加载机制。当我们修改了Java类文件后,热部署机制会重新加载该类文件,并将其应用于当前的应用程序中。这要求服务器支持热部署机制,例如Tomcat、JBoss等。 eclipse配置热部署 下面是...
在Java开发环境中,热部署允许开发者在不重启应用服务器的情况下修改代码并立即看到效果,极大地提升了开发效率。MyEclipse作为一款强大的Java EE集成开发环境,提供了对热部署的支持,但默认情况下并不开启。本篇...
【标题】"jboss 热部署必须jar" 指的是在JBoss应用服务器上进行热部署所需的关键Java档案(jar)。热部署允许开发者在不关闭或重启服务器的情况下更新应用,大大提高了开发效率和调试速度。对于JBoss而言,这个特定...
### Erlang中的Module级别热部署 #### 一、引言 Erlang 是一种专为构建高并发、容错性强的分布式系统而设计的编程语言。它的独特之处在于支持轻量级进程(也称为协程)和热部署能力。本文将深入探讨Erlang 中的 ...