gpt4 book ai didi

java - 无法在具有接口(interface)插件类支持(Jar 内的 Jar)的 Java 应用程序中公开自定义类

转载 作者:行者123 更新时间:2023-11-30 02:41:27 25 4
gpt4 key购买 nike

我有一个使用 websockets 进行通信的服务器/客户端设置,它们都是 Spring Boot 应用程序,并且用于通信的消息类保存在单独的项目“CommonClasses”中。

服务器和客户端项目的构建路径上都有 CommonClasses 项目,这使它们能够访问共享消息类型。

客户端将从服务器接收消息并在响应之前执行操作。迄今为止,客户可以执行的功能数量有限,但目的是将其开放给客户来设计自己的实现。为此,有一个必须实例化的应用程序接口(interface),我只需将客户端添加到新项目的类路径中,放入我的新实现并使用客户端中的类路径加载器来加载这个新 jar 并调用即可完成此操作新方法。

如果我有一个普通方法,但当我尝试实现先前传递消息的实际接口(interface)(如 CommonClasses 中详细说明)时,这会起作用。

如果我解压客户端 jar 文件并将生成的 CommonClasses jar 文件添加到我的类路径中,我可以看到这些类,但是当我执行此操作并尝试将实例化对象转换为我的接口(interface)类型时,我会得到 java.lang.ClassCastException。

我在堆栈溢出上对此进行了研究,得出的结论是,这是因为尽管客户端接口(interface)和新项目中引用的接口(interface)具有相同的签名和项目,但它们被视为不同的对象。这一切都是因为我必须从客户端 jar 中提取 CommonClasses jar。

我有什么选择?我知道我可以创建一个新接口(interface)并使用普通的 java 类型并转换所有内容,但这会很昂贵,并且希望尽可能避免这种情况。更改现有项目的构建过程是可能的,但应尽可能避免。

这是我迄今为止所拥有的:

    URL[] classLoaderUrls = new URL[]{new URL("file:C:\\customApplier.jar")};
// Create a new URLClassLoader
URLClassLoader urlClassLoader = new URLClassLoader(classLoaderUrls);
// Load the target class
Class<?> beanClass = urlClassLoader.loadClass("com.test.Applier");
// Create a new instance from the loaded class
Constructor<?> constructor = beanClass.getConstructor();
ApplierIn ob = (ApplierIn)constructor.newInstance();

尝试转换为 (ApplierIn) 时抛出异常。感谢您的建议!

最佳答案

感谢@Klaus-Groenbaek 能够识别问题,这确实是一个不正确的类加载器。所以我把它改为调用:

    private static void addCustomJar(URL fileUrl) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
method.invoke(ApplierIn.class.getClassLoader(), new Object[]{fileUrl});
}

为了将新的 jar 文件加载到我的应用程序中。之后,事实证明,解压后的 jar 里的 jar 不是问题!

关于java - 无法在具有接口(interface)插件类支持(Jar 内的 Jar)的 Java 应用程序中公开自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41574819/

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