serviceloader的工作方式不同

yyhrrdl8  于 2021-06-27  发布在  Java
关注(0)|答案(0)|浏览(336)

我们使用外部库来生成具有特定内容的pdf文件。只要我们在ide中以java程序的形式运行它,一切都能正常工作。但是,当我们用maven程序集插件构建一个jar,然后尝试将其作为jar应用程序运行时,就会出现问题。
事情是这样的。首先,pom.xml中包含两个依赖项:

<dependency>
    <groupId>ch.codeblock.qrinvoice.core</groupId>
    <artifactId>qrinvoice-core</artifactId>
    <version>1.11</version>
</dependency>
<dependency>
    <groupId>ch.codeblock.qrinvoice.openpdf</groupId>
    <artifactId>qrinvoice-openpdf</artifactId>
    <version>1.11</version>
</dependency>

当我们现在调试到问题点时,我们可以看到,他们使用 ServiceLoader 要加载可能的服务提供程序。。。

public <T extends Service<?>> List<T> getAll(final Class<T> interfaceType) {
    final List<T> allServiceProviders = new LinkedList<>();
    ServiceLoader.load(interfaceType).iterator().forEachRemaining(allServiceProviders::add);
    return allServiceProviders;
}

... 它将用普通java程序加载3个可能的服务提供者:

allServiceProviders = {LinkedList@1397}  size = 3
 0 = {JavaGraphicsOutputWriterFactory@1403} 
 1 = {SvgOutputWriterFactory@1404} 
 2 = {IText4OutputWriterFactory@1405} "IText4OutputWriterFactory"

... 但从jar启动时只加载2个可能的服务提供者:

allServiceProviders = {LinkedList@1397}  size = 2
 0 = {JavaGraphicsOutputWriterFactory@1403} 
 1 = {SvgOutputWriterFactory@1404}

现在的问题是,只有itext4outputwriterfactory将打印pdf,因此,从jar运行不起作用。
深入查看依赖关系可以发现,这个类位于第二个jar中:
第一罐:

第二罐:

但是所有的类都包含在jar中,还有 ServiceProvider ,其中包括 getAll() -方法:
组装罐:

那么,这里有什么问题?
我们造jar有什么问题吗?
有什么类路径问题吗?
我们非常感谢您的帮助!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题