我正在开发一个Web应用程序,它的形式是一些用于JSF2前端的war文件,一些用于服务的jar文件,以及一些用于从前端调用服务的共享jar文件,例如
webLayer.war -> serviceUtilities.jar -> service.jar
我的问题是,当我尝试使用我的服务实用程序(使用反射来调用单独 jar 中的服务类)从前端调用服务时,我得到一个类未找到异常。
我通过将 Web 项目 pom.xml 中的依赖项范围从“提供”更改为“编译”来解决该问题,但这并不理想,因为我必须构建所有相关项目,然后将它们作为库构建到我的 Web 层中。
我想要的是让我的 Web 层 war 和服务层 jar 完全分开,这样如果我更改我的服务,我只需要编译该项目。但显然我仍然希望能够访问我的 war 中的 jar 。
这可以做到吗?如果可以的话怎么做?
提前致谢
最佳答案
我相信您正在尝试以非正统的方式实现项目之间的完全解耦。
首先,使用 provided
意味着虽然该库在编译时存在,但它不会被添加到您的可部署项(本例中为 war),因为它被假定存在于您部署的平台中。考虑使用 servlet api 时的类似情况,但您在运行时不需要将其作为显式依赖项,因为您的 servlet 容器提供了
它。它不会为您提供解耦,而是提供一种防止依赖项重复的方法。因此,在您的情况下,Web 应用程序和 serviceUtilities.jar 在运行时对您的 service.jar 不了解任何信息,而它们在编译时则了解。
按照您所说的方式直接访问 jar 是非常困难的(即使使用反射 - 它仍然是二进制依赖项),同时保持项目的生命周期独立。
我认为实现层与层之间完全解耦的最佳方式是使用 Rest + Json
进行通信。您甚至可以将层部署在单独的节点中。只要服务契约不改变(本例中为其余 url),您甚至可以安全地在不同实现之间切换或公开多个前端
然后,您在 Web 端的 serviceUtilities 将被使用一些 REST 客户端库的代码替换,并且您的服务层还将使用一些 REST 服务提供程序来监听您的 REST URL。您使用哪种技术取决于您的偏好和技术堆栈。 Jersey是 JAX-RS 的引用实现,同时您也可以在提供者端轻松使用 spring Controller 。
关于java - 多项目 Web 应用程序中的 classnotfoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29511720/