Maven Dependency& Java服务提供者接口

时间:2016-05-04 15:56:49

标签: java spring maven jar

快速背景:
我已经设置了一个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的不同错误。

任何人都知道我可以用这个界面JAR和Maven做些什么来让这些游戏很好玩?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

运行应用程序时,需要将实现jar放在 -Djava.ext.dirs = ...中,而不是-cp ....
如果未正确配置实施jar,则该应用将无法运行甚至引发异常。

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

请参阅spi tutorial