【问题标题】:class casting of runtime added classes运行时添加类的类转换
【发布时间】:2013-10-17 09:21:33
【问题描述】:

我遇到了一个问题,我根本无法理解。

我正在创建一个 jsf 应用程序,我(作为管理员)可以在其中上传 jar 文件,然后更新应用程序。

通过本教程:http://docs.oracle.com/javase/tutorial/deployment/jar/jarclassloader.html 我已经成功地类加载了 jar 文件。第一个问题是我只能将类加载为“对象”,而不能转换为其他类类型。我得到一个 ClassCastException。

JarClassLoader jcl=new JarClassLoader(url);
Class cl= jcl.retreiveClass(jcl.getMainClassName());
Object ob=cl.newInstance(); //I would like to make this a RouteBuilder object instead of Object

具体来说,我使用的是 Apache Camel,我可以在其中将路由添加到现有的“核心”(CamelContext)。发生的事情是我在我的网络应用程序中运行了 apache camel 的核心,然后我可以添加路由运行时。这是我想打包为 jar 并加载到应用程序运行时的路由(我想在本地环境中开发和测试路由,然后将其上传到生产应用程序)。具体路由只是一个扩展 RouteBuilder 的简单 java 类。我想上传jar,classLoad(URLClassLoader)主类(可能是整个jar? - 这有意义吗?),并将其转换为RouteBuilder。这似乎是不可能的。我选择将 jar 文件上传到我的战争之外的文件夹,这样当我重新启动 web 应用程序时路由不会被删除(这是聪明的还是应该以其他方式完成?)。这是关于名称空间的问题吗?此外,我无法确定是否需要遍历我的整个 jar 文件和类加载其中的单个类。有cmet吗?

对我来说,我似乎对如何扩展/更新 Java 应用程序有一些基本的误解。我根本找不到任何关于如何解决我的问题的好例子/解释,因此我得出结论,我在概念层面上没有得到这个。

有人可以详细说明如何扩展正在运行的 jsf 应用程序(我猜同样的问题与本机 Java 应用程序相关),解释如何在运行时上传和类加载 jar,以及如何将加载的类转换为其他类类型比对象?

谢谢

拉斯

【问题讨论】:

    标签: runtime classloader apache-camel


    【解决方案1】:

    如果您有兴趣在不停止应用程序的情况下加载路由,您可以考虑使用像 Karaf 这样的 OSGi 容器。 Karaf 提供开箱即用的 Apache Camel 路由支持:http://camel.apache.org/karaf.html

    所有类加载都由 OSGi 容器管理,您只需要运行一些命令来更新内容。我不确定这是否适用于您的 JSF 应用程序,但值得一看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      相关资源
      最近更新 更多