java classpath_你如何在Java中更改CLASSPATH?

我刚刚描述的类加载策略是以新类型实现的,而在Java 9中,应用程序类加载器属于该类型。

这意味着它URLClassLoader不再是,所以偶尔(URLClassLoader) getClass().getClassLoader()或(URLClassLoader) ClassLoader.getSystemClassLoader()序列将不再执行。

对于Java 8或更低版本:

一些一般性意见:

你不能(以可移植的方式保证工作,见下文)改变系统类路径。相反,您需要定义一个新的ClassLoader。

ClassLoaders以分层方式工作...因此,任何对类X进行静态引用的类都需要在与X相同的ClassLoader中加载,或者在子类ClassLoader中加载。您不能使用任何自定义ClassLoader来正确地使系统ClassLoader链接加载代码,如果它之前没有这样做的话。因此,除了您找到的额外代码之外,您还需要安排主应用程序代码在自定义ClassLoader中运行。

你可能会考虑不编写自己的ClassLoader,而只是使用URLClassLoader。使用不在父类加载器URL中的URL创建URLClassLoader 。URL[] url={new URL("file://foo")};URLClassLoader loader = new URLClassLoader(url);ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();// Add the conf dir to the classpath// Chain the current thread classloaderURLClassLoader urlClassLoader = new URLClassLoader(new URL[]{new File("mtFile").toURL()},

currentThreadClassLoader);// Replace the thread classloader - assumes// you have permissions to do soThread.currentThread().setContextClassLoader(urlClassLoader);

如果您假设JVMs系统类加载器是URLClassLoader(对于所有JVM可能都不是这样),您也可以使用反射来实际修改系统类路径...(但这是一个hack;)):public void addURL(URL url) throws Exception {

URLClassLoader classLoader         = (URLClassLoader) ClassLoader.getSystemClassLoader();

Class clazz= URLClassLoader.class;

// Use reflection

Method method= clazz.getDeclaredMethod("addURL", new Class[] { URL.class });

method.setAccessible(true);

method.invoke(classLoader, new Object[] { url });}addURL(new File("conf").toURL());// This should work now!Thread.currentThread().getContextClassLoader().getResourceAsStream("context.xml");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值