我们使用外部库来生成具有特定内容的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有什么问题吗?
有什么类路径问题吗?
我们非常感谢您的帮助!
暂无答案!
目前还没有任何答案,快来回答吧!