JAI 供应商名称 == 空

2022-09-03 16:48:09

因此,我完成了应用程序编码以旋转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.");

它在该部分的第一行上爆炸,并显示以下消息:

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

答案 1

由于我花了相当多的时间来调试这个问题,我想我会在这里分享我的解决方案,尽管这个问题已经很老了。Srikanth的第二个链接特别有帮助。

错误原因

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

ImageReaderSpi 类不是对供应商名称进行硬编码,而是从 sun.media.imageioimpl.common.PackageUtil.getVendor() 获取供应商名称。这反过来又从罐子的清单中读取它。断续器通常,您链接到标准的jai-imageio packagage,因此Sun的供应商信息会被读取。但是,由于您正在制作一个胖jar文件,因此您替换了Sun的MANIFEST。MF与你自己的缺乏所需的信息。

溶液

在清单中包含以下行。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可以自动包含正确的版本号等。使用以下部分更新您的: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>

答案 2

我不得不使用这个ImageIO罐子。它像一个魅力一样工作。在这里找到它。


推荐