我有一个 Web 应用程序,它的数据有一个可选的 SOAP 接口(作为一组 EJB 实现)。主应用程序和 SOAP 接口是分开的,只共享数据库访问代码,但最近它们被集成为一个应用程序(SOAP 接口被打包为一个 JAR,添加到主应用程序的依赖项中)。两者都托管在 JBoss 服务器上。
该解决方案有效,但我们的应用程序使用模块化插件界面,允许从应用程序的用户界面打开和关闭特定功能,使用 Maven 来定位插件。然后使用URLClassLoader
应用程序的默认类加载器作为父级加载插件,并注册到映射到的通用页面调度程序 servlet *.page
:
<!-- from web.xml -->
<servlet-mapping>
<servlet-name>dispatcer</servlet-name>
<url-pattern>*.page</url-pattern>
</servlet-mapping>
在当前解决方案中,EJB 使用以下方式公开web.xml
:
<!-- 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 服务?