【问题标题】:Dynamically removing jars from classpath从类路径中动态删除 jar
【发布时间】:2015-12-19 17:08:58
【问题描述】:

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

分布因一组而异。如果选择了分发,则必须以动态/编程方式将与该分发相关的 jar 添加到类路径中。

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

我已经看到早期的线程表明可以通过类加载器在运行时添加 jar,但我还没有看到任何可以从类路径中动态删除 jar 的线程。

谁能建议这是否可能?

【问题讨论】:

  • @Sean Patrick Floyd 问题不重复,因为您提供的链接没有解决问题的解决方案。链接中的解决方案解释了如何加载一个类类路径中的现有 jar。但目前的问题是我必须完全动态地将一个新 jar 添加到类路径中,并以编程方式从类路径中删除一个现有 jar,我在任何线程中都找不到任何解决方案.
  • 重新开张了,看看去哪儿
  • 你考虑过 OSGi 吗?

标签: java jar


【解决方案1】:

一种天真的方法是委托给特定于分发的 ClassLoader 的 ClassLoader。以下是此类课程的草稿:

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);
    }
}

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

【讨论】:

  • 当我尝试使用DistributionClassLoader它没有找到父类
猜你喜欢
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 2011-03-16
  • 2016-08-27
相关资源
最近更新 更多