控制CLASSPATH中Java类的加载

时间:2013-09-20 17:23:15

标签: java jvm classpath jvm-arguments

我正在尝试使用类路径方法应用补丁,我的意思是我将修改后的类文件添加为jar文件,并且在加载类时会加载新版本的类。因此,在不更改原始jar文件的情况下修补应用程序。

以下类路径定义正常工作;

java -cp patch/patch.jar;bin/  com.test.PatchClasspath

但是当更改了lib类的顺序时,它不起作用。(像往常一样)

java -cp bin/;patch/patch.jar  com.test.PatchClasspath

我想知道是否有一个JVM参数指示lib加载顺序?

EDITED: 我正在修改Util-> print()方法以验证是否应用了补丁。

package com.test;

public class PatchClasspath {

public static void main(String[] args) {
    Util util = new Util();
    util.print();
}   

}


package com.test;

public class Util {


public void print(){
    System.out.println("Version-1");
}

}

感谢。

2 个答案:

答案 0 :(得分:2)

没有这样的参数表明JVM中的lib加载顺序(我相信),但是,java -classpath选项本身将根据你放置的路径确定类加载顺序。

JDK文档说明了这一点: http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/classpath.html

规格订单

指定多个类路径条目的顺序非常重要。 Java解释器将按照它们在类路径变量中出现的顺序查找目录中的类。在上面的示例中,Java解释器将首先在目录C:\ java \ MyClasses中查找所需的类。只有当它在该目录中找不到具有正确名称的类时,解释器才会查看C:\ java \ OtherClasses目录。

答案 1 :(得分:1)

尝试-verbose:class,这将显示所有已加载的类,它们的加载顺序以及加载它们的jar。

要控制加载的类的顺序,可以使用java -cp修改类路径中jar的顺序。我认为没有办法控制从特定jar加载的类的顺序。

要验证是否已应用补丁,简单/虚拟解决方案是添加System.out.println("")的静态字段。例如:

static {
  System.out.println("[DBG] : My Patch v1.0 is loaded.");
}
相关问题