- 浏览: 532382 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (377)
- J2EE (61)
- ORACLE (36)
- JS (15)
- EXT (0)
- win7 (12)
- TOMCAT (10)
- game (1)
- ie (5)
- etc (8)
- ibatis (3)
- ORACLE 客户端 (1)
- bat (3)
- 健康 (127)
- baby (4)
- html (12)
- myeclipse (16)
- 射手 字幕默认下载 位置 (1)
- office (0)
- car (2)
- xxx (1)
- python简介 (1)
- FusionCharts (1)
- dorado (4)
- english (3)
- weblogic (3)
- request/servlet (3)
- wsdl (1)
- offie2010 visio2010 下载 (1)
- nexus5 (0)
- chrome (3)
- ssi (2)
- 安卓 (3)
- nexus ipad (1)
- mysql (4)
- json (3)
- struts (6)
- datagrid (1)
- highcharts (1)
- tools (2)
- tool (1)
- spring3 (1)
- jedit (1)
- java (4)
- windows (1)
- easyui (2)
- 液晶显示器色温 (1)
- mybatis (1)
- where (1)
- sublime (1)
- spring4 (3)
最新评论
-
spring_springmvc:
如何在java Web项目中开发WebService接口,地址 ...
java 调用WebService服务接口 -
chenzheng8975:
阅
人生三大陷阱 -
ygbb007:
直接OD就能破解的
myBase Desktop 6.0 破解方法 -
lanlansnss:
直接删除nyfedit.ini文件即可
myBase Desktop 6.0 破解方法 -
yunzhu:
LZ写博客不太注重排版啊,排版不行别人没法看的
PermGen space
注意:自用
今天同事龙泉同学找到一个很提高效率的tomcat开发模式。该模式下修改类不用整体加载web app,开发效率提升很多。
经过我们分析,原有的tomcat reloadable="true" 方式,虽可加载变化过或新增的类但存在以下问题
1、内存清空,整体web app会重新加载,web.xml中配置的监听器会全部再执行。
2、其他没变的类也会重新加载。
3、当系统很大时,非常耗时。
这次方式会完全避免这些问题。
介绍下安装方式
1、在控制台输入 java -jar dcevm-0.2-win.jar
(安装程序会替换掉java下 bin/client/jvm.dll 和 bin/server/jvm.dll ,并将以后的jvm.dll备份到相应目录下。还会将dcevm.jar 加到lib/ext/ 目录.)
2、eclipse.ini文件里面最后加入:
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=512M
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-XX:+TraceClassLoading
-XX:+TraceClassUnloading
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-verbose:gc
-Xloggc:gc.log
3、要用tomcat debug方式启动才有用。
报错的这句话:Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. <init>(Z)V
问题原因
Hibernate3.3 Core Libraries 中的 cglib-2.2.jar 和 Spring 2.5 AOP Librariest 中的 cglib-nodep-2.1_3.jar 版本不一致 发生冲突。
解决方法
删除Hibernate3.3 Core Libraries 中的 cglib-2.2.jar
操作步骤 为 windows->Preferences->MyEclipse->Project Capabilities ->Hibernate ->Hibernate 3.3
Library modules 选择 Hibernate3.3 Core Library
把cglib-2.2.jar remove
Project-->Clean 重新部署
分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
===================================
为什么写这篇文档?
使用过hibernate, spring或其他大型组件,写过50个类以上的网络应用程序(web application)的开发者应该知道,当系统中有很多类时,如果开启了Tomcat的reloadable=true,那么每当相关文件改变时,Tomcat会停止web app并释放内存,然后重新加载web app.这实在是个浩大的工程。
所以我总是在想如果能有只重载某几个类的功能,将极大的满足我这个即时调试狂。
去年我在论坛上发帖,才发现已经有一些应用服务器具有了这个功能,比如WebLogic, WebSphere, 等等。好像还有一个很酷的名字,叫开发模式。看来我还是孤陋寡闻了点。
当然很多人都是在Tomcat上开发,包括我。我很喜欢它的轻小,那些大内存和高CPU消耗的应用服务器不愧为硬件杀手,没理由不改进Tomcat。
最终实现功能
我没有时间去研究Tomcat的文件监听机制,也没时间去把他写成”开发模式”这么完整的功能,我最终实现的是,实现重载功能的测试jsp--很抱歉我还是没办法写得更完整。当然,你可以在这个基础上进行改进。
阅读须知
阅读本文,你应该具备以下知识
jvm 规范有关类加载器的章节
http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html
Tomcat 类加载机制
http://www.huihoo.org/apache/tomcat/
java 反射机制
http://java.sun.com/docs/books/tutorial/reflect/
ant
http://ant.apache.org/
(好象该网址被不定时封锁,有时能上,有时不能)
最好在你的电脑上安装ant,因为Tomcat源码包使用ant从互联网获得依赖包。不过我也是修改了一个错误才使它完全编译通过。
当然,你也可以用其他IDE工具检查并添加依赖包,在IDE中,其实你只需要添加jar直到使org.apache.catalina.loader.WebappClassLoader无错即可。
修改过程
说明
新添加的代码请添加到java文件的末尾,因为我在说明行数的时候,尽量符合原始行数
web app类加载器
在Tomcat中,org.apache.catalina.loader.WebappClassLoader是web app的类加载器,所以需要修改它实现重载功能。
资源列表
在WebappClassLoader中,有一个Map类型属性resourceEntries,它记载了web app中WEB-INF/classes目录下所加载的类,因此当我们需要重载一个类时,我们需要先将它在resourceEntries里删除,我编写了一个方法方便调用:
public boolean removeResourceEntry(String name) {
if (resourceEntries.containsKey(name)) {
resourceEntries.remove(name);
return true;
}
return false;
}
是否重载标志
让WebappClassLoader需要知道加载一个类是否使用重载的方式。所以我建立一个boolean 类型的属性和实现它的getter/setter方法:
private boolean isReload = false;
public boolean isReload() {
return isReload;
}
public void setReload(boolean isReload) {
this.isReload = isReload;
}
动态类加载器
根据jvm类加载器规范,一个类加载器对象只能加载一个类1次,所以重载实际上是创建出另一个类加载器对象来加载同一个类。当然,我们不需要再创建一个WebappClassLoader,他太大而且加载规则很复杂,不是我们想要的,所以我们创建一个简单的类加载器类org.apache.catalina.loader.DynamicClassLoader:
package org.apache.catalina.loader;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.CodeSource;
import java.util.*;
/**
* 动态类加载器
*
* @author peter
*
*/
public class DynamicClassLoader extends URLClassLoader {
/* 父类加载器 */
private ClassLoader parent = null;
/* 已加载类名列表 */
private List classNames = null;
/**
* 构造器
*
* @param parent
* 父类加载器,这里传入的是WebappClassLoader
*/
public DynamicClassLoader(ClassLoader parent) {
super(new URL[0]);
classNames = new ArrayList();
this.parent = parent;
}
/**
* 从类的二进制数据中加载类.
*
* @param name
* 类名
* @param classData
* 类的二进制数据
* @param codeSource
* 数据来源
* @return 成功加载的类
* @throws ClassNotFoundException
* 加载失败抛出未找到此类异常
*/
public Class loadClass(String name, byte[] classData, CodeSource codeSource) throws ClassNotFoundException {
if (classNames.contains(name)) {
// System.out.println("此类已存在,调用 loadClass 方法加载.");
return loadClass(name);
} else {
// System.out.println("新类, 记录到类名列表,并用类定义方法加载类");
classNames.add(name);
return defineClass(name, classData, 0, classData.length, codeSource);
}
}
/* *
* 重载此方法,当要加载的类不在类名列表中时,调用父类加载器方法加载.
* @see java.lang.ClassLoader#loadClass(java.lang.String)
*/
public Class loadClass(String name) throws ClassNotFoundException {
if (!classNames.contains(name)) {
//System.out.println("不在类名列表中,调用父类加载器方法加载");
return parent.loadClass(name);
}
return super.loadClass(name);
}
}
在webappClassLoader中添加DynamicClassLoader
添加属性
private DynamicClassLoader dynamicClassLoader = new DynamicClassLoader(this);
添加重建方法,以便需要再次重载时替换掉上次的类加载器对象
public void reCreateDynamicClassLoader() {
dynamicClassLoader = new DynamicClassLoader(this);
}
修改调用点
第832行,公开findClass方法
public Class findClass(String name) throws ClassNotFoundException {
第1569行,添加如下一行代码。
if (isReload) removeResourceEntry(name);
第1577行,这里好像是一个bug,具体原因我忘了-_-||
if ((entry == null) || (entry.binaryContent == null))
改为
if ((entry == null) || (entry.loadedClass == null && entry.binaryContent == null))
第1633~1636行
if (entry.loadedClass == null) {
clazz = defineClass(name, entry.binaryContent, 0, entry.binaryContent.length,
codeSource);
改为
byte[] classData = new byte[entry.binaryContent.length];
System.arraycopy(entry.binaryContent, 0, classData, 0,
classData.length);
if (entry.loadedClass == null) {
clazz = isReload ?
dynamicClassLoader.loadClass(name,
classData, codeSource) :
defineClass(name,
classData, 0, classData.length, codeSource);
测试代码
test.jsp
我测试用的jsp为$CATALINA_HOME/webapps/ROOT/test.jsp,由于webapp里面并不会显式加载tomcat的核心类,所以我们需要用反射代码调用WebappClassLoader的方法。代码如下:
<%
ClassLoader loader = (Thread.currentThread().getContextClassLoader());
Class clazz = loader.getClass();
java.lang.reflect.Method setReload = clazz.getMethod("setReload", new Class[]{boolean.class});
java.lang.reflect.Method reCreate = clazz.getMethod("reCreateDynamicClassLoader", null);
java.lang.reflect.Method findClass = clazz.getMethod("findClass", new Class[]{String.class});
reCreate.invoke(loader, null);
setReload.invoke(loader, new Object[]{true});
Class A = (Class)findClass.invoke(loader, new Object[]{"org.AClass"});
setReload.invoke(loader, new Object[]{false});
A.newInstance();
// 如果你使用下面这行代码,当重编译类时,请稍微修改一下调用它的jsp,让jsp也重新编译
//org.AClass a = (org.AClass)A.newInstance();
// 下面这些代码是测试当一个类不在DynamicClassLoader类名列表时的反应
//a.test();
//java.lang.reflect.Method test = a.getClass().getMethod("test", null);
//test.invoke(a, null);
%>
org.AClass
package org;
public class AClass {
public AClass() {
// 修改输出内容确认Tomcat重新加载了类
System.out.println("AClass v3");
}
public void createBClass() {
new BClass();
}
}
org.BClass
package org;
public class BClass {
public BClass() {
//修改输出内容确认Tomcat重新加载了类
System.out.println("BClass v1");
}
}
测试步骤
按照上述步骤修改Tomcat源码并编译。
用winzip/winrar/file-roller打开$CATALINA_HOME/server/lib/catalina.jar。把前面编译完成后的org.apache.catalina.loader目录下的class文件覆盖jar中同名文件。
编译org.AClass和org.BClass
启动Tomcat并在浏览器中打开测试页http://localhost:8080/test.jsp
修改org.AClass中的System.out.println();语句并重编译类。
按下F5按键刷新浏览器。
查看Tomcat控制台是否输出了不同的语句?
============================
无项目名配置
<Context path="" docBase="E:/workspaces/ami/WebRoot" debug="0" ></Context>
有..
<Context path="/ami" docBase="E:/workspaces/ami/WebRoot" debug="0" ></Context>
今天同事龙泉同学找到一个很提高效率的tomcat开发模式。该模式下修改类不用整体加载web app,开发效率提升很多。
经过我们分析,原有的tomcat reloadable="true" 方式,虽可加载变化过或新增的类但存在以下问题
1、内存清空,整体web app会重新加载,web.xml中配置的监听器会全部再执行。
2、其他没变的类也会重新加载。
3、当系统很大时,非常耗时。
这次方式会完全避免这些问题。
介绍下安装方式
1、在控制台输入 java -jar dcevm-0.2-win.jar
(安装程序会替换掉java下 bin/client/jvm.dll 和 bin/server/jvm.dll ,并将以后的jvm.dll备份到相应目录下。还会将dcevm.jar 加到lib/ext/ 目录.)
2、eclipse.ini文件里面最后加入:
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=512M
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-XX:+TraceClassLoading
-XX:+TraceClassUnloading
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-verbose:gc
-Xloggc:gc.log
3、要用tomcat debug方式启动才有用。
报错的这句话:Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. <init>(Z)V
问题原因
Hibernate3.3 Core Libraries 中的 cglib-2.2.jar 和 Spring 2.5 AOP Librariest 中的 cglib-nodep-2.1_3.jar 版本不一致 发生冲突。
解决方法
删除Hibernate3.3 Core Libraries 中的 cglib-2.2.jar
操作步骤 为 windows->Preferences->MyEclipse->Project Capabilities ->Hibernate ->Hibernate 3.3
Library modules 选择 Hibernate3.3 Core Library
把cglib-2.2.jar remove
Project-->Clean 重新部署
分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
===================================
为什么写这篇文档?
使用过hibernate, spring或其他大型组件,写过50个类以上的网络应用程序(web application)的开发者应该知道,当系统中有很多类时,如果开启了Tomcat的reloadable=true,那么每当相关文件改变时,Tomcat会停止web app并释放内存,然后重新加载web app.这实在是个浩大的工程。
所以我总是在想如果能有只重载某几个类的功能,将极大的满足我这个即时调试狂。
去年我在论坛上发帖,才发现已经有一些应用服务器具有了这个功能,比如WebLogic, WebSphere, 等等。好像还有一个很酷的名字,叫开发模式。看来我还是孤陋寡闻了点。
当然很多人都是在Tomcat上开发,包括我。我很喜欢它的轻小,那些大内存和高CPU消耗的应用服务器不愧为硬件杀手,没理由不改进Tomcat。
最终实现功能
我没有时间去研究Tomcat的文件监听机制,也没时间去把他写成”开发模式”这么完整的功能,我最终实现的是,实现重载功能的测试jsp--很抱歉我还是没办法写得更完整。当然,你可以在这个基础上进行改进。
阅读须知
阅读本文,你应该具备以下知识
jvm 规范有关类加载器的章节
http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html
Tomcat 类加载机制
http://www.huihoo.org/apache/tomcat/
java 反射机制
http://java.sun.com/docs/books/tutorial/reflect/
ant
http://ant.apache.org/
(好象该网址被不定时封锁,有时能上,有时不能)
最好在你的电脑上安装ant,因为Tomcat源码包使用ant从互联网获得依赖包。不过我也是修改了一个错误才使它完全编译通过。
当然,你也可以用其他IDE工具检查并添加依赖包,在IDE中,其实你只需要添加jar直到使org.apache.catalina.loader.WebappClassLoader无错即可。
修改过程
说明
新添加的代码请添加到java文件的末尾,因为我在说明行数的时候,尽量符合原始行数
web app类加载器
在Tomcat中,org.apache.catalina.loader.WebappClassLoader是web app的类加载器,所以需要修改它实现重载功能。
资源列表
在WebappClassLoader中,有一个Map类型属性resourceEntries,它记载了web app中WEB-INF/classes目录下所加载的类,因此当我们需要重载一个类时,我们需要先将它在resourceEntries里删除,我编写了一个方法方便调用:
public boolean removeResourceEntry(String name) {
if (resourceEntries.containsKey(name)) {
resourceEntries.remove(name);
return true;
}
return false;
}
是否重载标志
让WebappClassLoader需要知道加载一个类是否使用重载的方式。所以我建立一个boolean 类型的属性和实现它的getter/setter方法:
private boolean isReload = false;
public boolean isReload() {
return isReload;
}
public void setReload(boolean isReload) {
this.isReload = isReload;
}
动态类加载器
根据jvm类加载器规范,一个类加载器对象只能加载一个类1次,所以重载实际上是创建出另一个类加载器对象来加载同一个类。当然,我们不需要再创建一个WebappClassLoader,他太大而且加载规则很复杂,不是我们想要的,所以我们创建一个简单的类加载器类org.apache.catalina.loader.DynamicClassLoader:
package org.apache.catalina.loader;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.CodeSource;
import java.util.*;
/**
* 动态类加载器
*
* @author peter
*
*/
public class DynamicClassLoader extends URLClassLoader {
/* 父类加载器 */
private ClassLoader parent = null;
/* 已加载类名列表 */
private List classNames = null;
/**
* 构造器
*
* @param parent
* 父类加载器,这里传入的是WebappClassLoader
*/
public DynamicClassLoader(ClassLoader parent) {
super(new URL[0]);
classNames = new ArrayList();
this.parent = parent;
}
/**
* 从类的二进制数据中加载类.
*
* @param name
* 类名
* @param classData
* 类的二进制数据
* @param codeSource
* 数据来源
* @return 成功加载的类
* @throws ClassNotFoundException
* 加载失败抛出未找到此类异常
*/
public Class loadClass(String name, byte[] classData, CodeSource codeSource) throws ClassNotFoundException {
if (classNames.contains(name)) {
// System.out.println("此类已存在,调用 loadClass 方法加载.");
return loadClass(name);
} else {
// System.out.println("新类, 记录到类名列表,并用类定义方法加载类");
classNames.add(name);
return defineClass(name, classData, 0, classData.length, codeSource);
}
}
/* *
* 重载此方法,当要加载的类不在类名列表中时,调用父类加载器方法加载.
* @see java.lang.ClassLoader#loadClass(java.lang.String)
*/
public Class loadClass(String name) throws ClassNotFoundException {
if (!classNames.contains(name)) {
//System.out.println("不在类名列表中,调用父类加载器方法加载");
return parent.loadClass(name);
}
return super.loadClass(name);
}
}
在webappClassLoader中添加DynamicClassLoader
添加属性
private DynamicClassLoader dynamicClassLoader = new DynamicClassLoader(this);
添加重建方法,以便需要再次重载时替换掉上次的类加载器对象
public void reCreateDynamicClassLoader() {
dynamicClassLoader = new DynamicClassLoader(this);
}
修改调用点
第832行,公开findClass方法
public Class findClass(String name) throws ClassNotFoundException {
第1569行,添加如下一行代码。
if (isReload) removeResourceEntry(name);
第1577行,这里好像是一个bug,具体原因我忘了-_-||
if ((entry == null) || (entry.binaryContent == null))
改为
if ((entry == null) || (entry.loadedClass == null && entry.binaryContent == null))
第1633~1636行
if (entry.loadedClass == null) {
clazz = defineClass(name, entry.binaryContent, 0, entry.binaryContent.length,
codeSource);
改为
byte[] classData = new byte[entry.binaryContent.length];
System.arraycopy(entry.binaryContent, 0, classData, 0,
classData.length);
if (entry.loadedClass == null) {
clazz = isReload ?
dynamicClassLoader.loadClass(name,
classData, codeSource) :
defineClass(name,
classData, 0, classData.length, codeSource);
测试代码
test.jsp
我测试用的jsp为$CATALINA_HOME/webapps/ROOT/test.jsp,由于webapp里面并不会显式加载tomcat的核心类,所以我们需要用反射代码调用WebappClassLoader的方法。代码如下:
<%
ClassLoader loader = (Thread.currentThread().getContextClassLoader());
Class clazz = loader.getClass();
java.lang.reflect.Method setReload = clazz.getMethod("setReload", new Class[]{boolean.class});
java.lang.reflect.Method reCreate = clazz.getMethod("reCreateDynamicClassLoader", null);
java.lang.reflect.Method findClass = clazz.getMethod("findClass", new Class[]{String.class});
reCreate.invoke(loader, null);
setReload.invoke(loader, new Object[]{true});
Class A = (Class)findClass.invoke(loader, new Object[]{"org.AClass"});
setReload.invoke(loader, new Object[]{false});
A.newInstance();
// 如果你使用下面这行代码,当重编译类时,请稍微修改一下调用它的jsp,让jsp也重新编译
//org.AClass a = (org.AClass)A.newInstance();
// 下面这些代码是测试当一个类不在DynamicClassLoader类名列表时的反应
//a.test();
//java.lang.reflect.Method test = a.getClass().getMethod("test", null);
//test.invoke(a, null);
%>
org.AClass
package org;
public class AClass {
public AClass() {
// 修改输出内容确认Tomcat重新加载了类
System.out.println("AClass v3");
}
public void createBClass() {
new BClass();
}
}
org.BClass
package org;
public class BClass {
public BClass() {
//修改输出内容确认Tomcat重新加载了类
System.out.println("BClass v1");
}
}
测试步骤
按照上述步骤修改Tomcat源码并编译。
用winzip/winrar/file-roller打开$CATALINA_HOME/server/lib/catalina.jar。把前面编译完成后的org.apache.catalina.loader目录下的class文件覆盖jar中同名文件。
编译org.AClass和org.BClass
启动Tomcat并在浏览器中打开测试页http://localhost:8080/test.jsp
修改org.AClass中的System.out.println();语句并重编译类。
按下F5按键刷新浏览器。
查看Tomcat控制台是否输出了不同的语句?
============================
无项目名配置
<Context path="" docBase="E:/workspaces/ami/WebRoot" debug="0" ></Context>
有..
<Context path="/ami" docBase="E:/workspaces/ami/WebRoot" debug="0" ></Context>
- cglib-nodep-2.2.jar (314.8 KB)
- 下载次数: 0
- dcevm-0.2-win.jar (5.5 MB)
- 下载次数: 0
发表评论
-
Enable debug logging for this logger for a complete list of JARs that were scann
2018-06-28 21:59 1788修改EL表达式,例如"${owner.new}& ... -
Tomcat中JVM内存溢出及合理配置
2016-11-30 11:05 930Tomcat中JVM内存溢出及合理配置 Tomcat本身不 ... -
tomcat or weblogic
2016-09-27 16:03 536Tomcat:只是一个单纯的动态页面服务器项目。它的最大意义在 ... -
tcnative-1.dll
2014-01-02 16:18 3255今天在Eclipse上配置Tomcat7,启动时看到如下警 ... -
PermGen space
2013-08-20 10:55 1443PermGen space的全称是Permanent Gene ... -
异步日志
2013-07-10 18:03 920Log4j 2 Asynchronous Loggers fo ... -
tomcat定时任务
2013-05-27 14:28 14941 tomcat启动后自动加载 ... -
Log4j 配置写入日志文件的信息同时打印到控制台
2013-05-15 16:37 11330以Tomcat6.0为例,其Tomcat目录结构如下: bi ... -
清除Tomcat页面缓存
2012-04-23 18:32 1727关闭Tomcat 打开tomcat\work目录 删除C ...
相关推荐
然而,当我们在MyEclipse中修改了类文件或JSP文件后,通常需要重启Tomcat服务器才能使更改生效,这无疑增加了开发过程中的等待时间。本文将详细介绍如何在MyEclipse中实现修改类及JSP文件后无需重启Tomcat即可实时...
- 修改完`server.xml`后,通常需要重启Tomcat才能使修改生效。但在本文中,我们讨论的是不需要重启的情况下进行的配置。 - 虽然这里提到了需要重启的情况,但通过设置`reloadable="true"`可以避免重启操作。 3. *...
标题“利用Tomcat远程部署解决修改类后重启Tomcat问题”揭示了主要关注点在于如何在不手动重启Tomcat服务器的情况下,实现应用的热更新或快速部署。这通常涉及到Tomcat的管理工具,特别是它的Manager应用程序,以及...
尽管上述配置可以实现在修改Java源码和JS文件后的即时更新效果,但需要注意的是,当修改了XML配置文件时,例如`web.xml`、`context.xml`等,仍然需要重启Tomcat才能使更改生效。这是因为XML配置文件是Tomcat在启动时...
- 重启Tomcat服务。 3. **绑定域名至Tomcat**:为了让域名指向Tomcat服务器,需要在`server.xml`文件中添加`<Host>`元素,并指定域名。 - 在`<Engine>`标签内添加如下配置: ```xml <Host name=...
完成上述配置后,需要重启Tomcat服务以使配置生效。可以通过浏览器访问相应的URL来验证配置是否正确,例如访问`http://www.baidu.com/360buy`应该能够显示位于`D:\app\360buy`目录下的Web应用页面。 #### 五、注意...
同样地,完成配置后需要重启Tomcat服务。然后通过浏览器访问`http://localhost/test/`,可以看到`G:\BLOG\test`目录下的内容。 #### 四、总结 通过本文的学习,我们了解到在Tomcat中配置根目录和虚拟目录的方法。...
其中`docBase`属性指定了新的主目录路径,`reloadable="true"`允许热部署,即在不重启服务器的情况下更新应用。 2. **检查Catalina目录** Tomcat会在`conf/Catalina/localhost`目录下自动生成一个对应于主目录的...
而`reloadable="true"`则表示当`docBase`路径下的文件发生变化时,Tomcat会自动重新加载Web应用,无需重启服务器。 在配置虚拟路径时,还可以设置其他属性,比如`workDir`属性可以指定Web应用的工作目录;`...
这样设置后,Tomcat会自动检测`webapps`目录下文件的变化,并尝试重新加载已修改的类。 2. **使用`jmx Remote Lifecycle Listener`插件**:在`conf/catalina.properties`文件中添加以下配置: ``` org.apache....
完成以上配置后,重启Tomcat服务器。此时,应该能够通过`http://127.0.0.1:8080/backstage/`这个URL来访问配置好的Web应用了。 #### 三、常见问题及解决方案 1. **无法访问Web应用** - 检查`backstage.xml`文件...
但是,通过配置可以开启热部署功能,即在不重启服务器的情况下,Tomcat能够识别到代码的更改,并自动重新加载受影响的部分。 #### 知识点二:修改server.xml配置文件 要实现Tomcat的自动加载功能,首先需要修改...
标题中的“Tomcat配置文件”指的是Tomcat服务器的配置文件`server.xml`,它是Tomcat容器的核心配置文件,用于定义服务器的行为、端口、虚拟主机、应用上...记住,每次修改配置文件后,都需要重启Tomcat服务使更改生效。
修改完 `server.xml` 文件后,需要重启Tomcat服务器以使更改生效。 通过上述步骤,你可以在单个Tomcat实例上为不同的域名提供服务,每个域名可以有独立的Web应用程序和虚拟路径。这有助于在共享服务器资源的情况下...
- `reloadable="true"`:启用热部署功能,即在不重启服务器的情况下更新项目代码。 - `docBase="·\web"`:指定项目的根目录位置。 - `workDir="·\work"`:指定临时文件的工作目录。 这种方式适用于对部署有更高...
2. **重启Tomcat服务**:修改完配置后,记得重启Tomcat服务,使更改生效。 #### 二、增加虚拟目录 在实际部署Web应用时,我们经常需要为不同的应用程序配置虚拟目录。这可以通过修改`conf/server.xml`文件来实现。...
在本文中,我们将深入探讨如何配置Apache Tomcat服务器,特别是关注如何改变...记住,每次修改`server.xml`后,都需要重启Tomcat服务以使改动生效。对于生产环境,确保备份原始配置文件,并谨慎操作,以避免服务中断。