JAI vendorname == ноль - PullRequest
       37

JAI vendorname == ноль

14 голосов
/ 13 августа 2011

Итак, я закончил кодировать свое приложение для поворота изображений TIFF, что требовало JAI для манипулирования файлами TIFF.

Он отлично работает при работе в Eclipse, но всякий раз, когда я создаю толстый флягу для библиотеки, а затем создаю один, реализующий это (для http://fjep.sourceforge.net/fjeptutorial.html),, когда я делаю java -jar Push.jar \ path \ to \ Дир, он работает, пока не достигнет той части, где он сжимается и сохраняет:

TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi();
ImageWriter writer = tiffspi.createWriterInstance();
//Iterator<ImageWriter> iter =  ImageIO.getImageWritersByFormatName("TIFF");
//ImageWriter writer = iter.next();

ImageWriteParam param2 = writer.getDefaultWriteParam();
param2.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

param2.setCompressionType("LZW");
param2.setCompressionQuality(0.0f);
File fOutputFile = workArea[i];
ImageOutputStream ios = ImageIO.createImageOutputStream(fOutputFile);
writer.setOutput(ios);

if (frontPage == 1)
{
     writer.write(null, new IIOImage(pg1, null, null), param2);
     writer.writeInsert(-1, new IIOImage(pg2, null, null), param2);
}
else if (frontPage == 2)
{
     writer.write(null, new IIOImage(pg2, null, null), param2);
     writer.writeInsert(-1, new IIOImage(pg1, null, null), param2);
}

remaining = remaining - 1;
    if (remaining > 0)
     System.out.println(remaining + " remaining.");
else
     System.out.println("Done.");

В первой строке этого раздела всплывает сообщение:

 Exception in thread "main" java.lang.IllegalArgumentException: vendorName == null!
 ....rest of stack trace.

Ответы [ 6 ]

26 голосов
/ 28 августа 2013

Поскольку я потратил значительное количество времени на отладку этой проблемы, я подумал, что поделюсь своим решением здесь, несмотря на возраст вопроса. Вторая ссылка Сриканта была особенно полезна.

Причина ошибки

JAI требуется имя поставщика для некоторых из его внутренних глубин, в частности javax.imageio.spi.IIOServiceProvider, который используется многими (всеми?) Программами чтения изображений для их низкоуровневого ввода-вывода. Строка не очень требовательна, но не может быть нулевой.

Вместо того, чтобы жестко кодировать имя поставщика, класс ImageReaderSpi получает имя поставщика от sun.media.imageioimpl.common.PackageUtil.getVendor (). Это, в свою очередь, читает его из файла MANIFEST.MF банку . Обычно вы ссылаетесь на стандартную упаковку jai-imageio, поэтому информация о продавце Sun читается. Однако, поскольку вы создаете толстый файл jar, вы заменили файл Sun MANIFEST.MF своим собственным, в котором отсутствует необходимая информация.

Решение

Включите следующие строки в файл MANIFEST.MF:

Specification-Title: Java Advanced Imaging Image I/O Tools
Specification-Version: 1.1
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: com.sun.media.imageio
Implementation-Version: 1.1
Implementation-Vendor: Sun Microsystems, Inc.

Значения для каждого свойства могут быть любыми (я использовал мое конкретное приложение / версию / компанию), если все шесть определены.

Maven

Если вы использовали плагин сборки maven для создания своей толстой фляги, maven может автоматически включать правильные номера версий и тому подобное. Обновите ваш pom.xml следующим разделом <archive>:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
            <manifestEntries>
                <Specification-Vendor>MyCompany</Specification-Vendor>
                <Implementation-Vendor>MyCompany</Implementation-Vendor>
            </manifestEntries>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>create-my-bundle</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
4 голосов
/ 05 декабря 2011

Мне пришлось использовать этот ImageIO jar .Оно работало завораживающе.Нашел здесь .

3 голосов
/ 04 января 2018

Принятый ответ Quantum7 объясняет источник проблемы, а в разделе Maven он предоставляет решение при использовании подключаемого модуля Maven Assembly для создания JAR-файла, включая зависимости. Если вместо этого вы используете плагин Maven Shade для создания JAR с зависимостями, конфигурация будет немного другой. Вы можете добавить что-то вроде следующего в раздел конфигурации плагина Shade в pom.xml:

<configuration>
    <transformers>
        <transformer
                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <manifestEntries>
                <Main-Class>com.conveyal.r5.R5Main</Main-Class>
                <Specification-Title>Java Advanced Imaging Image I/O Tools</Specification-Title>
                <Specification-Version>1.1</Specification-Version>
                <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
                <Implementation-Title>com.sun.media.imageio</Implementation-Title>
                <Implementation-Version>1.1</Implementation-Version>
                <Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor>
                <Extension-Name>com.sun.media.imageio</Extension-Name>
            </manifestEntries>
        </transformer>
    </transformers>
</configuration>
1 голос
/ 15 июля 2016

(Был бы комментарий к ответу Quantum7, если бы у меня было достаточно репутации)

Я столкнулся с той же проблемой.Ответ Quantum7 спас день!Однако, после добавления манифестов Entity Specification-Vendor и реализации-Vendor, выполнение моего толстого фляги все еще не удавалось, за исключением ниже.Обратите внимание, что

версия == null!

not

vendorName == null!

java.util.ServiceConfigurationError: javax.imageio.spi.ImageReaderSpi: Provider com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReaderSpi could not be instantiated
        at java.util.ServiceLoader.fail(Unknown Source)
        at java.util.ServiceLoader.access$100(Unknown Source)
        at java.util.ServiceLoader$LazyIterator.nextService(Unknown Source)
        at java.util.ServiceLoader$LazyIterator.next(Unknown Source)
        at java.util.ServiceLoader$1.next(Unknown Source)
        at javax.imageio.spi.IIORegistry.registerApplicationClasspathSpis(Unknown Source)
        at javax.imageio.spi.IIORegistry.<init>(Unknown Source)
        at javax.imageio.spi.IIORegistry.getDefaultInstance(Unknown Source)
        at javax.imageio.ImageIO.<clinit>(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: version == null!
        at javax.imageio.spi.IIOServiceProvider.<init>(Unknown Source)
        at javax.imageio.spi.ImageReaderWriterSpi.<init>(Unknown Source)
        at javax.imageio.spi.ImageReaderSpi.<init>(Unknown Source)
        at com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReaderSpi.<init>(CLibJPEGImageReaderSpi.java:80)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at java.lang.Class.newInstance(Unknown Source)
        ... 14 more

Введенные в manifestEntries ниже исправили это.

<manifestEntries>
    <Specification-Title>Java Advanced Imaging Image I/O Tools</Specification-Title>
    <Specification-Version>1.1</Specification-Version>
    <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
    <Implementation-Title>com.sun.media.imageio</Implementation-Title>
    <Implementation-Version>1.1</Implementation-Version>
    <Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor>
</manifestEntries>

При запуске толстой банки я убедился, что ни одно из трех значений в приведенном ниже коде не равно нулю.

import com.sun.media.imageioimpl.common.PackageUtil;

public class ManifestCheck {
    public static void main(String[] args) {
        System.out.println(PackageUtil.getVendor());
        System.out.println(PackageUtil.getVersion());
        System.out.println(PackageUtil.getSpecificationTitle());
    }
}
1 голос
/ 14 июня 2016

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

Проблема, с которой я столкнулся, была немного другой, я получал ошибку "ClassNotFound" при попытке запустить скомпилированный файл JAR.Я столкнулся с этим ТАКИМ вопросом во время исследования, поэтому для тех, кто следовал по тому же пути, что и я, вот, пожалуйста.

Возможное решение ошибки ClassNotFound

Тем, кто может найти этот вопрос позжеЕсли, кажется, ничего не работает, попробуйте подключить плагин Apache Shader для Maven. Здесь содержит дополнительную информацию.

Я недостаточно опытен, чтобы рассказать вам , как это делает, но Apache Shader упаковывает все используемыезависимости в вашем проекте в окончательный JAR-файл, так что все зависимости будут включены в папку META-INF при сборке.Это увеличивает размер файла jar (в зависимости от того, сколько библиотек вы использовали в своем проекте), но также исправляет jar, который не может найти классы из сторонних используемых библиотек.

Для использованияПлагин Shader, добавьте следующее в ваш POM.Я включил его после тега зависимостей и перед тегом свойств.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>com.package.name.className</Main-Class>
                                    <Build-Number>1</Build-Number>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

ПРИМЕЧАНИЕ : убедитесь, что вы изменили имя пакета и класса, чтобы отразить пакет вашего проектаи имена классов.

Другие полезные ссылки: Подобный вопрос переполнения стека

1 голос
/ 13 августа 2011

Это может помочь вам решить проблему.

Как запустить jai-imageio с исходным кодом

vendorName == null

...