能动态修改CLASSPATH吗?比如新加了一个jar文件,程序不用重启就能装入里面的类? 新加一个jar还好办,可以用URLClassLoader,如果替换的话就要重写一个ClassLoader了,不过如果替换的话一般的手法还真没什么着,最好参考一下JBoss的Hot Deploy的实现 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 搞明白了,就用URLClassLoader;当jar文件更新时,先把原来已经new出来的对象置为null,然后用一个新的URLClassLoader装进来。 ofbiz上的东东:package org.ofbiz.base.start;import java.io.File;import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;import java.net.URLClassLoader;import java.util.StringTokenizer;import java.util.Vector;/** * Class to handle CLASSPATH construction * @author Jan Hlavat? */public class Classpath { Vector _elements = new Vector(); public Classpath() {} public Classpath(String initial) { addClasspath(initial); } public boolean addComponent(String component) { if ((component != null) && (component.length() > 0)) { try { File f = new File(component); if (f.exists()) { File key = f.getCanonicalFile(); if (!_elements.contains(key)) { _elements.add(key); return true; } } } catch (IOException e) {} } return false; } public boolean addComponent(File component) { if (component != null) { try { if (component.exists()) { File key = component.getCanonicalFile(); if (!_elements.contains(key)) { _elements.add(key); return true; } } } catch (IOException e) {} } return false; } public boolean addClasspath(String s) { boolean added = false; if (s != null) { StringTokenizer t = new StringTokenizer(s, File.pathSeparator); while (t.hasMoreTokens()) { added |= addComponent(t.nextToken()); } } return added; } public String toString() { StringBuffer cp = new StringBuffer(1024); int cnt = _elements.size(); if (cnt >= 1) { cp.append(((File) (_elements.elementAt(0))).getPath()); } for (int i = 1; i < cnt; i++) { cp.append(File.pathSeparatorChar); cp.append(((File) (_elements.elementAt(i))).getPath()); } return cp.toString(); } public URL[] getUrls() { int cnt = _elements.size(); URL[] urls = new URL[cnt]; for (int i = 0; i < cnt; i++) { try { urls[i] = ((File) (_elements.elementAt(i))).toURL(); } catch (MalformedURLException e) {} } return urls; } public ClassLoader getClassLoader() { URL[] urls = getUrls(); ClassLoader parent = Thread.currentThread().getContextClassLoader(); if (parent == null) { parent = Classpath.class.getClassLoader(); } if (parent == null) { parent = ClassLoader.getSystemClassLoader(); } return new URLClassLoader(urls, parent); }}改变的代码如下: private Classpath classPath = new Classpath(System.getProperty("java.class.path")); System.setProperty("java.class.path", classPath.toString()); ClassLoader classloader = classPath.getClassLoader(); Thread.currentThread().setContextClassLoader(classloader);主要是通过ClassLoader来完成应该可以满足你的要求。 URLClassLoader就可以了根本不需要这么复杂的 高手来看看,关于类的执行顺序问题 JAVA如何得到当前日期是星期几?求JAVA代码 请问各位高手 jface tableviewer 中如何获得 当前cell 或者 当前行数列数 关于Thread的执行代码块疑问 打包时候为何类文件进不去 从socket读东东,对方不给出长度说明,我怎样高效准确的读出他通过socket传给我的东东? 在java中,怎样声明、创建C中的union变量??? 请老鸟们推荐一个JAVA编译器 how to call parent's methods in a son class? 如何将java直接编译成exe文件? 关于多线程 十万个为什么之“关于初始化”
package org.ofbiz.base.start;import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.StringTokenizer;
import java.util.Vector;/**
* Class to handle CLASSPATH construction
* @author Jan Hlavat?
*/
public class Classpath { Vector _elements = new Vector(); public Classpath() {} public Classpath(String initial) {
addClasspath(initial);
} public boolean addComponent(String component) {
if ((component != null) && (component.length() > 0)) {
try {
File f = new File(component);
if (f.exists()) {
File key = f.getCanonicalFile();
if (!_elements.contains(key)) {
_elements.add(key);
return true;
}
}
} catch (IOException e) {}
}
return false;
} public boolean addComponent(File component) {
if (component != null) {
try {
if (component.exists()) {
File key = component.getCanonicalFile();
if (!_elements.contains(key)) {
_elements.add(key);
return true;
}
}
} catch (IOException e) {}
}
return false;
} public boolean addClasspath(String s) {
boolean added = false;
if (s != null) {
StringTokenizer t = new StringTokenizer(s, File.pathSeparator);
while (t.hasMoreTokens()) {
added |= addComponent(t.nextToken());
}
}
return added;
} public String toString() {
StringBuffer cp = new StringBuffer(1024);
int cnt = _elements.size();
if (cnt >= 1) {
cp.append(((File) (_elements.elementAt(0))).getPath());
}
for (int i = 1; i < cnt; i++) {
cp.append(File.pathSeparatorChar);
cp.append(((File) (_elements.elementAt(i))).getPath());
}
return cp.toString();
} public URL[] getUrls() {
int cnt = _elements.size();
URL[] urls = new URL[cnt];
for (int i = 0; i < cnt; i++) {
try {
urls[i] = ((File) (_elements.elementAt(i))).toURL();
} catch (MalformedURLException e) {}
}
return urls;
} public ClassLoader getClassLoader() {
URL[] urls = getUrls(); ClassLoader parent = Thread.currentThread().getContextClassLoader();
if (parent == null) {
parent = Classpath.class.getClassLoader();
}
if (parent == null) {
parent = ClassLoader.getSystemClassLoader();
}
return new URLClassLoader(urls, parent);
}
}
改变的代码如下:
private Classpath classPath = new Classpath(System.getProperty("java.class.path"));
System.setProperty("java.class.path", classPath.toString());
ClassLoader classloader = classPath.getClassLoader();
Thread.currentThread().setContextClassLoader(classloader);
主要是通过ClassLoader来完成应该可以满足你的要求。
根本不需要这么复杂的