我正在开发一个Web应用程序,其形式为JSF2前端的一些war文件,一些用于服务的jar文件,以及一些用于从前端调用服务的共享jar,例如
webLayer.war - > serviceUtilities.jar - > service.jar中
我的问题是,当我尝试使用我的服务实用程序(使用反射在一个单独的jar中调用服务类)从前端调用服务时,我得到一个类未找到异常。
我通过将web项目pom.xml中的依赖项的范围从提供更改为编译来解决此问题,但这并不理想,因为我必须构建所有相关项目,然后将它们构建到我的Web层中作为图书馆。
我想要的是让我的网络层战争和服务层jar完全分开,这样如果我改变我的服务,我只需要编译该项目。但显然我仍然希望能够从我的战争中获取罐子。
可以这样做,如果是这样的话?
提前致谢
答案 0 :(得分:0)
我相信你正在努力实现你的项目之间的完全脱钩,但是以非正统的方式。
首先,使用provided
意味着虽然库在编译时存在,但它不会被添加到您的可部署(在这种情况下是战争),因为它被假定存在于平台中你在哪里部署。在使用servlet api时可以考虑类似的情况,但是在运行时不需要它作为显式依赖项,因为它的servlet容器provides
。它不会为您提供解耦,而是一种防止依赖项重复的方法。因此,在您的情况下,Web应用程序和serviceUtilities.jar在运行时并不了解您的service.jar,而是在编译时。
如你所说,很难直接访问罐子(即使使用反射 - 它仍然是二元依赖),同时保留项目'生命周期独立。
我认为在层之间实现完全解耦的最佳方法是使用Rest + Json
进行通信。您甚至可以在单独的节点中部署图层。只要服务合同没有改变(在这种情况下是其他网址),您甚至可以安全地在不同的实现之间切换或暴露多个前端
然后,您在web侧的serviceUtilities将被使用一些rest客户端库的代码替换,您的服务层也将使用一些休息服务提供商来收听您的其他URL。您使用哪种技术取决于您的偏好和技术堆栈。 Jersey是JAX-RS的参考实现,同时您也可以在提供者端轻松使用spring控制器。