1

我们使用外部库来生成具有某些特定内容的 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 时有什么问题吗?
  • 是否存在某种类路径问题?

我们感谢您的任何帮助!

4

0 回答 0