2

Java アプリケーションを起動すると、画像を保存しようとすると例外が発生します。ただし、Eclipse では、すべて正常に動作します。アプリケーションは fatjar を使用して構築され、必要なライブラリ (jar_imageio.jar および ij.jar) もエクスポート用に選択されています。

ImageIO と ImageJ を使ってみました:

a.) イメージIO:

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

2 に答える 2

3

@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 の 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 することができます。含まれているjarの一部がMETA-INFのサービスフォルダー内のファイルを上書きするという追加の問題がありました。代わりに、Maven の Shade プラグインを使用してこれらのファイルをマージしました。

于 2013-03-12T14:52:56.020 に答える