Utilisation de Java Advanced Imaging avec Maven
Question
L'extrait de POM que j'utilise est
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai_imageio</artifactId>
<version>1.1</version>
</dependency>
et les erreurs sont
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.
Missing:
----------
1) com.sun.media:jai_imageio:jar:1.1
2) javax.media:jai_core:jar:1.1.3
Je peux bien sûr télécharger et installer ces bocaux. Le problème est double:
- jai_imageio nécessite deux bocaux;
- jai_imageio nécessite l'installation d'une bibliothèque native et la définition de deux variables d'environnement.
Je n'ai pas trouvé le moyen de faire fonctionner cela avec Maven.
Voir Lire des images JCS_YCCK avec ImageIO pour la raison pour laquelle j'utilise JAI.
La solution 5
Ce que je n'ai pas compris, c'est que la dépendance de JAI ne devait être satisfaite qu'au moment de l'exécution. Je me suis donc assuré que l'environnement de production avait accès à JAI, en le configurant pour Tomcat.
Autres conseils
Pour éviter de charger les fichiers jar et de les installer, vous pouvez ajouter une dépendance au référentiel Spring. Alors changez légèrement la dépendance normale:
<dependency>
<groupId>javax.media.jai</groupId>
<artifactId>com.springsource.javax.media.jai.core</artifactId>
<version>1.1.3</version>
</dependency>
et ajoutez une déclaration de référentiel:
<repository>
<id>com.springsource.repository.bundles.external</id>
<name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name>
<url>http://repository.springsource.com/maven/bundles/external</url>
</repository>
Et cela devrait maintenant fonctionner (toutes les classes de soleil sont disponibles javax.media.jai. *). Voir ici:
Vous pouvez également ajouter la dépendance du codec si nécessaire ...
Il existe un "autonome". implémentation de JAI-imageio, sans dépendances à jai_core. Il n’est pas nécessaire d’installer JAI sur votre JDK et votre JRE, seulement une dépendance unique Maven.
Dans Maven, ajoutez son référentiel:
<repository>
<releases />
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>mygrid-repository</id>
<name>myGrid Repository</name>
<url>http://www.mygrid.org.uk/maven/repository</url>
</repository>
et dépendance:
<dependency>
<groupId>net.java.dev.jai-imageio</groupId>
<artifactId>jai-imageio-core-standalone</artifactId>
<version>1.2-pre-dr-b04-2014-09-13</version>
</dependency>
Voir son site pour plus de détails
PS Mis à jour après un commentaire utile (autre dépendance de gitHub qui n'a pas besoin d'ajouter ce référentiel):
<dependency>
<groupId>com.github.jai-imageio</groupId>
<artifactId>jai-imageio-core</artifactId>
<version>1.3.0</version>
</dependency>
Vous devrez télécharger les fichiers JAR et les installer dans votre référentiel Maven local ou votre serveur proxy de référentiel local (Nexus / Artifactory). Je pense que vous pouvez utiliser le maven -forcer-plugin pour valider l'environnement les paramètres sont là.
La licence pour jai_imageio ne lui permet pas d'être distribué .
Cela a fonctionné pour moi:
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-coverage</artifactId>
<version>2.7.4</version>
</dependency>
<repository>
<id>osgeo</id>
<name>Open Source Geospatial Foundation Repository</name>
<url>http://download.osgeo.org/webdav/geotools/</url>
</repository>
Il semble que gt-coverage dépend de jai_imageio, il a donc installé les bocaux appropriés pour moi. Je n'ai même pas eu besoin de changer de code pour utiliser cet artefact.
Votre code fonctionnera dans votre IDE. Cependant, si vous voulez un fichier jar exécutable, vous devez utiliser le plugin Maven Shade. Son utilisation est décrite ici et ici . Notez les lignes supplémentaires dans le 2e lien car elles sont nécessaires. Voici le code supplémentaire à insérer dans votre pom:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.3.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>com.companyname.packagename.MainClassName</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>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
Je ne sais pas ce que sont toutes ces entrées de manifeste supplémentaires, mais cela fait que mon jar exécutable fait ce qu'il fait dans l'EDI.
L'URL du référentiel dans la réponse de manunu semble avoir changé ou du moins est temporairement indisponible , ce qui entraîne l'échec de la création de maven. Vous pouvez également utiliser l'URL suivante:
http://build.mygrid.org.uk/maven/repository
<repository>
<releases />
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>mygrid-repository</id>
<name>myGrid Repository</name>
<url>http://build.mygrid.org.uk/maven/repository</url>
</repository>
<dependency>
<groupId>javax.media.jai</groupId>
<artifactId>com.springsource.javax.media.jai.core</artifactId>
<version>1.1.3</version>
</dependency>
et ajoutez une déclaration de référentiel:
<repository>
<id>com.springsource.repository.bundles.external</id>
<name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name>
<url>http://repository.springsource.com/maven/bundles/external</url>
</repository>
Cela a fonctionné pour moi. Devinez peut compter sur Spring Jar, il ne devrait pas bouger comme java
essayez ceci:
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai_imageio</artifactId>
<version>1.1</version>
<type>pom</type>
</dependency>