gpt4 book ai didi

java - 从类路径中动态删除 jar

转载 作者:行者123 更新时间:2023-11-30 07:43:15 24 4
gpt4 key购买 nike

我有一个要求,必须根据从 UI 捕获分布的分布来更改 jar。

不同组的分布各不相同。如果选择了某个发行版,则必须以动态/编程方式将与该发行版相关的 jar 添加到类路径中。

如果选择另一个发行版,则必须动态地从类路径中删除添加到类路径的先前 jar,并且必须动态添加与新发行版相关的新 jar。对于其他发行版,必须继续执行相同的操作分布。

I have seen earlier threads which state that adding jars at run-time is possible through Class Loader but I haven't seen any thread where jars can be removed dynamically from class-path.

谁能建议这是否可行?

最佳答案

一种简单的方法是将类加载器委托(delegate)给特定于发行版的类加载器。这是此类的草稿:

public class DistributionClassLoader extends ClassLoader {

public DistributionClassLoader(ClassLoader parent) {
super(parent);
}

private Map<String, ClassLoader> classLoadersByDistribution =
Collections.synchronizedMap(new WeakHashMap<>());

private final AtomicReference<String> distribution = new AtomicReference<>();

@Override
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException {
final ClassLoader delegate = classLoadersByDistribution.get(distribution.get());
if (delegate != null) return Class.forName(name, true, delegate);
throw new ClassNotFoundException(name);
}

public void addDistribution(String key, ClassLoader distributionClassLoader){
classLoadersByDistribution.put(key,distributionClassLoader);
}
public void makeDistributionActive(String key){distribution.set(key);}
public void removeDistribution(String key){
final ClassLoader toRemove = classLoadersByDistribution.remove(key);
}
}

但是,仍然存在一些问题:切换发行版时,我们希望从以前的发行版中卸载所有类。我认为没有办法实现这一目标。另外:如果您对委托(delegate)类加载器创建的对象有任何引用,这些对象将保留对其类加载器的引用。我不确定是否有合适的解决方案,但这可能会帮助您入门。

关于java - 从类路径中动态删除 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34350118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com