java - 多项目 Web 应用程序中的 classnotfoundException

标签 java eclipse maven

我正在开发一个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/

相关文章:

eclipse - 使用最新的 Mockito 需要哪些 jar?

升级到 Ubuntu 13.10 后 Eclipse 菜单不显示

Maven - 使用依赖构建

java - google 的 ImmutableList 和 Collections.unmodifiableList() 有什么区别?

Java 初学者指南 : FindFac & Nested Loops

java - startActivity(intent) 未打开 Activity

java - 将 Java 程序从 UDP 切换到 TCP 的最简单方法是什么?

java - 如何将 xml 文件添加到 eclipse 中的 java 应用程序的类路径?

java - 如何在我的 Maven 项目中只禁止一种传递依赖?

java - maven:编译 fatal error :endorseddirs