2013-05-11 2 views
0

Я работаю над Eclipse (Juno с JDK7), и программа работает (на Eclipse) отлично. Мои проблемные линии:Java-экспорт в jar-i/o проблемы

URL imageURL = new URL("http://www.idautomation.com/ocr-a-and-ocr-b-fonts/new_sizes_ocr.png"); 
RenderedImage img = ImageIO.read(imageURL); 
File outputfile = new File("saved.png"); 
ImageIO.write(img, "png", outputfile); 

Но когда я экспортировать проект в файл банки и попытаться запустить его через окно (7- 64 бит) в командной строке, появляется следующее сообщение об ошибке:

Exception in thread "main" java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: java.util.ServiceConfigurationError: javax.imageio.spi.ImageReaderSpi: Providercom.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReaderSpi could not be instantiated: java.lang.IllegalArgumentException: vendorName == null! 
     at java.util.ServiceLoader.fail(Unknown Source) 
     at java.util.ServiceLoader.access$100(Unknown Source) 
     at java.util.ServiceLoader$LazyIterator.next(Unknown Source) 
     at java.util.ServiceLoader$1.next(Unknown Source) 
     at javax.imageio.spi.IIORegistry.registerApplicationClasspathSpis(Unknow 
n Source) 
     at javax.imageio.spi.IIORegistry.<init>(Unknown Source) 
     at javax.imageio.spi.IIORegistry.getDefaultInstance(Unknown Source) 
     at javax.imageio.ImageIO.<clinit>(Unknown Source) 
     at SimpleQueueServiceSample.testOCR(SimpleQueueServiceSample.java:75) 
     at SimpleQueueServiceSample.main(SimpleQueueServiceSample.java:69) 
     ... 5 more 
Caused by: java.lang.IllegalArgumentException: vendorName == null! 
     at javax.imageio.spi.IIOServiceProvider.<init>(Unknown Source) 
     at javax.imageio.spi.ImageReaderWriterSpi.<init>(Unknown Source) 
     at javax.imageio.spi.ImageReaderSpi.<init>(Unknown Source) 
     at com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReaderSpi.<init>(CLibJPEGImageReaderSpi.java:80) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 

     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
     at java.lang.reflect.Constructor.newInstance(Unknown Source) 
     at java.lang.Class.newInstance0(Unknown Source) 
     at java.lang.Class.newInstance(Unknown Source) 
     ... 13 more 

Я также использую этот импорт:

import java.awt.image.RenderedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.URL; 
import javax.imageio.ImageIO; 

Пожалуйста, кто-нибудь знает проблему?

Заранее благодарен!

+1

'http: // www.MY_IMAGE.jpg' -> 404.Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

M8, это был всего лишь пример URL;), вы можете использовать любое изображение u want (jpg, png). – gran33

+0

Почему гнев ?! возьмите это изображение: http: //www.idautomation.com/ocr-a-and-ocr-b-fonts/new_sizes_ocr.png – gran33

ответ

1

Если вы экспортируете, используя «Runnable JAR file», тогда Eclipse добавит пользовательский код ClassLoader и пользовательский класс main в файл jar.

В то же время, похоже, вы установили некоторые расширения Image-IO в JDK - что-то обеспечивающее класс CLibJPEGImageReaderSpi. В моей системе (Ubuntu, JDK 1.7) такого класса нет, но JPEGImageReaderSpi. Часть CLib заставляет меня думать, что вы установили собственную библиотеку, которая выполняет чтение в формате JPEG.

Эти две части, похоже, создают проблемы. Решение. Попробуйте экспортировать в качестве простой банки, начиная вручную, предоставляя путь класса к командной строке. Если это работает, предоставьте оболочку оболочки, обеспечивающую путь classpath для более удобного использования.

EDIT погуглить вокруг, я нашел статью с именно этой проблемой:

https://www.java.net//node/695773

+0

Спасибо, это действительно проблема, и когда я создаю простую банку, это работает, но как: «начать вручную, предоставляя путь к классам в командной строке» – gran33

+0

Я имею в виду на командной строке что-то вроде 'java -classpath SOMETHING_SUITABLE my.qualified.classname.Here' –

1

Я думаю, я могу предоставить другое решение, как на этот вопрос, так как я получил эту ошибку несколько дней назад и, наконец, реши это.

  1. Вы можете проверить эту статью, здесь объяснил причину: Exception when trying to save images ==> Подводя итог, необходимый META-INF банку необходимо использовать не хватает, поэтому он не может найти «VENDER -Name "в MANIFEST.MF.

  2. В результате я использую MAVEN для создания требуемой исполняемой банки вместо использования Eclipse для ее создания. Как? Вы можете написать pom.xml для его достижения и не забудьте использовать «maven-assembly-plugin» для создания требуемого файла MANIFEST.MF в файле jar. Это ключевой шаг. И я также могу дать вам образец (pom.xml) для нее:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>xxxProject</groupId> 
    <artifactId>xxxProject</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <repositories> 
        <repository> 
         <id>oss.sonatype.org</id> 
         <name>Sonatype Snapshot Repository</name> 
         <url>https://oss.sonatype.org/content/repositories/snapshots</url> 
         <releases> 
          <enabled>false</enabled> 
         </releases> 
         <snapshots> 
          <enabled>true</enabled> 
         </snapshots> 
        </repository> 
    </repositories> 
    <build> 
        <sourceDirectory>src</sourceDirectory> 
        <resources> 
         <resource> 
          <directory>src</directory> 
          <excludes> 
           <exclude>**/*.java</exclude> 
          </excludes> 
         </resource> 
        </resources> 
        <plugins> 
         <plugin> 
          <artifactId>maven-compiler-plugin</artifactId> 
          <version>3.3</version> 
          <configuration> 
           <source>1.8</source> 
           <target>1.8</target> 
          </configuration> 
         </plugin> 
         <plugin> 
          <groupId>org.apache.maven.plugins</groupId> 
          <artifactId>maven-assembly-plugin</artifactId> 
          <configuration> 
           <descriptorRefs> 
            <descriptorRef>jar-with-dependencies</descriptorRef> 
           </descriptorRefs> 
           <archive> 
            <manifest> 
             <mainClass>com.demo.Main</mainClass> 
             <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
             <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> 
            </manifest> 
            <manifestEntries> 
             <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor> 
             <Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor> 
            </manifestEntries> 
           </archive> 
          </configuration> 
          <executions> 
           <execution> 
            <id>create-my-bundle</id> 
            <phase>package</phase> 
            <goals> 
             <goal>single</goal> 
            </goals> 
           </execution> 
          </executions> 
         </plugin> 
        </plugins> 
    </build> 
    <dependencies> 
        <dependency> 
         <groupId>org.json</groupId> 
         <artifactId>json</artifactId> 
         <version>20151123</version> 
        </dependency> 
    </dependencies> 
    

Таким образом, наиболее важной частью является:

<manifestEntries> 
         <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor> 
         <Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor> 
        </manifestEntries> 

Это означает, что специалист добавит требуемую META-INFO для вас в банке, чтобы вы могли решить эту проблему.

Все. Надеюсь, эта информация поможет вам. =)

Смежные вопросы