JAI vendorname == null

Rob*_*ert 14 java jai

所以我完成了我的应用程序编码以旋转TIFF图像,这需要JAI来操纵TIFF.

它在Eclipse下工作时工作正常,但每当我为库构建一个胖jar然后创建一个实现它(根据http://fjep.sourceforge.net/fjeptutorial.html),当我执行java -jar Push时. jar\path\to\_dir,它一直运行直到它到达压缩和保存的部分:

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.");
Run Code Online (Sandbox Code Playgroud)

它会在该部分的第一行显示消息:

 Exception in thread "main" java.lang.IllegalArgumentException: vendorName == null!
 ....rest of stack trace.
Run Code Online (Sandbox Code Playgroud)

Qua*_*um7 28

由于我花了相当多的时间来调试这个问题,我想我会在这里分享我的解决方案,尽管问题的年代.Srikanth的第二个链接特别有用.

错误原因

JAI需要一些供应商名称用于其深层内部,特别是javax.imageio.spi.IIOServiceProvider,它被许多(所有?)图像阅读器用于它们的低级IO.字符串是什么并不挑剔,但它不能为空.

ImageReaderSpi类不是硬编码供应商名称,而是从sun.media.imageioimpl.common.PackageUtil.getVendor()获取供应商名称.这反过来从jar的MANIFEST.MF读取它.通常,您会链接到标准的jai-imageio packagage,因此Sun的供应商信息会被读取.但是,由于您正在创建一个胖jar文件,因此您将Sun的MANIFEST.MF替换为您自己的缺少所需信息的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>
Run Code Online (Sandbox Code Playgroud)


Scr*_*ail 5

我不得不使用这个ImageIO jar。它就像一个魅力。在这里找到