TwelveMonkeys ImageIO 在使用 OpenJDK8 构建到 jar 后无法正常工作

TwelveMonkeys ImageIO is not working after build in to jar with OpenJDK8

我目前正在使用这个库向我的程序添加额外的功能: https://haraldk.github.io/TwelveMonkeys/ TwelveMonkeys ImageIO.

它在编辑器 - Intellij IDEA 2020.1.1 中运行良好,但是当我将项目构建到 jar 中时它无法运行。

错误:

Exception in thread "main" javax.imageio.IIOException: Unsupported Image Type
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1036)
        at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1007)
        at javax.imageio.ImageIO.read(ImageIO.java:1462)
        at javax.imageio.ImageIO.read(ImageIO.java:1309)

此错误表明使用了内部 java imageio,而不是来自 TwelveMonkeys。我曾尝试在模块中设置优先级,但这也没有帮助:

Modules Artifacts

Java版本:

java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (Zulu 8.46.0.19-CA-win64) (build 1.8.0_252-b14)

@haraldK 感谢您的回答。我花了几天时间才真正弄清楚,但现在它正在工作。对我所做的一些解释:

  1. 转移到Maven项目
  2. 添加到 pom.xml 所有依赖项
  3. 添加maven-shade-plugin
  4. 使用了两个变压器:ServicesResourceTransformerManifestResourceTransformer

我也为此苦苦挣扎了一段时间,在应用 AstroCool 建议的解决方案后,尽管 POM 文件中有 batik-transcoder 和 imageio-batik 依赖项,但我的 JAR 文件仍然无法读取 SVG 文件。

因此,对于其他为此苦苦挣扎的人,这里有一些关于如何应用 maven-shade-plugin 及其转换器以及需要哪些依赖项才能正常工作的解释。

首先,我使用了过时的依赖项,因为我使用的是 IntelliJ 的搜索功能,由于某种原因,它只找到了 TwelveMonkeys 的旧版本 batik-transcoder 和 imageio-batik。

下面是我目前在项目的 POM 文件中使用的依赖项:

        <dependency>
        <groupId>org.apache.xmlgraphics</groupId>
        <artifactId>batik-transcoder</artifactId>
        <version>1.14</version>
    </dependency>
    <dependency>
        <groupId>com.twelvemonkeys.imageio</groupId>
        <artifactId>imageio-batik</artifactId> <!-- svg -->
        <version>3.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.twelvemonkeys.imageio</groupId>
        <artifactId>imageio-tga</artifactId>
        <version>3.8.1</version>
    </dependency>

请注意,您始终可以在此处使用搜索功能找到这些的最新版本:https://mvnrepository.com/

要使用 maven-shade-plugin,请将这些应用到 POM 文件的 'plugins' 部分:

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
                </transformers>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

最后,如果您进行了许多更改和添加,最好清理您的项目,在 IntelliJ 中,您可以通过单击文件 -> 使 Chaches 无效来完成此操作

之后单击构建 -> 重建项目,然后构建新的 JAR 文件。如果您仍然遇到问题,可能值得在重建项目后创建一个新的工件(如果使用 intelliJ)。