我正在为第三方软件开发一个没有文档的插件。对于插件,我使用由 maven 管理的外部库(.jar),稍后在 tomcat 服务器上执行。一切都很好,直到我更新到最新版本的库,现在使用 java.util.serviceLoader 来加载接口的具体实现。构建时,我的项目在 tomcat 服务器上有这个包结构:
mypluginPackage.jar
|
---META-INF
---lib
|
--- theExternalLibUsingServiceLoader.jar
|
---META-INF
|
---services
|
--- full.path.to.TheFactoryInterface
---external.lib.path
|
--- TheFactoryInterface.class
--- TheConreteClass.class
--- mypluginCore.jar
|
---META-INF
--- my.plugin.path
|
--- MyClassUsingTheExternalLib.class
如您所见,外部库具有正确的服务条目,这是 serviceLoader 在 META-INF 中找到接口的具体所必需的。该 full.path.to.TheFactoryInterface
文件的内容是full.path.to.TheConcreteClass
,这似乎是合法的。
但是,我的插件(包和核心)没有任何这些 META-INF 信息。
现在发生的情况是,每次我的插件使用会触发外部库的 serviceLoader 的方法时,serviceLoader 都找不到具体的实现。
我已经尝试过将完全相同的内容添加services/full.path.to.TheFactoryInterface
到我的所有 META-INF 目录中,但这不起作用(我想我需要更改 full.path.to.TheFactoryInterface 文件的内容,但我不确定 - 因为3rd 方软件的未记录插件结构 - 正确的(相对)路径是什么样的)。
谁能给我一个镜头我在这里做错了什么以及如何解决它以便serviceLoader找到具体的类?包含内容的服务文件夹应该放在哪个 META-INF 文件夹中,我应该更改路径吗?这是完全错误还是我错过了完全不同的东西?
我知道这是一个非常特殊的主题,因为第 3 方软件是未知的,但是任何取决于 serviceLoader 的信息及其在具有多个 META-INF 文件夹和不同执行上下文/类路径的多个 jar 中运行时的行为都会受到赞赏。