【问题标题】:How to load classes from jar file at runtime? [duplicate]如何在运行时从 jar 文件中加载类? [复制]
【发布时间】:2023-03-10 01:55:01
【问题描述】:

我正在设计一个具有可插入组件架构(插件)的 Web 应用程序。我的要求是在不重新启动应用程序的情况下将新的插件 jar(类)添加到应用程序中,它应该放在 Web 应用程序的 lib 或插件目录中,并且应用程序应该能够拾取它。

我在 tomcat 服务器上尝试过,但是一旦启动,它就无法加载放入其 lib 目录中的 jar 文件。

谁能提出一个最好的方法来做到这一点?

【问题讨论】:

  • 为此目的最好使用 OSGI。它能够在运行时从您的类路径中加载和卸载 Jars/Packages/Classes。您甚至可以在存储库中定义它们,在那里可以搜索和下载它们,而无需知道它们的名称。
  • 我也正要添加这个指针。主要论点:您不想发明、实施和维护另一个组件框架,除非它是为了学术娱乐。但即便如此,我认为这个问题在 OSGI 中得到了很好的解决

标签: java tomcat jakarta-ee jboss


【解决方案1】:

您的尝试很好,您尝试做的任何事情都可以通过以下代码为您提供帮助

URL urls [] = {};

JarFileLoader cl = new JarFileLoader (urls);

cl.addFile ("/opt/mysql-connector-java-5.0.4/mysql-connector-java-5.0.4-bin.jar");

System.out.println ("attempt...");

cl.loadClass ("org.gjt.mm.mysql.Driver");

System.out.println ("Success!");

希望对你有帮助

JVM 按此顺序搜索和加载类:

Bootstrap 类,它们是构成 Java 平台的类,包括 rt.jar 和其他几个重要 JAR 文件中的类。

扩展类,它使用 Java 扩展机制。这些类被捆绑为 JAR 文件并位于扩展目录中。

用户类是由开发人员和第三方定义并且不利用扩展机制的类。

【讨论】:

  • 感谢 Santosh,但在我的情况下,我可能无法提及 jarfile 名称甚至类名,因为在运行时它可以是任何东西,我正在做的是用 @ 注释每个插件类插件注释,这是我的插件扫描逻辑唯一可以解决的问题。我能做的就是定期触发这个插件扫描逻辑。
猜你喜欢
  • 2012-06-16
  • 2010-09-16
  • 2014-07-30
  • 2011-11-26
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多