Java 多项目web应用程序中的classnotfoundexception

Java 多项目web应用程序中的classnotfoundexception,java,eclipse,maven,Java,Eclipse,Maven,我正在开发一个web应用程序,它的形式是:一些war文件用于JSF2前端,一些jar文件用于服务,一些共享jar用于从前端调用服务,例如 webLayer.war->serviceUtilities.jar->service.jar 我的问题是,当我尝试使用我的服务实用程序(使用反射在单独的jar中调用服务类)从前端调用服务时,我得到了一个类not found异常 我通过将web项目pom.xml中依赖项的范围从提供更改为编译来解决这个问题,但这并不理想,因为我必须构建所有相关项目,然后将它们作

我正在开发一个web应用程序,它的形式是:一些war文件用于JSF2前端,一些jar文件用于服务,一些共享jar用于从前端调用服务,例如

webLayer.war->serviceUtilities.jar->service.jar

我的问题是,当我尝试使用我的服务实用程序(使用反射在单独的jar中调用服务类)从前端调用服务时,我得到了一个类not found异常

我通过将web项目pom.xml中依赖项的范围从提供更改为编译来解决这个问题,但这并不理想,因为我必须构建所有相关项目,然后将它们作为库构建到web层中

我想要的是将我的web层WAR和服务层JAR完全分开,这样,如果我更改了我的服务,我只需要编译那个项目。但很明显,我仍然希望能够从我的战争中接触到罐子

这可以做到吗?如果可以,如何做到


提前感谢

我相信您正试图以一种非正统的方式实现项目之间的完全解耦

首先,使用提供的
,意味着虽然库在编译时存在,但它不会被添加到可部署(本例中为war)中,因为它假定存在于您部署的平台中。在使用servlet api时,可以考虑类似的情况,但在运行时不需要将其作为显式依赖项,因为servlet容器
提供了它。它并没有提供解耦功能,而是提供了一种防止依赖项重复的方法。因此,在您的情况下,web应用程序和serviceUtilities.jar在运行时不知道关于您的service.jar的任何信息,而在编译时知道

要像您所说的那样直接访问JAR是非常困难的(即使使用反射——它仍然是一个二进制依赖),同时保持项目的生命周期独立

我认为实现层间完全解耦的最佳方法是使用
Rest+Json
进行通信。您甚至可以在单独的节点中部署层。只要服务契约不变(本例中为rest URL),您就可以安全地在不同的实现之间切换或公开多个前端

然后,web端的serviceUtilities将被使用某些rest客户端库的代码替换,并且您的服务层也将使用某些rest服务提供者来侦听您的rest URL。您使用哪种技术取决于您的首选项和技术堆栈。是JAX-RS的参考实现,同时您也可以在提供者端轻松使用spring控制器。

感谢您的响应。我想,如果我的JAR部署在与war相同的服务器上,我可以使用它。pom.xmls中存在所需的依赖项,所有内容都可以编译。错误发生在运行时,所以我猜JAR不存在于类路径中。我的理解是Maven会帮我处理的。我同意你的建议,我计划将来使用ApacheCXF来管理通信,但我希望现在有一个简单的解决方案。我正在使用JSF(以前是JSP)重写前端,所以我希望按原样使用我现有的服务代码。您应该确保将它们部署在应用程序的类加载器可以访问的地方。这取决于您的服务器(对于某些j2ee应用程序服务器,可能也会使用ear)好的,非常感谢您的指点,我想我现在对需要做什么有了更好的了解。我在JBoss中找到了一些关于运行时类路径的好文档,但我想我现在就开始使用CXF,而不是在安装CXF之后时不时地重新配置所有内容。再次感谢