0

我正在为第三方软件开发一个没有文档的插件。对于插件,我使用由 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 中运行时的行为都会受到赞赏。

4

1 回答 1

0

我能够通过扩展外部库来使其工作,因此我能够提供自定义的 ClassLoader。原来,默认的 ClassLoader 是错误的。

此外,我还能够与 3rd 方工具开发人员取得联系并获得我需要的信息——称之为“社交反编译”。

现在一切正常。

于 2014-11-13T08:25:52.620 回答