A. idea jrebel怎么热部署
1.建立好Web项目
2. 将src\main目录下的webapp复制到project目录下(和src同级),改名为WebRoot.
2.进行设置File - Project Structure
(1) 设置Project compiler output 路径
(2) 设置moles的代码编译输出目录. 点击moles 设置右侧 use mole compile output path
都是设置为project\WebRoot\WEB-INF\classes
点击Apply,
注意: Exclude Output Paths 这个勾选的话,WEB-INF目录下的classes目录在IDEA里面就会被隐藏起来.同时在旁边Sources选项卡中,可以通过Exclude Folders设置要在IDEA中隐藏的目录,比如WebRoot目录
(3) 指定Web.xml和WebRoot的路径. 点击web,分别指定
Web Mole deployment descriptor 路径为 project\WebRoot\WEB-INF\web.xml
和 Web Resource Directory的路径 为 project\WebRoot
点击Apply.
(4) 设置Artifacts 选中exploded 设置Output directory的路径
B. 热部署的释义
所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。
对于java应用程序来说,热部署就是在运行时更野返新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务器,包括EJB服务器和Servlet容器,都支持热部署。类装入器不能重新装入一个已经装入的类,但只要使用一个新的类装入器实例,就可以将类再次装入一个正在运行的应用程序。
Tomcat的热部署
Tomcat的热部署(以后就不用重启了)
没有热部署和有热部署的开发效率是天差地别的。这个问题还受很多第三方软件包(Struts,Spring,Hibernate)的限制。本来可以热部署,加入了第三方的包就不可以了。所以,先说明详细的软件环境,和程序配置是非常必要的。
虚拟机:java version 1.5.0_06
Servlet Engine:Apache Tomcat/5.0.27
Eclipse:3.0.1
Myeclipse:3.8.3
应用程序情况:纯正的servlet+jsp+javabean,数据库连接使用JDBC-ODBC桥连接Access数据库。没有使用任何第三方软件包,没有使用Struts,Spring,Hibernate。WebRootWEB-INFlib下是空的。
配置方法:
ie登陆http://Tomcat所在的服务器IP:8080/ -> 点超连接“Tomcat Administration”-> 输入用户名密码登陆 ->在左侧的功能树中 -> Tomcat Server -> Service(Catalina) -> Host(localhost) -> Context(/要修改如氏的web项目) ->右侧新出现的页面中 ->Reloadable设置为true -> Save按钮 -> Commit Changes。
然后Tomcat日志显示:
debugging -- changes saved to conf/server.xml
- Removing web application at context path /test
- Processing Context configuration file URL file:D:Program FilesTomcat 5.0confCatalinalocalhost est.xml
- Removing web application at context path /admin
- unregistering logger Catalina:type=Logger,path=/admin,host=localhost
- Processing Context configuration file URL file:D:Program FilesTomcat 5.0confCatalinalocalhostadmin.xml
- Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true
- Initializing, config='org.apache.struts.action.ActionResources', returnNull=true
- Initializing, config='org.apache.webapp.admin.ApplicationResources', returnNull=true
- Removing web application at context path /webdav
- Processing Context configuration file URL file:D:Program FilesTomcat 5.0confCatalinalocalhostwebdav.xml
- Removing web application at context path /test
- Processing Context configuration file URL file:D:Program FilesTomcat 5.0confCatalinalocalhost est.xml
……
这样,设置就生效了。颂橡饥
开发时,修改.java文件后,调用这个类时日志提示:
- Reloading this Context has started
这是正在重新加载修改后的.class文件。
如果没有进行这个设置,修改.java文件后,不抛出异常。系统使用没有修改的.java文件继续运行。
不同版本的Tomcat的配置方法是不同的。这里使用的是5.0.27
j2ee开发插件(这里使用Myeclipse),也可能导致热部署失效。因为插件必须要把编译好的.class文件从工作空间复制到Tomcatwebapps下的项目里。才能使Tomcat得到需要热部署的文件。
注意:如果项目中加入了Struts,Hibernate,Spring之类的第三方软件,可能导致热部署失效。
C. gradle的jetty插件怎么实现热部署和debug模式
网上很多人误解热部署和热加载的概念,所以造成乱配置的行为山坦,这里提示一下.
热部署:就是容器状态在运行的情况下部署或者重新部署整个项目.在这种情况下一般整个内存会清空,重新加载.简单来说就是Tomcat或者其他的web服务器会帮我们重新加载项目.这种方式可能会造成sessin丢失等情况.
热加载:就是容器状态在运行的情况下重新加载改变编译后的类.在这种情况下内存不会清空,sessin不会丢失,但容易造成内存溢出,或者找不到方法。因为内存无法转变成对像. 一般改变类的结构和模型就会有异常,在已经有的变量和方法中改变是不会出问题的。在中模式最好是在调试过程中使用,免得整个项目加载.
debug模式都支持热加载.很方便使用.
IDEA TOMCAT WEB开发 SSH开发逗迟桐 修改类不重启 热部署 热加载 IDEA8..
实可以用jreble+maven+tomcat进行热部置的
1.在pom.xml中的 build 添加以下代码:
<plugins>
<plugin>
<groupId>org.zeroturnaround</groupId>
<artifactId>javarebel-maven-plugin</artifactId>
<version>1.0.5</version>
<executions>
<execution>
<id>generate-rebel-xml</id>
<phase>process-resources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<path>/gt</path>
<port>80</port>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</旦高plugin>
</plugins>
2. Run As > Run Configurations > Maven Build > Main > Goals
中添加:tomcat:run
3. run
这样就可以热部置了
D. IntelliJ IDEA 怎么热部署,每次修改java文件就得重启tomcat
确保使用的是debug模式。
确保tomcat是由idea实例化的。也就是说tomcat是在idea中配置好的
(特殊的修改如:项目配置文件,某些特殊类新增,方法名称参数的添加修改引起的不能热部署就必须重启,当然你也可以用Jrebel插件。此插件收费。可以实现大部分的修改热部署,包括修改项目配置文件等热部署。以下描述均指的是普通的修改下的热部署。)
项目配置如图:
当修改文件后,ctrl+F9,编译文件。tomcat会自动加载新文件。
On frame deactivation选项同样可以选择为 update classes and Resource选项。它的作用就是在你失去焦点的时候自动编译。例如:修改某文件后你直接切换到了浏览器,或者点了下别的。只要当前的intellij idea 不是焦点就会激活自动编译并更新文件动作。也就是说不用手动按ctrl+F9了。
所有以上操作,请确保是在DEBUG模式下操作。也就是运行tomcat的时候是debug模式启动的。
E. 如何实现Eclipse热部署
Tomcat比较轻快,非常适用于开发阶段使用。一般我们看官方文档指誉,会认为在server.xml中进行如下配置即可支持热部署:
Java代码
<Context path="/myApp" docBase="E:\workspace\myProject\web" reloadable="true"/>
但其实这样配置后,修改java代码会自动重启Tomcat服务器的,并非真正的热部署。修改多个文件的话,需要多次保存,保存一次就重启一次,非常之烦。
为了解决这个或逗岩问题,google了好多网页,终于在某位大侠的博客(时间太久忘了原文地址了)里头找到了答案,修改配置如下:
Java代码
<Context path="/myApp" docBase="E:\workspace\myProject\web" reloadable="false" crossContext="true"/>
这样修改java代码,就不会自动重启Tomcat,而且能及时生效了!
不过正如liuhanjun朋友评论中指出的,在追加方法或类变量时,衫御还是会提示重启。
我的开发环境是eclipse3.7+Tomcat7.0.23,在eclipse里头启停的服务器,Server location我选的是Use Tomcat Installation,Deploy path是webapp,Server Options下勾选了Serve moles without publishing。
F. 如何实现Eclipse热部署
其实eclipse中的热部署是通过设置应用服务器来实现的,以tomcat为例来说明:
方法 一:
一些无关Classloader的类,主要是作为工具类引用的,可以放在tomcat的shared.loader下。这个可以通过设置catalina.properties目录来实现。
但是此方法改变原有的类加载设计,可能工程需要做一些特别的改变。不具有普遍适应性。故略。
方法 二:
利用Tomcat配置的VirtualWebappLoader机制,告诉tomcat去加载第三方的其他jar文件咐念。配置方法同样在server.xml文件里。在前面加的Context下添加Loader。如下:
<Context docBase="E:/code/workspace/SCM/WebRoot" path="/SCM" reloadable="false"> <Loader className="org.apache.catalina.loader.VirtualWebappLoader" searchVirtualFirst="false" virtualClasspath="E:/code/workspace/SimpleLibs/libs/*.jar"></Loader>
</Context>
注意:上面的配置衡辩困适用于Tomcat 7.X。在Tomcat 6.0设置灶山virtualClasspath时,需要列举出具体的jar,即不能使用*.jar。
G. IDEA 2019配置SpringBoot实现热部署
1)设置IDEA的自动编译:
“File”→“Settings(Ctrl+Alt+S)”→“Build, Execution, Deplyment”→“Compiler”,选中“Build project automatically” 打勾
2)组合键 Shift+Ctrl+Alt+/,选择 Registry ,找到compiler.automake.allow.when.app.running,选中打勾。
(或者CTRL + SHIFT + A --> 查找Registry)
设置游览器禁用缓存:F12
至此配置完成,修改文件后不用重启,刷新页面即可看到效果
H. idea热部署需要点一下
需要点一下。Idea 热部署是指在开发阶段,修改代码后自动热部署到 web 容器,实时查看代码效果。Idea 支持多种容器,如 Tomcat、Jetty、Jboss 等。热部署需要开启,步骤如下:1. 在 Idea 中,选择 File -> Settings -> Build, Execution, Deployment -> Compiler。2. 勾选勾选 Build project automatically。3. 点击左侧的 Build Tools 选项卡,选择 Maven。再点击右侧勾选的项上的 Edit 按钮。4. 应该会轿模跳转到 Runner -- Maven 选项卡。勾选 On update action 选项卡目录,选择 Update classes and resources,点击OK保存。这样配置后,每当我们修改了代码慧核后,Idea 会自动编闭碧缓译项目,并将编译后的文件部署到 Tomcat 等容器中,可以避免频繁的手动部署,并且查看效果更为直观和方便。
I. android 热部署是什么意思
在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。对于某些大型的应用来说,每次的重启都需要花费大量的时间成本。虽然 osgi 架构的出现,让模块重启成为可能,但是如果模块之间有调用关系的话,这样的操作依然会让应用出现短暂的功能性休克。本文将探索如何在不破坏 Java 虚拟机现有行为的前提下,实现某个单一类的热部署,让系统无需重启就完成某个类的更新。
类加载的探索
首先谈一下何为热部署(hotswap),热部署是在不重启 Java 虚拟机的前提下,能自动侦测到 class 文件的变化,更新运行时 class 的行为。Java 类是通过 Java 虚拟机加载的,某个类的 class 文件在被 classloader 加载后,会生成对应的 Class 对象,之局差巧后就可以创建该类的实例。默认的虚拟机行为只会在启动时加载类,如果后期有一个类需要更新的话,单纯替换编译的 class 文件,Java 虚拟机是不会更新正在运行的 class。如果要实现热部署,最根本的方式是修改虚拟机的源代码,改变 classloader 的加载行为,使虚拟机能监听 class 文件的更新,重新加载 class 文件,这样的行为破坏性很大,为后续的 JVM 升级埋下了一个大坑。
另一种友好的方法是创建自己的 classloader 来加载需要监听的 class,这样就能控制类加载的时机,从而实现热部署。本文将具体探索如何实现这个方案。首先需要了解一下 Java 虚拟机现有的加载机制。目前的加载机制,称为双亲委派,系统在使用一个 classloader 来加载类时,会先询问当前 classloader 的父类是否有能力加载,如果父类无法实现加载操作,才会将任务下放到该 classloader 来加载。这种自上而下的加载方式的好处是,让每个 classloader 执行自己的加载任务,不会重复加载类。但是这种方式却使加载顺序非常难改变,让自定义 classloader 抢先加载需要监听改变的类成为了一个难题。
不过我们可以换一个思路,虽然无法抢先加载该类,但是仍然可以用自定义 classloader 创建一个功能相同的类,让每次实例化的对象都指向这个新的类。当这个类的 class 文件发生改变的时候,再次创建一个更新的类,之后如果系统再次发出实例化请求,创建的对象讲指向这个全新的类。
下面来简单列举一下需要做的工作。
创建自定义的 classloader,加载需要监听改变的类,在 class 文件发生改变的时候,重新加载该类。
改变创建对象的行为,使他们在创建时使用自定义 classloader 加载的 class。
自定义加载器的实现
自定义加载器仍然庆态需要执行类加载的功能。这里却存在一个问题,同一个类加载器无法同时加载两个相同名称的类,由于不论类的结构如何发生变化,生成的类名不会变,而 classloader 只能在虚拟机停止前销毁已经加载的类,这样 classloader 就无法加载更新后的类了。这里有一个小技巧,让每次加载的类都保存成一个带有版本信息的 class,比如加载 Test.class 时,保存在内存中的类是 Test_v1.class,当类发生改变时,重新加载的类名是 Test_v2.class。但是真正执行加载 class 文件创建 class 的 defineClass 方法是一个 native 的方法,修改起来又变得很困难。所以面前还剩一条路,那就是直接修改编译生成的 class 文件。
利用 ASM 修改 class 文件
可以修改字节码的框架有很多,比如 ASM,CGLIB。本文使用的是 ASM。先来介绍一下 class 文件的结构,class 文件包含了以下几类信息,一个是类的基本信息,包含了访问权限信息,类名信息,父类信息,接口信息。第二个是类的变量信息。第三个是方法的信息。桐键ASM 会先加载一个 class 文件,然后严格顺序读取类的各项信息,用户可以按照自己的意愿定义增强组件修改这些信息,最后输出成一个新的 class。
首先看一下如何利用 ASM 修改类信息。
清单 1. 利用 ASM 修改字节码
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassReader cr = null;
String enhancedClassName = classSource.getEnhancedName();
try {
cr = new ClassReader(new FileInputStream(
classSource.getFile()));
} catch (IOException e) {
e.printStackTrace();
return null;
}
ClassVisitor cv = new EnhancedModifier(cw,
className.replace(".", "/"),
enhancedClassName.replace(".", "/"));
cr.accept(cv, 0);