JAI vendorname = = null

alors j'ai fini de coder mon application pour faire tourner les images TIFF ce qui nécessitait JAI pour manipuler les TIFFs.

cela fonctionne très bien lorsque je travaille sous Eclipse, mais chaque fois que je construis un gros bocal pour la bibliothèque et que je crée un implémentant cela (parhttp://fjep.sourceforge.net/fjeptutorial.html), quand je fais la java-jar Push.jar pathtodir, il court jusqu'à atteindre la partie où il comprime et sauve:

TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi();
ImageWriter writer = tiffspi.createWriterInstance();
//Iterator<ImageWriter> iter =  ImageIO.getImageWritersByFormatName("TIFF");
//ImageWriter writer = iter.next();

ImageWriteParam param2 = writer.getDefaultWriteParam();
param2.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

param2.setCompressionType("LZW");
param2.setCompressionQuality(0.0f);
File fOutputFile = workArea[i];
ImageOutputStream ios = ImageIO.createImageOutputStream(fOutputFile);
writer.setOutput(ios);

if (frontPage == 1)
{
     writer.write(null, new IIOImage(pg1, null, null), param2);
     writer.writeInsert(-1, new IIOImage(pg2, null, null), param2);
}
else if (frontPage == 2)
{
     writer.write(null, new IIOImage(pg2, null, null), param2);
     writer.writeInsert(-1, new IIOImage(pg1, null, null), param2);
}

remaining = remaining - 1;
    if (remaining > 0)
     System.out.println(remaining + " remaining.");
else
     System.out.println("Done.");
<!-Il explose sur le premier la ligne de cette section avec le message:

 Exception in thread "main" java.lang.IllegalArgumentException: vendorName == null!
 ....rest of stack trace.
11
demandé sur Robert 2011-08-13 20:02:09

6 réponses

comme j'ai passé beaucoup de temps à corriger ce problème, j'ai pensé que je partagerais ma solution ici, malgré l'âge de la question. Srikanth deuxième lien a été particulièrement utile.

Raison de l'erreur

JAI exige un nom de vendeur pour certains de ses intérieurs profonds, en particulier le javax.imageio.le spi.Ioserviceprovider qui est utilisé par beaucoup (tous?) des lecteurs d'image pour leur IO de bas niveau. Ce n'est pas difficile ce que la corde est, mais il ne peut pas être null.

plutôt que de coder le nom du vendeur, la classe ImageReaderSpi obtient le nom du vendeur de sun.Média.imageioimpl.commun.PackageUtil.getVendor (). Ce à son tour le lit dans le Manifeste du bocal.MF. Normalement, vous liez avec le Package Standard jai-imageio, donc les infos du vendeur de Sun sont lues. Cependant, puisque vous faites un gros fichier jar, vous avez remplacé le manifeste de Sun.MF avec votre propre qui n'a pas les information.

Solution

inclure les lignes suivantes dans votre manifeste.MF file:

Specification-Title: Java Advanced Imaging Image I/O Tools
Specification-Version: 1.1
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: com.sun.media.imageio
Implementation-Version: 1.1
Implementation-Vendor: Sun Microsystems, Inc.

les valeurs pour chaque propriété peuvent être n'importe quoi (j'ai utilisé mon application/version/entreprise spécifique), aussi longtemps que les six sont définis.

Maven

si vous utilisiez le plugin d'assemblage de maven pour créer votre fat jar, maven peut automatiquement inclure les numéros de version corrects et ainsi de suite. Mise à jour de votre pom.xml, avec <archive> section:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
            <manifestEntries>
                <Specification-Vendor>MyCompany</Specification-Vendor>
                <Implementation-Vendor>MyCompany</Implementation-Vendor>
            </manifestEntries>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>create-my-bundle</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
22
répondu Quantum7 2013-08-28 18:33:39

j'ai eu à utiliser ce ImageIO jar. Il a travaillé comme un charme. Trouvé ici.

3
répondu ScratchMyTail 2011-12-05 13:37:33

la réponse acceptée par Quantum7 explique la source du problème, et dans le Maven l'article, il propose une solution lors de l'utilisation de l'Maven Assembly plugin pour produire un BOCAL, y compris les dépendances. Si vous utilisez plutôt le plugin Maven Shade pour produire le JAR avec des dépendances, la configuration est légèrement différente. Vous pouvez ajouter quelque chose comme ceci à la section configuration du plugin Shade dans votre pom.xml:

