【发布时间】:2016-08-30 04:26:43
【问题描述】:
快速背景:
我已经设置了一个 Java 服务提供者接口来允许用户创建他们自己的自定义插件。他们实现的接口在其自己的独立包中,因此我可以向他们发布一个较小的包,而无需其他庞大的代码。
一旦用户创建了他们的 JAR,他们就可以在运行时使用一些反射技巧(我在 SO 上找到)将其动态加载到应用程序中。这些似乎工作得很好,但是当我转移到另一台开发人员机器(和我们的 Jenkins 机器)上时,依赖项开始以某种方式被抛弃。
接口的 JAR 是主应用程序和较小用户创建的插件的依赖项。当用户上传 JAR 时,他们一直在使用包含该依赖项的 JAR,这有助于确保界面相同。这允许 Java SPI 将其拾取并使其可用。我已经开始切换用户包以使用 <scope>provided</scope> 的依赖项,希望这可以修复 org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.util.ServiceConfigurationError: com.company.interface.MyInterface: Provider com.usercode.ClassName not a subtype。
使用提供的范围时,我在尝试加载用户 jar 时遇到了 java.lang.NoClassDefFoundError: com/company/interface/MyInterface 的不同错误。
有谁知道我可以用这个 Interface JAR 和 Maven 做些什么来让它们一起玩得更好?
【问题讨论】: