【发布时间】: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