所以我完成了我的应用程序编码以旋转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可以自动包含正确的版本号等.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)
| 归档时间: |
|
| 查看次数: |
8684 次 |
| 最近记录: |