我正在尝试使用类路径方法应用补丁,我的意思是我将修改后的类文件添加为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");
}
}
感谢。
答案 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.");
}