我们使用外部库来生成具有某些特定内容的 pdf 文件。只要我们在 IDE 中将它作为 java 程序运行,一切都会按预期运行。但是,当我们使用 maven-assembly-plugin 构建一个 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 个可能的 ServiceProvider:
allServiceProviders = {LinkedList@1397} size = 2
0 = {JavaGraphicsOutputWriterFactory@1403}
1 = {SvgOutputWriterFactory@1404}
现在的问题是,只有 IText4OutputWriterFactory 会打印 pdf,因此从 JAR 运行不起作用。
对依赖项的深入了解表明,这个类在第二个 jar 中:
第一个罐子:

第二个罐子:

但是所有的类都包含在 jar 中,还有ServiceProvider包含getAll()-method 的 class :
组装罐:

那么,这可能是什么问题?
- 我们在构建 JAR 时有什么问题吗?
- 是否存在某种类路径问题?
我们感谢您的任何帮助!