Java 尝试保存图像时出现异常

Java 尝试保存图像时出现异常,java,jar,javax.imageio,imagej,Java,Jar,Javax.imageio,Imagej,启动Java应用程序时,在尝试保存图像时会出现异常。然而,在Eclipse中,一切都很好。该应用程序是使用fatjar构建的,并选择了必要的库(jar_imageio.jar和ij.jar)进行导出 我尝试使用ImageIO和ImageJ: a、 )图像IO: ImageIO.write(图像,“jpg”,新文件(f)); 线程“main”sun.misc.ServiceConfigurationError中出现异常: javax.imageio.spi.ImageWriterSpi: 提供商c

启动Java应用程序时,在尝试保存图像时会出现异常。然而,在Eclipse中,一切都很好。该应用程序是使用fatjar构建的,并选择了必要的库(jar_imageio.jar和ij.jar)进行导出

我尝试使用ImageIO和ImageJ:

a、 )图像IO:

ImageIO.write(图像,“jpg”,新文件(f));
线程“main”sun.misc.ServiceConfigurationError中出现异常:
javax.imageio.spi.ImageWriterSpi:
提供商com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterSpi
无法实例化:java.lang.IllegalArgumentException:vendorName==null!
在sun.misc.Service.fail时(未知源)
在sun.misc.Service.access获得$200(未知来源)
在sun.misc.Service$LazyIterator.next(未知源)
位于javax.imageio.spi.IIORegistry.registerApplicationClasspathSpis(未知源)
位于javax.imageio.spi.IIORegistry。(未知来源)
位于javax.imageio.spi.IIORegistry.getDefaultInstance(未知源)
位于javax.imageio.imageio。(未知源)
b、 )图J:

IJ.saveAs(图像,“jpg”,f);
java.lang.NoClassDefFoundError:无法初始化类javax.imageio.imageio
位于ij.plugin.JpegWriter.saveAsJpeg(JpegWriter.java:49)
在ij.plugin.JpegWriter.save(JpegWriter.java:28)
在ij.io.FileSaver.saveAsJpeg(FileSaver.java:340)
在ij.io.FileSaver.saveAsJpeg(FileSaver.java:332)
在ij.plugin.filter.Writer.run(Writer.java:24)
位于ij.plugin.filter.PlugInFilterRunner.processOneImage(PlugInFilterRunner.java:256)
在ij.plugin.filter.PlugInFilterRunner上。(PlugInFilterRunner.java:105)
在ij.ij.runPlugIn(ij.java:158)
在ij.Executer.runCommand(Executer.java:127)
在ij.Executer.run(Executer.java:64)
运行(ij.java:249)
运行(ij.java:296)
在ij.ij.saveAs(ij.java:1579)

正如@Victor所说,我想你应该看看

Exception in thread "main" sun.misc.ServiceConfigurationError: 
javax.imageio.spi.ImageWriterSpi: 
Provider com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterSpi 
could not be instantiated: java.lang.IllegalArgumentException: vendorName == null!
就在昨天,我遇到了这个问题,这很棘手。也有类似的问题。我发现,如果我在jar中包含jai_imageio,并且没有修改清单文件以包含jai清单文件的内容,或者在您的构建中合并META-INF的服务文件夹中的文件,那么我有许多类似于您的错误。我的应用程序在没有包含JAI的情况下也能正常工作,因为JAI是本地安装的,所以我选择在包含JAI的情况下构建它

打开jar,您会发现一个名为META-INF的目录,其中有MANIFEST.MF文件。我使用Maven在清单文件中包含JAI内容,因此

Manifest-Version: 1.0
Implementation-Title: com.sun.media.imageio
Implementation-Version: 1.0_01
Built-By: myName
Specification-Vendor: Sun Microsystems, Inc.
Created-By: Apache Maven
Implementation-Vendor: Sun Microsystems, Inc.
Build-Jdk: 1.6.0_43
Specification-Title: Java Advanced Imaging Image I/O Tools
Specification-Version: 1.0-mr
Extension-Name: com.sun.media.imageio
Main-Class: myMain
Archiver-Version: Plexus Archiver

你应该在那里替换你的名字和你的主类。如果不使用Maven(或Ant)使其工作,您可以修改这个文件并自己在命令行上对其进行jar。我有一个额外的问题,我包含的一些JAR覆盖了META-INF服务文件夹中的文件。相反,我使用Maven的Shade插件合并了这些文件

将这些行添加到build.xml中(为我解决)



如果在类路径上使用单独的JAR,而不是将一个JAR与fatjar组合使用,那么它是否有效?如果是这样,请将可执行JAR的清单与ImageIO JAR的清单进行比较。Fat Jar Eclipse插件文档声称“清单文件被合并”,但这样做(或不这样做)的方式可能是问题的原因。非常感谢您的帮助。它很好地解决了我的问题。但是,可能存在一个文件夹和一组文件,而不是具有上述配置的文件。我删除了Meda INF文件夹,它成功了。
Exception in thread "main" sun.misc.ServiceConfigurationError: 
javax.imageio.spi.ImageWriterSpi: 
Provider com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterSpi 
could not be instantiated: java.lang.IllegalArgumentException: vendorName == null!
Manifest-Version: 1.0
Implementation-Title: com.sun.media.imageio
Implementation-Version: 1.0_01
Built-By: myName
Specification-Vendor: Sun Microsystems, Inc.
Created-By: Apache Maven
Implementation-Vendor: Sun Microsystems, Inc.
Build-Jdk: 1.6.0_43
Specification-Title: Java Advanced Imaging Image I/O Tools
Specification-Version: 1.0-mr
Extension-Name: com.sun.media.imageio
Main-Class: myMain
Archiver-Version: Plexus Archiver
<manifest>
    <attribute name="Main-Class" value="${main.class}"/>
    <attribute name="Built-By" value="${user.name}" />
    <attribute name="Built-Date" value="${TODAY}" />                   
    <attribute name="Implementation-Title" value="MyApp" />
    <attribute name="Implementation-Vendor" value="MyCompany" />                
    <attribute name="Implementation-Version" value="${version.num}-b${build.number}"/>                              
</manifest>