能动态修改CLASSPATH吗?比如新加了一个jar文件,程序不用重启就能装入里面的类?

HowUCan 2004-05-10 08:23:49
能动态修改CLASSPATH吗?比如新加了一个jar文件,程序不用重启就能装入里面的类?
我不想自己做ClassLoader,希望能动态修改ClassPath,让系统的ClassLoader能自己去找到
...全文
431 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
allenhe 2004-07-12
  • 打赏
  • 举报
回复
URLClassLoader就可以了
根本不需要这么复杂的
qudong078 2004-07-12
  • 打赏
  • 举报
回复
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来完成应该可以满足你的要求。
HowUCan 2004-07-12
  • 打赏
  • 举报
回复
搞明白了,就用URLClassLoader;当jar文件更新时,先把原来已经new出来的对象置为null,然后用一个新的URLClassLoader装进来。
qudong078 2004-07-12
  • 打赏
  • 举报
回复
我比较懒,将它的东东全弄了出来,
有兴趣的话自己提取一下就可以了
raimundo 2004-05-12
  • 打赏
  • 举报
回复
新加一个jar还好办,可以用URLClassLoader,如果替换的话就要重写一个ClassLoader了,不过如果替换的话一般的手法还真没什么着,最好参考一下JBoss的Hot Deploy的实现
caiyanying732 2004-05-12
  • 打赏
  • 举报
回复
classLoader
tiger_wkh52741 2004-05-12
  • 打赏
  • 举报
回复
嗯,classLoader可以!
北极猩猩 2004-05-12
  • 打赏
  • 举报
回复
自己定义ClassLoader吧。
fast_time 2004-05-12
  • 打赏
  • 举报
回复
那你还得监听啊!!!
19830711 2004-05-12
  • 打赏
  • 举报
回复
up
HowUCan 2004-05-11
  • 打赏
  • 举报
回复
怎么用啊,能否介绍一下?
stonecsdn 2004-05-10
  • 打赏
  • 举报
回复
呵呵,使用ant

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