2013-03-11 4 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) 

б) 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

это работает, если вы используете отдельные JARs на пути к классам, а не один JAR в сочетании с FatJar? Если да, сравните манифест вашего исполняемого JAR с манифестами ImageIO JAR. Документация плагина Fat-Jar Eclipse утверждает, что «файлы манифеста объединены», но способ, которым это делается (или нет), может быть причиной вашей проблемы. – ctrueden

ответ

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. Я обнаружил, что включил jai_imageio в банку и не модифицировал файл манифеста, чтобы включить содержимое файла манифеста JAI или объединить файлы в папке служб META-INF в вашей сборке, тогда у меня было несколько ошибок, похожих на ваши , Мое приложение действительно работало, но без JAI, включенного с момента установки JAI локально, я решил построить его с включенным JAI.

Открыв вас, вы найдете каталог под названием 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), чтобы заставить его работать. У меня была дополнительная проблема, когда некоторые из моих включенных банок были перезаписи файлов в папке сервисов META-INF. Вместо этого я объединил эти файлы, используя плагин Maven's Shade.

+0

Большое спасибо за помощь. Это решило мою проблему так хорошо. Однако вместо файлов с указанными выше конфигурациями может быть папка и набор файлов. Я удалил папку Meda-INF, и она сработала. – Soley

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> 
Смежные вопросы