web-dev-qa-db-fra.com

Utilisation de Java Advanced Imaging avec Maven

configuration JAI est assez fastidieux, impliquant plusieurs pots et variables d'environnement. Cela aiderait beaucoup la portabilité du projet si je pouvais l'ajouter en tant que dépendance Maven régulière.

L'extrait 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 pots. 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é de moyen de faire fonctionner cela avec Maven.


Voir Lecture des images JCS_YCCK à l'aide d'ImageIO pour la raison pour laquelle j'utilise JAI.

51
Robert Munteanu

Ce que je n'ai pas vu, c'est que la dépendance JAI devait être satisfaite uniquement au moment de l'exécution, et j'ai donc veillé à ce que l'environnement de production ait accès à JAI, en le configurant pour Tomcat.

1
Robert Munteanu

Pour éviter de télécharger les bocaux et de les installer, vous pouvez ajouter une dépendance sur le repo du ressort. Modifiez donc 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 (il rend toutes les classes Sun disponibles javax.media.jai. *). Vois ici:

http://ebr.springsource.com/repository/app/bundle/version/detail?name=com.springsource.javax.media.jai.core&version=1.1.

Vous pouvez également ajouter la dépendance du codec si nécessaire ...

http://ebr.springsource.com/repository/app/bundle/version/detail?name=com.springsource.javax.media.jai.codec&version=1.1.

41
Lol

Il existe une implémentation "autonome" de JAI-imageio, sans dépendances de jai_core. Il n'a pas besoin d'une installation JAI sur votre JDK et JRE, seulement une seule dépendance 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 (une 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>
13
manuna

Vous devrez télécharger les fichiers jars et les installer dans votre référentiel maven local ou sur un serveur proxy de référentiel local (Nexus/Artifactory). Je pense que vous pouvez utiliser le maven -forcer-plugin pour valider que les paramètres d'environnement sont là.

licence pour jai_imageio ne permet pas qu'il soit distribué .

12
Mike Cornell
<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 pouvoir compter sur Spring Jar, il ne devrait pas bouger comme Java did

2
Swarit Agarwal

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 pots appropriés pour moi. Je n'ai même pas eu à changer mon code pour utiliser cet artefact.

Cela fera fonctionner votre code dans votre IDE. Cependant, si vous voulez un fichier exécutable, vous devez utiliser le plugin Maven Shade. Son utilisation est décrite ici et ici . Notez les lignes supplémentaires dans le 2ème lien car elles sont nécessaires. Voici le code supplémentaire pour aller 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 elles font que mon pot exécutable fait ce qu'il fait dans l'IDE.

2
GregNash

L'URL du référentiel dans la réponse de manunu semble avoir changé ou au moins est temporairement indisponible , ce qui entraîne l'échec de la construction de maven. Comme alternative, l'url suivante peut être utilisée:

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>
2
Chris2M

essaye ça:

<dependency>
  <groupId>com.Sun.media</groupId>
  <artifactId>jai_imageio</artifactId>
  <version>1.1</version>
  <type>pom</type>
</dependency>
0
I-yorn-man

J'ajoute ces dépendances dans mon fichier pom:

<dependency>
        <groupId>com.github.jai-imageio</groupId>
        <artifactId>jai-imageio-core</artifactId>
        <version>1.4.0</version>
</dependency>   

de https://openmeetings.Apache.org/openmeetings-web/dependencies.html

0
edilon Junior