精华内容
下载资源
问答
  • Tomcat 动态装载配置

    2010-05-05 18:13:44
    更新class文件后,服务器就自动重新装载整个应用. 第一步 tomcat6 安装目录conf下 server.xml 文件中 找到<Host>元素 添加节点<Context>   <context path="\虚拟目录名&...

    现在把设置了Tomcat6的动态装载.更新class文件后,服务器就自动重新装载整个应用.

    第一步  tomcat6 安装目录conf下 server.xml 文件中 找到<Host>元素  添加节点<Context>

     

    <context path="\虚拟目录名" docBase ="tomcat 编译的class 文件的绝对路径,也可以相对路径" debug = "0 " reloadable = "true">

    path为虚拟路径,访问时的路径,注意:一定要加“\” 

    下面图来源于 51cto.com 网址是:http://book.51cto.com/art/200811/97600.htm

    我只是整理动态装载class 文件步骤。

    表3-4  Context元素的主要属性

     
    (续表)
     

     

    我的项目是这样配置的

     
    - <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
      <Context path="/AppManager" docBase="E:\win7 work\Tomcat 6.0\webapps\AppManager" debug="0" reloadable="true" />

      </Host>
    虚拟路径为/AppManager   我的tomcat 路径在E:\win7 work\Tomcat 6.0\
    展开全文
  • 一篇大神的译文,勉强(嗯。。相当勉强)地放在类加载器系列吧...毕竟,Tomcat 出到现在了,也不支持更新某一个class 而不重启应用(这里重启应用的意思是,不是重启 Tomcat,而是重新部署 webapp),而热部署同样也是一...

    一篇大神的译文,勉强(嗯。。相当勉强)地放在类加载器系列吧,第8弹:

    一、前言

    手里是锤子,看哪里都是钉子。最近学习类加载器的感觉就是如此,总是在想,利用它可以做到什么? 可以做到类隔离、不停服务执行动态调试代码,但是,还能做什么呢?

    毕竟,Tomcat 出到现在了,也不支持更新某一个class 而不重启应用(这里重启应用的意思是,不是重启 Tomcat,而是重新部署 webapp),而热部署同样也是一个耗时的操作。有经验的同学应该知道Jrebel,开发环境的神器,有了它,平时用开发机和前端同学联调,再也不用频繁重启应用了。Jrebel可以做到动态更新某个class,并且可以马上生效,但是它的实现原理是迂回了一圈去解决这个问题的,且会有性能上的损耗,所以在生产环境也是不建议的(jrebel原理参考:HotSwap和JRebel原理)。

    按理说,Java 出现都20几年了,这样的需求还没解决,背后是有什么样的原因吗?这里,我找到一篇 jRebel 网站上的文章,感觉写得很好,这里勉强利用我的渣英语翻译一下。如果英语底子好,直接看原文吧。

    ps:翻译到最后,发现这篇文章就是 JRebel的作者写的,大家看看下面的截图:

    4aa4a043f1980599faa1c9f37200626a.png

    再看看维基百科:

    0dac41a439067f0c72e3ae6c7d6f4635.png

    二、正文

    在这篇文章里,我们将讨论怎么利用动态的类加载器去热更一个 Java 类。同时,我们会先看看,对象、类、类加载器是怎么互相紧密绑在一起的,然后再看看为了达到热更的目的,需要做出的努力。我们将从一个问题开始,见微知著,解释热更的过程,然后通过一个特定的例子来展示这其中会遇到的问题和解决方案。本系列文章包括:

    管中窥豹

    谈论Java class 热更之前的第一件事,就是理解类和对象的关系。任何 java 代码,都和包含在类中的方法紧密关联。简单来说,你可以把一个类,想成一个方法的集合,这些方法接收 “this” 关键字作为第一个参数。(译者:可以把深入理解JVM那本书拿出来翻一下了,见下图。其实大家可以想想,汇编语言中,一般的指令格式都是:操作码 操作数1 操作数2 。。。操作数n,而不可能是 在操作数1上调用操作码,然后操作数2作为参数这种模式。底层没有面向对象,只有面向过程)。

    891347d6a0c5775026422b6e53c6c057.png

    类被装载进内存,并被赋予一个唯一标识。在 Java api中,你可以通过 MyObject.class 这样的方式来获得一个 java.lang.Class 的对象,这个对象就能唯一标识被加载的这个类。

    每个被创建的对象,都能通过 Object.class 来获得对这个类的唯一标识的引用。当在该对象上调用一个方法时,JVM 会在内部获取到 class 引用,并调用该 class 的方法。也就是说,假设 mo 是 MyObject 类的一个对象,当你调用 mo.method()时, JVM 实际会进行类似下面这样的调用:mo.getClass().getDeclaredMethod(\"method\").invoke(mo) (虚拟机实现并不会这样写,但是最终的结果是一致的)

    0b25c081daad29ce7c178dfaef9dd9c9.png

    因此,每一个对象都和它的类加载器相关联(MyObject.class.getClassloader())。 classLoader 的主要作用就是去定义类的可见范围——在什么地方这个类是可见的,什么地方又是不可见的。 这样的范围控制,允许具有相同包名及类名的类共存,只要他们是由不同的类加载加载的。该机制也允许在一个不同的类加载器中,加载一个新版本的类。

    523b3e0ce00a89f3023c6a979cd861ef.png

    类热更的主要问题在于,尽管你可以加载一个新版本的class,但它却会获取到一个完全不同的唯一标识(译者:这里的意思就是,两个classloader是不一致的,即使加载同一个class文件)。并且,旧的对象依然引用的是class 的旧版本。因此,当调用该对象的方法时,其依然会执行老版本的方法。

    我们假设,我们加载了 MyObject 的一个新版本的class,旧版本的类,名字为 MyObject_1,新的为 MyObject_2。MyObject_1 中的 method() 方法会返回 “1”,MyObject_2 中会返回 “2”。 现在,假设 mo2 是一个 MyObject_2 类型的对象,那么以下是成立的:

    mo.getClass() != mo2.getClass()

    mo.getClass().getDeclaredMethod(\"method\").invoke(mo)!= mo2.getClass().getDeclaredMethod(\"method\").invoke(mo2)

    (译者: 这两句原文里没解释。第一句就是说,两个的class 对象不一致,第二行是说,  mo.method ()会返回 “1”,而 mo2. method ()会返回“2”,当然不相等)

    而接下来这句, mo.getClass().getDeclaredMethod(\"method\").invoke(mo2) 会抛出 ClassCastException,因为 mo 和 mo2 的 class 是不一样的。

    这就意味着,热更的解决方案,只能是创建一个 mo2,(mo2 是 mo 的拷贝),然后将程序内部所有引用了mo的地方都换成 mo2。 要理解这有多困难,想想上次你改电话号码的时候。改你的电话号码很简单,难的是要让你的朋友们知道你的新号码。改号码这个事就和我们这里说的问题一样困难(甚至是不可能的,除非你能控制对象的创建),而且,所有的对象中的引用,必须同一时刻更新。

    例子展示

    ps:原标题是 Down and Dirty?这什么意思。。。

    我们将在一个新的类加载器中,去加载一个新版本的class。这里, IExample 是一个接口, Example 是它的一个实现。

    public interfaceIExample { String message();intplusPlus(); }

    public class Example implementsIExample {private intcounter;publicString message() {return \"Version 1\"; }public intplusPlus() {return counter++; }public intcounter() {returncounter; } }

    接下来我们会去创建一个动态的类加载器,大概是下面这样:

    public classExampleFactory {public staticIExample newInstance() { URLClassLoader tmp=

    new URLClassLoader(newURL[] {getClassPath()}) {publicClass loadClass(String name) {if (\"example.Example\".equals(name)) return findClass(name);return super.loadClass(name); } };return(IExample) tmp.loadClass(\"example.Example\").newInstance(); } }

    上面这个类加载器,继承了 URLClassLoader,遇到  \"example.Example\" 类时,会自己进行加载,路径为:getClassPath()。最后一句,会加载该类,并生成一个该类的对象。

    这里的 getClassPath 在本例中,可以返回一个硬编码的路径。

    我们再创建一个测试类,其中的main方法会在死循环中执行并打印出 Example class 的信息。

    public classMain {private staticIExample example1;private staticIExample example2;public static voidmain(String[] args) { example1=ExampleFactory.newInstance();while (true) { example2=ExampleFactory.newInstance(); System.out.println(\"1) \" +example1.message()+ \" = \" +example1.plusPlus()); System.out.println(\"2) \" +example2.message()+ \" = \" +example2.plusPlus()); System.out.println(); Thread.currentThread().sleep(3000); } } }

    我们执行下 测试类,可以看到以下输出:

    1) Version 1 = 3

    2) Version 1 = 0

    可以看到,这里的 Version 都是 1。(Version 1是 example2.message() 返回的,因为此时类没有改,所以大家都是Version 1)。

    这里,我们假设将 Example.message() 修改一下,改为 返回 “Version 2”(译者:这里意思是,改完后,重新编译为class,再放到 getClassPath ()对应的路径下)。那么此时输出为:

    1) Version 1 = 4

    2) Version 2 = 0

    为什么会是这个结果, Version 1 是由  example1 输出的,所以计数器一直在累加,状态得到了保持。而 Version 2 的计数变回了0,所有的状态都丢失了。(译者:毕竟是新加载的class,生成的新对象啊。。。)

    为了修复这个问题,我们修改了一下Example 类:

    publicIExample copy(IExample example) {if (example != null) counter=example.counter();return this; }

    并修改一下,测试类中的方法:

    example2 = ExampleFactory.newInstance().copy(example2);

    现在再看看结果:

    1) Version 1 = 3

    2) Version 1 = 3

    将 Example.message()改成返回 “version 2”后:

    1) Version 1 = 4

    2) Version 2 = 4

    如你看到的,尽管第二个对象的状态也得到了了更新,但这需要我们手动修改才能做到。不幸的是,并没有 API 去更新一个已经存在的对象的 class,或者去可靠地拷贝该对象的状态,所以我们不得不去寻找复杂的解决方案。

    下一篇(译者:原文是一个系列)将会去探究,web 容器,OSGI,Tapestry 5,Grails 怎么样去解决热更时保持状态的问题,然后我们会进一步深入,可靠HowSwap 、动态语言、和 Instrumentation API 是怎么工作的,同样,也包括 Jrebel。

    译文参考及源码:

    三、总结

    大神的作品,不说了。大家肯定没耐心等我翻该系列的后续了(嗯,水平也差。。。哈哈),等不及的同学请直接去瞻仰大神的文章吧。

    ,

    展开全文
  • 游戏上线后难免会有功能性bug,这些bug很多只做一些小的改动即可修复。设想假如每次有bug修复...代码热更-开源工具的实现1.Apache Tomcat 实现:Tomcat 动态 JSP 编译运行,这是一种阉割的热加载。Tomcat 采用ecj ...

    游戏上线后难免会有功能性bug,这些bug很多只做一些小的改动即可修复。设想假如每次有bug修复之后,都要重启服务器,势必会导致部分玩家流失,对游戏产生不好的影响。在这个背景下,代码热更新还是很有必要的。这里,我们来讨论一种java代码热更新的实现。

    代码热更-开源工具的实现

    1.Apache Tomcat 实现:

    Tomcat 动态 JSP 编译运行,这是一种阉割的热加载。Tomcat 采用ecj (eclise-jdt)组件动态编译jsp生成servlet类,servlet是有固定模板。相对于只改变方法,使用自定义JspLoader 重新创建一个实例的方式运行。普通类和Servlet 本身不行,如修改需要触发context reload (自动重启)

    2.Eclipse实现

    Eclipse 调试模式下的代码热更,由IDE 内部实现,实际使用的是java agent技术。

    代码热更-javaAgent实现

    JavaAgent 是JDK 1.5 以后引入的。java.lang.instrument

    Agent技术,解决以下两个问题:

    1. Java程序启动之前修改类,即main()方法执行前

    通过指令java -javaagent:[=] 触发以下接口

    public static void premain(String agentArgs, Instrumentation inst)

    2. Java程序运行时修改类

    通过新启一个程序获取目标

    VirtualMachine virtualmachine = VirtualMachine.attach(jvm_pid);

    virtualmachine.loadAgent(agentJarPath, agentParam); 触发下面接口

    public static void agentmain (String agentArgs, Instrumentation inst)

    作为agent jar 文件需要定义 MANIFEST.MF 属性

    Manifest-Version: 1.0

    Agent-Class: com.cyou.xyj.agent.ReloadAccountAgent

    Premain-Class: com.cyou.xyj.agent.ReloadAccountAgent

    Can-Redine-Classes: true

    Can-Retransform-Classes: true

    Instrumentation 类

    void addTransformer(ClassFileTransformer transformer, boolean canRetransform)

    boolean removeTransformer(ClassFileTransformer transformer)

    void redefineClasses(ClassDefinition... definitions) // 重定义类

    boolean isModifiableClass (Class> theClass);

    void appendToBootstrapClassLoaderSearch(JarFile jarfile)

    // 应用。运行时远程加载类库,核心类库不公开

    // 运行时扩展功能 etc..

    ClassFileTransformer 类,唯一接口

    // loader 类加载器

    // classBeingRedefined 是否允许重定义

    // classfileBuffer 原类的字节码

    byte[]transform(ClassLoader loader,String className,Class> classBeingRedefined,ProtectionDomain protectionDomain,byte[] classfileBuffer)

    类转化的实际逻辑就是创建一个ClassFileTransformer实例,并覆写此方法

    Account类中修改后的方法被修改。代码热更新完成

    通过 –XX:+TraceClassLoading 输出如下

    展开全文
  • 现在把设置了Tomcat6的动态装载.但是每次已有东西更新,服务器就自动重新装载整个应用.现在想实现一个功能就是如果只改一个.class文件,就只重新装载这一个class文件,而不是重新装载整个应用. ${catalina.home}/...
  • 一篇大神的译文,勉强(嗯。。相当勉强)地放在类加载器系列吧...毕竟,Tomcat 出到现在了,也不支持更新某一个class 而不重启应用(这里重启应用的意思是,不是重启 Tomcat,而是重新部署 webapp),而热部署同样也是一...

    一篇大神的译文,勉强(嗯。。相当勉强)地放在类加载器系列吧,第8弹:

    一、前言

    手里是锤子,看哪里都是钉子。最近学习类加载器的感觉就是如此,总是在想,利用它可以做到什么? 可以做到类隔离、不停服务执行动态调试代码,但是,还能做什么呢?

    毕竟,Tomcat 出到现在了,也不支持更新某一个class 而不重启应用(这里重启应用的意思是,不是重启 Tomcat,而是重新部署 webapp),而热部署同样也是一个耗时的操作。有经验的同学应该知道Jrebel,开发环境的神器,有了它,平时用开发机和前端同学联调,再也不用频繁重启应用了。Jrebel可以做到动态更新某个class,并且可以马上生效,但是它的实现原理是迂回了一圈去解决这个问题的,且会有性能上的损耗,所以在生产环境也是不建议的(jrebel原理参考:HotSwap和JRebel原理)。

    按理说,Java 出现都20几年了,这样的需求还没解决,背后是有什么样的原因吗?这里,我找到一篇 jRebel 网站上的文章,感觉写得很好,这里勉强利用我的渣英语翻译一下。如果英语底子好,直接看原文吧。

    ps:翻译到最后,发现这篇文章就是 JRebel的作者写的,大家看看下面的截图:

    3f3fd145d31d11f3f7ef617f3196e4ad.png

    再看看维基百科:

    cfeb1fd1d68b62a560422b0f5285319b.png

    二、正文

    在这篇文章里,我们将讨论怎么利用动态的类加载器去热更一个 Java 类。同时,我们会先看看,对象、类、类加载器是怎么互相紧密绑在一起的,然后再看看为了达到热更的目的,需要做出的努力。我们将从一个问题开始,见微知著,解释热更的过程,然后通过一个特定的例子来展示这其中会遇到的问题和解决方案。本系列文章包括:

    管中窥豹

    谈论Java class 热更之前的第一件事,就是理解类和对象的关系。任何 java 代码,都和包含在类中的方法紧密关联。简单来说,你可以把一个类,想成一个方法的集合,这些方法接收 “this” 关键字作为第一个参数。(译者:可以把深入理解JVM那本书拿出来翻一下了,见下图。其实大家可以想想,汇编语言中,一般的指令格式都是:操作码 操作数1 操作数2 。。。操作数n,而不可能是 在操作数1上调用操作码,然后操作数2作为参数这种模式。底层没有面向对象,只有面向过程)。

    fd683bd7174c70a804987d8ede4c9172.png

    类被装载进内存,并被赋予一个唯一标识。在 Java api中,你可以通过 MyObject.class 这样的方式来获得一个 java.lang.Class 的对象,这个对象就能唯一标识被加载的这个类。

    每个被创建的对象,都能通过 Object.class 来获得对这个类的唯一标识的引用。当在该对象上调用一个方法时,JVM 会在内部获取到 class 引用,并调用该 class 的方法。也就是说,假设 mo 是 MyObject 类的一个对象,当你调用 mo.method()时, JVM 实际会进行类似下面这样的调用:mo.getClass().getDeclaredMethod("method").invoke(mo) (虚拟机实现并不会这样写,但是最终的结果是一致的)

    93458ef26ed36c71e8e2cac5099fa6c3.png

    因此,每一个对象都和它的类加载器相关联(MyObject.class.getClassloader())。 classLoader 的主要作用就是去定义类的可见范围——在什么地方这个类是可见的,什么地方又是不可见的。 这样的范围控制,允许具有相同包名及类名的类共存,只要他们是由不同的类加载加载的。该机制也允许在一个不同的类加载器中,加载一个新版本的类。

    9ec6683c12966a7f276a7293c35b52ac.png

    类热更的主要问题在于,尽管你可以加载一个新版本的class,但它却会获取到一个完全不同的唯一标识(译者:这里的意思就是,两个classloader是不一致的,即使加载同一个class文件)。并且,旧的对象依然引用的是class 的旧版本。因此,当调用该对象的方法时,其依然会执行老版本的方法。

    我们假设,我们加载了 MyObject 的一个新版本的class,旧版本的类,名字为 MyObject_1,新的为 MyObject_2。MyObject_1 中的 method() 方法会返回 “1”,MyObject_2 中会返回 “2”。 现在,假设 mo2 是一个 MyObject_2 类型的对象,那么以下是成立的:

    mo.getClass() != mo2.getClass()

    mo.getClass().getDeclaredMethod("method").invoke(mo)!= mo2.getClass().getDeclaredMethod("method").invoke(mo2)

    (译者: 这两句原文里没解释。第一句就是说,两个的class 对象不一致,第二行是说,  mo.method ()会返回 “1”,而 mo2. method ()会返回“2”,当然不相等)

    而接下来这句, mo.getClass().getDeclaredMethod("method").invoke(mo2) 会抛出 ClassCastException,因为 mo 和 mo2 的 class 是不一样的。

    这就意味着,热更的解决方案,只能是创建一个 mo2,(mo2 是 mo 的拷贝),然后将程序内部所有引用了mo的地方都换成 mo2。 要理解这有多困难,想想上次你改电话号码的时候。改你的电话号码很简单,难的是要让你的朋友们知道你的新号码。改号码这个事就和我们这里说的问题一样困难(甚至是不可能的,除非你能控制对象的创建),而且,所有的对象中的引用,必须同一时刻更新。

    例子展示

    ps:原标题是 Down and Dirty?这什么意思。。。

    我们将在一个新的类加载器中,去加载一个新版本的class。这里, IExample 是一个接口, Example 是它的一个实现。

    public interfaceIExample {

    String message();intplusPlus();

    }

    public class Example implementsIExample {private intcounter;publicString message() {return "Version 1";

    }public intplusPlus() {return counter++;

    }public intcounter() {returncounter;

    }

    }

    接下来我们会去创建一个动态的类加载器,大概是下面这样:

    public classExampleFactory {public staticIExample newInstance() {

    URLClassLoader tmp=

    new URLClassLoader(newURL[] {getClassPath()}) {publicClass loadClass(String name) {if ("example.Example".equals(name))

    return findClass(name);return super.loadClass(name);

    }

    };return(IExample)

    tmp.loadClass("example.Example").newInstance();

    }

    }

    上面这个类加载器,继承了 URLClassLoader,遇到  "example.Example" 类时,会自己进行加载,路径为:getClassPath()。最后一句,会加载该类,并生成一个该类的对象。

    这里的 getClassPath 在本例中,可以返回一个硬编码的路径。

    我们再创建一个测试类,其中的main方法会在死循环中执行并打印出 Example class 的信息。

    public classMain {private staticIExample example1;private staticIExample example2;public static voidmain(String[] args) {

    example1=ExampleFactory.newInstance();while (true) {

    example2=ExampleFactory.newInstance();

    System.out.println("1) " +example1.message()+ " = " +example1.plusPlus());

    System.out.println("2) " +example2.message()+ " = " +example2.plusPlus());

    System.out.println();

    Thread.currentThread().sleep(3000);

    }

    }

    }

    我们执行下 测试类,可以看到以下输出:

    1) Version 1 = 3

    2) Version 1 = 0

    可以看到,这里的 Version 都是 1。(Version 1是 example2.message() 返回的,因为此时类没有改,所以大家都是Version 1)。

    这里,我们假设将 Example.message() 修改一下,改为 返回 “Version 2”(译者:这里意思是,改完后,重新编译为class,再放到 getClassPath ()对应的路径下)。那么此时输出为:

    1) Version 1 = 4

    2) Version 2 = 0

    为什么会是这个结果, Version 1 是由  example1 输出的,所以计数器一直在累加,状态得到了保持。而 Version 2 的计数变回了0,所有的状态都丢失了。(译者:毕竟是新加载的class,生成的新对象啊。。。)

    为了修复这个问题,我们修改了一下Example 类:

    publicIExample copy(IExample example) {if (example != null)

    counter=example.counter();return this;

    }

    并修改一下,测试类中的方法:

    example2 = ExampleFactory.newInstance().copy(example2);

    现在再看看结果:

    1) Version 1 = 3

    2) Version 1 = 3

    将 Example.message()改成返回 “version 2”后:

    1) Version 1 = 4

    2) Version 2 = 4

    如你看到的,尽管第二个对象的状态也得到了了更新,但这需要我们手动修改才能做到。不幸的是,并没有 API 去更新一个已经存在的对象的 class,或者去可靠地拷贝该对象的状态,所以我们不得不去寻找复杂的解决方案。

    下一篇(译者:原文是一个系列)将会去探究,web 容器,OSGI,Tapestry 5,Grails 怎么样去解决热更时保持状态的问题,然后我们会进一步深入,可靠HowSwap 、动态语言、和 Instrumentation API 是怎么工作的,同样,也包括 Jrebel。

    译文参考及源码:

    三、总结

    大神的作品,不说了。大家肯定没耐心等我翻该系列的后续了(嗯,水平也差。。。哈哈),等不及的同学请直接去瞻仰大神的文章吧。

    展开全文
  • JRebel是一个J2EE热部署的工具。使用它可以减少浪费8-18%的开发...JRebel则可以动态监视class文件及配置文件,如果有文件更新,被调用时就会被JRebel重新加载,达到热部署的目的。 JRebel不仅可以在开发阶段实现热...
  • Tomcat在windows下动态修改代码无法自动更新。 </div> 可以更新。但多次动态载入后经常出现outofmemeoryexception 是可以更新,但能不能只更新修改的那个类? 我每次只修改一个类,但是却要...
  • JRebel是一个J2EE热部署的工具。使用它可以减少浪费8-18%的开发时间在项目的构建和部署上。...JRebel则可以动态监视class文件及配置文件,如果有文件更新,被调用时就会被JRebel重新加载,达到热部...
  • JRebel是一个J2EE热部署的工具。使用它能够降低浪费8-18%的开发时间在项目的构建和...JRebel则能够动态监视class文件及配置文件。假设有文件更新。被调用时就会被JRebel又一次载入,达到热部署的目的。JRebel不仅能...
  • 软件介绍 本工具是对java class文件进行加密保护防止反编译的工具!...备注:如果下载站下载下来的程序有运行bug,请从上面两个下载地址更新软件。并给我们留言!谢谢... 升级提示:v2.1相比v2.0修改了一个注册bug。
  • 简要介绍: 本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。...备注:如果下载站下载下来的程序有运行bug,请从上面两个下载地址更新软件。并给我们留言!谢谢..
  • 读者可将相关文件夹(如ch2)拷贝到Tomcat服务器安装目录的子目录webapps下,并启动Tomcat服务器,在浏览器中浏览网页。 表1 第1章 序号 文件名称 位置 说明 1 SimpleJSP.jsp 第1章\ch1 第一个JSP页面 2 web.xml ...
  • 这一下我就蒙了,对java的类加载机制我了解一些,jvm加载了一个class后,是不可能再重新加载更新后的这个类的,除非新生成一个 classloader,那么,jsp更新后还是会被编译为一个servlet啊,而且名字也没有变,按照...
  • Java热替换

    2013-04-22 22:49:00
    前面有提到过Tomcat的热部署,所谓热部署就是在应用运行时更新Java类文件以升级软件功能,升级过程不需要关停和重启应用。要进行热部署需要做class热替换。Class热替换实现了将修改的class再次加载到JVM中,以动态...
  • JavaWeb无热部署扩展

    2018-03-12 22:53:38
    太久没有写点东西了,今天分享一下Java web中我们的一个简单动态加载jar包,无需热部署以及更新以前的class即可上线服务应用,Java的反射机制内容这里不做科普(下面基本无代码,仅提供思路,代码党绕行)。...
  • JavaRebel

    2014-04-11 17:59:20
    JRebel是一个J2EE热部署的工具。...而JRebel则可以动态监视class文件及配置文件,如果有文件更新,被调用时就会被JRebel 重新加载,达到热部署的目的.避免重启的过程. JavaRebel (JRebel)是一个(非开源)JVM的插...
  • Jrebel3.5热部署

    2010-12-30 22:56:20
    JRebel是一个J2EE热部署的工具。...而JRebel则可以动态监视class文件及配置文件,如果有文件更新,被调用时就会被JRebel重新加载,达到热部署的目的.避免重启的过程. JavaRebel (JRebel)是一个(非开源)JVM的插件...
  • 本工具是对java class文件进行加密保护防止反...备注:如果下载站下载下来的程序有运行bug,请从上面两个下载地址更新软件。并给我们留言!谢谢... 升级提示:v2.2完全开放,不需要注册了!希望大家推广java加密技术。
  • java类加密工具v2.1

    2011-07-24 14:32:24
    本工具是对java class文件进行加密保护防止反编译的工具!...备注:如果下载站下载下来的程序有运行bug,请从上面两个下载地址更新软件。并给我们留言!谢谢... 升级提示:v2.1相比v2.0修改了一个注册bug。
  • 完善了动态更新词库代码注释; 将ik.conf配置文件中的lastUpdate属性改为long类型,现已支持时间戳形式 2018-08-13: 更新maven仓库地址 2018-08-01: 移除默认的扩展词与停用词 2018-07-23: 升级lucene版本为...
  • Tomcat是一个免费的开源的Serlvet容器,在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很...
  • 最全Hibernate 参考文档

    2018-08-29 09:51:51
    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...
  • hibernate 框架详解

    2011-06-07 12:13:22
    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class ...
  • Hibernate教程

    2010-04-29 11:24:20
    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2...

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

tomcat动态更新class