TwelveMonkeys 3.1.1 || 3.1.2 не работает с плагином maven-dependency-plugin
Я пытаюсь использовать TwelveMonkeys в своем приложении для генерации миниатюр. Также я использую maven-dependency-plugin
распаковать все зависимости и создать банку FAT. Тем не менее, плагин работает довольно хорошо в обычных сценариях, но просто не работает, когда используется с плагином 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)
Если кто-нибудь имеет представление о том, как можно решить, пожалуйста, укажите.
1 ответ
Подводя итог, для будущих читателей проблема состоит в том, что каждый JAR плагина ImageIO содержит несколько ресурсов в 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.
Для интересующихся вы можете прочитать больше о механизме интерфейса поставщика услуг и ServiceRegistry
класс в частности.
Когда вы распаковываете все файлы JAR в одну папку, они будут перезаписаны для каждого JAR. Вместо этого ресурсы с одинаковым именем должны быть объединены в новый единый ресурс.
Плагин Maven Shade предоставляет решение для этого, см. Ресурсные преобразователи, особенно ServicesResourceTransformer.