Maven Dependency&;Java服务提供者接口

Maven Dependency&;Java服务提供者接口,java,spring,maven,jar,Java,Spring,Maven,Jar,快速背景: 我已经建立了一个Java服务提供者接口,允许用户创建自己的自定义插件。他们实现的接口在自己的独立包中,因此我可以向他们发布一个较小的包,而无需其他大量代码 一旦用户创建了他们的JAR,他们就可以在运行时使用一些反射技巧(我在这里找到了反射技巧)将其动态加载到应用程序中。这些似乎工作得很好,但当我转移到另一台开发人员机器(以及我们的Jenkins机器)时,依赖项开始以某种方式被抛弃 接口的JAR是主应用程序和较小的用户创建插件的依赖项。当用户上传JAR时,他们一直在使用一个包含依赖项的

快速背景:
我已经建立了一个Java服务提供者接口,允许用户创建自己的自定义插件。他们实现的接口在自己的独立包中,因此我可以向他们发布一个较小的包,而无需其他大量代码

一旦用户创建了他们的JAR,他们就可以在运行时使用一些反射技巧(我在这里找到了反射技巧)将其动态加载到应用程序中。这些似乎工作得很好,但当我转移到另一台开发人员机器(以及我们的Jenkins机器)时,依赖项开始以某种方式被抛弃

接口的JAR是主应用程序和较小的用户创建插件的依赖项。当用户上传JAR时,他们一直在使用一个包含依赖项的JAR,这有助于确保接口是相同的。这使得JavaSPI能够获取它并使其可用。我已经开始切换用户包以使用提供的依赖项,希望这能修复org.springframework.web.util.NestedServletException:处理程序处理失败;嵌套异常为java.util.ServiceConfigurationError:com.company.interface.MyInterface:Provider com.usercode.ClassName不是子类型

在使用提供的作用域时,我在尝试加载用户JAR时遇到了不同的错误:com/company/interface/MyInterface


有人知道我可以用这个接口JAR和Maven做些什么来让它们一起玩吗?

如果插件使用这个JAR的
提供的
范围,那么您需要确保运行这些插件的主应用程序确实在插件可以访问的类路径上提供了这个JAR

此外,此错误:
java.lang.NoClassDefFoundError
不是根本原因。
您应该在应用程序日志中找到该错误的第一个实例,它应该显示该错误的根本原因。如果类在类路径中丢失,则当您运行应用程序时,它将是
java.lang.ClassNotFoundException

,您需要将实现jar放入-Djava.ext.dirs=…,而不是-cp.
如果没有正确配置实现jar,应用程序将无法工作,甚至引发异常

java-Djava.ext.dirs=../DictionaryServiceProvider/dist:../GeneralDictionary/dist-cp dist/DictionaryDemo.jar DictionaryDemo.DictionaryDemo

请参见

重建和检查后,我看到一个
java.lang.ClassNotFoundException
。我将“父”应用程序部署为WAR,其WEB-INF/lib确实具有所需的JAR。我没有将依赖项标记为父应用程序中提供的范围。子应用程序,已提供,父应用程序,未提供(希望它添加到类路径,但不是)。