TwelveMonkeys 3.1.1 || 3.1.2无法使用maven-dependency-plugin

问题描述 投票:2回答:1

我正在尝试在应用程序中使用TwelveMonkeys处理缩略图的生成。另外,我正在使用maven-dependency-plugin解压缩所有依赖项并创建FAT jar。虽然,插件在正常情况下可以很好地工作,但是与maven-dependency-plugin一起使用时根本无法工作。这是我的POM XML:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.prakhar</groupId>
    <artifactId>demo</artifactId>
    <name>demo</name>

    <packaging>jar</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <organization>
        <!-- Used as the 'Vendor' for JNLP generation -->
        <name>Your Organisation</name>
    </organization>

    <properties>
        <slf4j.version>1.6.1</slf4j.version>
    </properties>

    <build>
        <plugins>

            <plugin>
                <!-- Get the dependencies jar files to a common place, for jar signing -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>unpack-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- <includeArtifactIds>commons-net,imageio-bmp,imageio-jpeg,imageio-tiff,imageio-pnm,imageio-psd,imageio-iff,imageio-pcx,imageio-pict,imageio-sgi,imageio-tga,imageio-icns,imageio-thumbsdb,imageio-core,imageio-metadata,common-lang,common-io,common-image</includeArtifactIds> -->
                            <outputDirectory>${project.build.directory}/classes</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>


    <dependencies>

        <!-- MigLayout -->



        <!-- Apache Commons -->

        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

        <!-- Logging  -->

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>

        <!-- Twelve Monkeys dependencies -->
        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-bmp</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-jpeg</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-tiff</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-pnm</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-psd</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-iff</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-pcx</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-pict</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-sgi</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-tga</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-icns</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.twelvemonkeys.imageio</groupId>
            <artifactId>imageio-thumbsdb</artifactId>
            <version>3.1.1</version>
        </dependency>

    </dependencies>

</project>

而且,这是我的功能:

private static void convertToJpg(File file) {
    try {
        BufferedImage image = ImageIO.read(file);

        int width = 300, height = 200; // new width/height

        BufferedImageOp resampler = new ResampleOp(width, height, ResampleOp.FILTER_LANCZOS); // A good default filter, see class documentation for more info
        BufferedImage thumbnailImg = resampler.filter(image, null);

        FileImageOutputStream fios = new FileImageOutputStream(new File(file.getAbsolutePath() + ".png"));

        if (!ImageIO.write(thumbnailImg, "PNG", fios)) {
            System.out.println("ERROR: Unable to convert image " + file.getAbsolutePath());
        } else {
            System.out.println("SUCCESS: Image " + file.getAbsolutePath() + ".png converted successfully");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这里是我得到的例外:

java.lang.NullPointerException: Input == null
    at com.twelvemonkeys.image.ResampleOp.filter(Unknown Source)

如果有人对如何解决有任何想法,请说明。

java maven-dependency-plugin twelvemonkeys
1个回答
3
投票

总结起来,对于将来的读者来说,问题在于每个ImageIO插件JAR在META-INF/services下都包含多个资源。这些资源是自动发现ImageIO插件所必需的。它们是:

META-INF/services/javax.imageio.spi.ImageReaderSpi
META-INF/services/javax.imageio.spi.ImageWriterSpi
META-INF/services/javax.imageio.spi.ImageInpuStreamSpi
META-INF/services/javax.imageio.spi.ImageOutputStreamSpi

可能还有更多,但TwelveMonkeys并未使用这些。

有兴趣的人,您可以阅读有关Service Provider Interface机制,尤其是ServiceRegistry类的更多信息。

当您将所有JAR文件解压缩到一个文件夹时,每个JAR文件都将覆盖这些文件。相反,需要将具有相同名称的资源合并到新的单个资源中。

ServiceRegistry提供了解决方案,请参阅资源转换器,尤其是Maven Shade plugin

© www.soinside.com 2019 - 2024. All rights reserved.