我遇到了问题,我根本无法理解。
我正在创建一个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并加载到app运行时的路径(我想在我的本地环境中开发和测试路由,然后将其上传到生产应用程序)。具体路由只是一个扩展RouteBuilder的简单java类。我想上传jar,classLoad(URLClassLoader)主类(也许是整个jar? - 这有意义吗?),并将其转换为RouteBuilder。这似乎是不可能的。我已经选择将jar文件上传到我战争之外的文件夹中,这样当我重新启动webapp时路由不会被删除(这是聪明还是应该以其他方式完成?)。这是关于名称空间的问题吗?此外,我还没有找到是否需要遍历我的整个jar文件和类加载内部的单个类。对此有何评论?
对我来说,似乎我对如何扩展/更新java应用程序有一些基本的误解。我根本找不到关于如何解决我的问题的任何好的例子/解释,因此我得出结论,我没有在概念层面得到这个。
有人可以详细说明如何扩展正在运行的jsf应用程序(我猜相同的问题在本机java应用程序中是相关的),解释如何在运行时上传和类加载jar,以及如何将加载的类转换为其他类类型比对象?
由于
拉塞
答案 0 :(得分:0)
如果您有兴趣在不停止申请的情况下加载路线,可以考虑使用像Karaf这样的OSGi容器。 Karaf为开箱即用的Apache Camel路由提供支持:http://camel.apache.org/karaf.html
所有类加载都由OSGi容器管理,您只需要运行一些命令来更新内容。我不确定这是否适用于您的JSF应用程序,但值得一看。