我有一个Web应用程序,它的数据有一个可选的SOAP接口(实现为一堆EJB)。主应用程序和SOAP接口是分开的,只共享数据库访问代码,但最近它们被集成为一个应用程序(SOAP接口打包为添加到主应用程序依赖性的JAR)。两者都托管在JBoss服务器上。
该解决方案可行,但我们的应用程序使用模块化插件界面,允许使用Maven定位插件,从应用程序的用户界面打开和关闭特定功能。然后使用URLClassLoader
加载插件,并将应用程序的默认类加载器作为父加载,并注册到映射到*.page
的通用页面调度程序servlet:
<!-- from web.xml -->
<servlet-mapping>
<servlet-name>dispatcer</servlet-name>
<url-pattern>*.page</url-pattern>
</servlet-mapping>
在当前的解决方案中,使用web.xml
公开EJB:
<!-- the very same web.xml -->
<servlet>
<display-name>BaseService</display-name>
<servlet-name>BaseService</servlet-name>
<servlet-class>ourapp.services.BaseService</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BaseService</servlet-name>
<url-pattern>/services/Base/*</url-pattern>
</servlet-mapping>
当然,当EJB:s在运行时加载时,我们无法提前指定它们,所以:
如何从JAR加载EJB:s并在运行时将它们作为Web服务公开?
答案 0 :(得分:1)
没有用于动态加载EJB的标准API(我甚至不知道任何允许这样做的供应商API)。通常,EE部署专注于前期打包,使应用程序服务器能够内省您的应用程序并执行各种准备和优化。
答案 1 :(得分:1)
您可以将Web应用程序拆分为EJB jar和WAR以及部署/重新部署。 然后在您的应用中,您可以检查特定服务的可用性。
如果您使用JBoss AS 7,那么您可以利用Management API来部署/取消部署插件EJB jar。
见这里: