2013-03-11 62 views
1

启动我的Java应用程序时,尝试保存图像时出现异常。然而,在Eclipse中,一切正常。该应用程序使用fatjar构建,并且已经选择了用于导出的必要库(jar_imageio.jar和ij.jar)。尝试保存图像时出现异常

我尝试使用的ImageIO和ImageJ的:

一)的ImageIO:

ImageIO.write(image, "jpg", new File(f)); 


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! 
    at sun.misc.Service.fail(Unknown Source) 
    at sun.misc.Service.access$200(Unknown Source) 
    at sun.misc.Service$LazyIterator.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) 

B)的ImageJ:

IJ.saveAs(image, "jpg", f); 
java.lang.NoClassDefFoundError: Could not initialize class javax.imageio.ImageIO 

    at ij.plugin.JpegWriter.saveAsJpeg(JpegWriter.java:49) 
    at ij.plugin.JpegWriter.save(JpegWriter.java:28) 
    at ij.io.FileSaver.saveAsJpeg(FileSaver.java:340) 
    at ij.io.FileSaver.saveAsJpeg(FileSaver.java:332) 
    at ij.plugin.filter.Writer.run(Writer.java:24) 
    at ij.plugin.filter.PlugInFilterRunner.processOneImage(PlugInFilterRunner.java:256) 
    at ij.plugin.filter.PlugInFilterRunner.<init>(PlugInFilterRunner.java:105) 
    at ij.IJ.runPlugIn(IJ.java:158) 
    at ij.Executer.runCommand(Executer.java:127) 
    at ij.Executer.run(Executer.java:64) 
    at ij.IJ.run(IJ.java:249) 
    at ij.IJ.run(IJ.java:296) 
    at ij.IJ.saveAs(IJ.java:1579) 
+0

请问,如果你使用的类路径上的JAR分开,而不是一个JAR与fatjar结合工作?如果是这样,请将可执行JAR的清单与ImageIO JAR的清单进行比较。 Fat-Jar Eclipse插件文档声称“Manifest-files被合并”,但是这种做法(或不做)可能是造成问题的原因。 – ctrueden 2013-03-12 14:14:05

回答

2

由于@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! 

我有t他的问题就在昨天,这很棘手。还有类似的问题here。我发现如果我在jar中包含jai_imageio,并且没有修改清单文件以包含JAI清单文件的内容,或者将META-INF的services文件夹中的文件合并到您的版本中,那么我的错误类似于您的。我的应用程序确实工作,但没有包括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文件覆盖了META-INF的services文件夹中的文件。相反,我使用Maven的Shade插件合并了这些文件。

+0

非常感谢您的帮助。它很好地解决了我的问题。但是,可能有一个文件夹和一组文件,而不是具有上述配置的文件。我删除了Meda-INF文件夹,它工作。 – Soley 2015-10-30 15:56:15

0

添加此行到build.xml文件(解决了我)

<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> 
相关问题