首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java 9下在运行时将jar添加到类路径

在java 9下在运行时将jar添加到类路径
EN

Stack Overflow用户
提问于 2017-12-31 10:38:54
回答 2查看 7.3K关注 0票数 20

直到java9通过编程方式将外部jar添加到运行时的类路径时,每个人都使用:

代码语言:javascript
复制
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
method.invoke(sysloader, new Object[]{file.toURI().toURL()});

现在,对于java9,我们遇到了问题:

线程"main“java.lang.ClassCastException中的异常:不能将java.base/jdk.internal.loader.ClassLoaders$AppClassLoader转换为java.base/java.net.URLClassLoader

URLClassLoader在Java9中不再工作了。现在在jdk9下以编程方式向类路径添加外部jar怎么办?

EN

回答 2

Stack Overflow用户

发布于 2017-12-31 12:46:02

JavaSE9发行说明也读到了同样的内容:

应用程序类加载器不再是java.net.URLClassLoader的实例(以前版本中从未指定的实现细节)。 假设ClassLoader::getSytemClassLoader返回URLClassLoader对象的代码需要更新。 请注意,Java和JDK没有为应用程序或库提供API,以便在运行时动态地增强类路径。

此外,当需要扩展类路径时,可以使用

代码语言:javascript
复制
Class<?> clazz = Class.forName("nameofclass", true, new URLClassLoader(urlarrayofextrajarsordirs));

正如本来自Oracle的线程中所建议的那样。这是附带的警告:

  • Thread.currentThread().setContextClassLoader(specialloader);使用线程的ClassLoader上下文
  • java.sql.DriverManager确实尊重调用类‘ClassLoader,而不是线程的ClassLoader。直接使用Class.forName("drivername", true, new URLClassLoader(urlarrayofextrajarsordirs).newInstance();创建驱动程序
  • javax.activation使用线程的ClassLoader上下文(对javax.mail很重要)。
票数 11
EN

Stack Overflow用户

发布于 2019-06-26 05:49:40

Naman的回答不是正确的替代您正在寻找的东西。在Java9和更高版本中向类路径添加jar的正确方法是使用Java仪器appendToSystemClassLoaderSearch(JarFile jarfile)方法。

首先,需要将代理类添加到MANIFEST.MF中

Launcher-Agent-Class: com.yourpackage.Agent

那就加入你的经纪人。下面的示例将允许您调用Agent.addClassPath(File f)将Jar添加到Java8和9+中的类路径中。

代码语言:javascript
复制
public class Agent {
    private static Instrumentation inst = null;

    // The JRE will call method before launching your main()
    public static void agentmain(final String a, final Instrumentation inst) {
        Agent.inst = inst;
    }

    public static boolean addClassPath(File f) {
        ClassLoader cl = ClassLoader.getSystemClassLoader();

        try {
            // If Java 9 or higher use Instrumentation
            if (!(cl instanceof URLClassLoader)) {
                inst.appendToSystemClassLoaderSearch(new JarFile(f));
                return;
            }

            // If Java 8 or below fallback to old method
            Method m = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
            m.setAccessible(true);
            m.invoke(cl, (Object)f.toURI().toURL());
        } catch (Throwable e) { e.printStackTrace(); }
    }

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48041764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档