<configuration>
    <transformers>
        <transformer
                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <manifestEntries>
                <Main-Class>com.conveyal.r5.R5Main</Main-Class>
                <Specification-Title>Java Advanced Imaging Image I/O Tools</Specification-Title>
                <Specification-Version>1.1</Specification-Version>
                <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
                <Implementation-Title>com.sun.media.imageio</Implementation-Title>
                <Implementation-Version>1.1</Implementation-Version>
                <Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor>
                <Extension-Name>com.sun.media.imageio</Extension-Name>
            </manifestEntries>
        </transformer>
    </transformers>
</configuration>
3
répondu abyrd 2018-01-04 14:12:06

ceux-ci peuvent vous aider à résoudre le problème.

comment exécuter jai-imageio avec le code source

vendorName = = null

1
répondu Srikanth Venkatesh 2011-08-13 16:11:11

DISCLAIMER

le problème que j'avais était légèrement différent, j'ai eu l'erreur "ClassNotFound" en essayant d'exécuter un fichier JAR compilé. Je suis arrivé sur cette question en faisant des recherches, donc pour les autres qui ont suivi la même piste que moi, voilà.

solution Possible à L'erreur ClassNotFound

Pour ceux qui trouve cette question plus tard, si rien d'autre ne semble fonctionner, Vous pouvez essayer d'utiliser le Apache Shader plugin pour Maven. Ici plus d'information sur elle.

je ne suis pas assez expérimenté pour être en mesure de vous dire comment il le fait, mais Apache Shader empaquette toutes les dépendances utilisées dans votre projet dans le fichier final jar, de sorte que toutes les dépendances sont incluses dans le dossier META-INF quand il est compilé. Cela augmente la taille du fichier jar (en fonction du nombre de bibliothèques que vous avez utilisées dans votre projet), mais semble également corriger le jar ne pouvant pas trouvez les classes des bibliothèques externes qui sont utilisées.

pour utiliser le plugin Shader, ajoutez ce qui suit à votre POM. Je l'ai inclus après la balise dependencies et avant la balise properties.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>com.package.name.className</Main-Class>
                                    <Build-Number>1</Build-Number>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

NOTE: assurez-vous de changer le paquet et le nom de la classe pour refléter le paquet et le nom de la classe de votre projet.

Autres liens utiles: question semblable de débordement de la pile

1
répondu Scrambo 2017-05-23 12:02:43

(Aurait été un commentaire sur Quantum7 réponse si j'avais assez de réputation)

j'ai rencontré le même problème. La réponse de Quantum7 a sauvé la journée! Après avoir mis dans la spécification de manifestes-vendeur et la mise en œuvre-vendeur, cependant, l'exécution de mon pot de graisse a encore échoué avec l'exception ci-dessous. Remarque il est

version = = null!

nom du vendeur == nul!

java.util.ServiceConfigurationError: javax.imageio.spi.ImageReaderSpi: Provider com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReaderSpi could not be instantiated
        at java.util.ServiceLoader.fail(Unknown Source)
        at java.util.ServiceLoader.access0(Unknown Source)
        at java.util.ServiceLoader$LazyIterator.nextService(Unknown Source)
        at java.util.ServiceLoader$LazyIterator.next(Unknown Source)
        at java.util.ServiceLoader.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)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: version == 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.newInstance(Unknown Source)
        ... 14 more

mise en manifestes en dessous fixé.

<manifestEntries>
    <Specification-Title>Java Advanced Imaging Image I/O Tools</Specification-Title>
    <Specification-Version>1.1</Specification-Version>
    <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
    <Implementation-Title>com.sun.media.imageio</Implementation-Title>
    <Implementation-Version>1.1</Implementation-Version>
    <Implementation-Vendor>Sun Microsystems, Inc.</Implementation-Vendor>
</manifestEntries>

lors de l'exécution du fat jar, je me suis assuré qu'aucune des trois valeurs du code ci-dessous n'est nulle.

import com.sun.media.imageioimpl.common.PackageUtil;

public class ManifestCheck {
    public static void main(String[] args) {
        System.out.println(PackageUtil.getVendor());
        System.out.println(PackageUtil.getVersion());
        System.out.println(PackageUtil.getSpecificationTitle());
    }
}
1
répondu Nan Zhong 2016-07-15 07:02:07