【问题标题】:Maven Dependency & Java Service Provider InterfaceMaven 依赖和 Java 服务提供者接口
【发布时间】: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 做些什么来让它们一起玩得更好?

【问题讨论】:

    标签: java spring maven jar


    【解决方案1】:

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

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

    【讨论】:

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

    当您运行您的应用程序时,您需要将实现 jar 放入 -Djava.ext.dirs=...,而不是 -cp ....
    如果实现 jar 配置不正确,应用程序将无法运行甚至抛出异常。

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

    spi tutorial

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 2016-03-21
      • 2018-12-03
      相关资源
      最近更新 更多