2015-02-27 2 views
1

J'essaye d'écrire une extension OSMOSIS qui utilise GeoTools et lit une image GeoTiff.Module JAI ImageRead se perdre

J'ai écrit un exemple de travail minimum de ce qu'il fait:

package that.is.my.test; 

import java.io.File; 
import java.io.IOException; 
import org.geotools.coverage.grid.GridCoverage2D; 
import org.geotools.gce.geotiff.GeoTiffReader; 
import org.geotools.geometry.Envelope2D; 
import org.opengis.coverage.grid.GridEnvelope; 

public class ExampleClass { 
    public static void main(String[] args) { 
     new ExampleClass(); 
    } 

    public ExampleClass() { 
     try { 
      File file = new File("<GEOTIFFFILE>"); 
      GeoTiffReader reader = new GeoTiffReader(file); 
      GridCoverage2D coverage = (GridCoverage2D) reader.read(null); 
      GridEnvelope gridBounds = coverage.getGridGeometry().getGridRange(); 
      System.out.println("grid bounds: " + gridBounds); 

      Envelope2D worldBounds = coverage.getEnvelope2D(); 
      System.out.println("world bounds: " + worldBounds); 

      int numBands = coverage.getNumSampleDimensions(); 
      System.out.println("num bands: " + numBands); 

      System.out.println("Goodbye."); 
     } catch (IllegalArgumentException | IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Note: Ceci est une classe d'exemple minimal, mais le code dans le plugin OSMOSE ne fait rien d'autre encore.

Je peux exécuter cette classe exemple à partir de NetBeans, et cela fonctionne très bien. Je peux l'emballer dans un pot runnable, et cela fonctionne aussi bien.

Le plugin OSMOSIS ne peut pas être exécuté à partir de NetBeans, car il doit être compilé dans un fichier jar puis être appelé par OSMOSIS lui-même. Mais quand je fais cela, la ligne commençant par GridCoverage2D me donne un IllegalArgumentException avec le message ImageRead: No OperationDescriptor is registered in the current operation registry under this name.. Lorsque je laisse les deux classes imprimer une liste complète de registre JAI, je peux voir que dans le cas d'OSMOSIS, ImageRead, ImageWrite et quelques autres sont tout simplement manquants.

Je ne peux tout simplement pas comprendre comment cela peut arriver! Quand je regarde dans les pots, le fichier META-INF\services\javax.imageio.spi.ImageReaderSpi existe dans les deux, avec exactement le même contenu.

Ceci est mon pom.xml du plug-in, la classe exemple a les mêmes dépendances et prises en pension et de construire des directives:

<?xml version="1.0" encoding="UTF-8"?> 
<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>hello.OSMOSIS</groupId> 
    <artifactId>my-osmosis-plugin</artifactId> 
    <version>1.0-SNAPSHOT${jarWarning}</version> 
    <packaging>jar</packaging> 
    <name>OSMOSIS TEST plugin</name> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.7</maven.compiler.source> 
     <maven.compiler.target>1.7</maven.compiler.target> 
     <osmosisScope>provided</osmosisScope> <!-- configure this by using the profiles, this is fallback only. --> 
     <geotools.version>12-RC1</geotools.version> 
    </properties> 
    <!-- We define two different profiles: 
     debugWithNetbeans includes all the OSMOSIS jars into the plugin, 
      so that we can test-run the plugin with Netbeans (or anything else). 
      Note: This does not work yet... 
     pluginProductions doesn't include the OSMOSIS sources, because later on 
      the plugin will be called BY osmosis and will not need the jars anymore. 
    DO NOT FORGET to set this correctly :-) --> 
    <profiles> 
     <profile> 
      <id>debugWithNetbeans</id> 
      <properties> 
       <osmosisScope>compile</osmosisScope> 
       <jarWarning>-DEBUG-BUILD</jarWarning> 
      </properties> 
     </profile> 
     <profile> 
      <id>pluginProduction</id> 
      <properties> 
       <osmosisScope>provided</osmosisScope> 
       <jarWarning></jarWarning> 
      </properties> 
     </profile> 
    </profiles> 
    <repositories> 
     <repository> 
      <id>osgeo</id> 
      <name>Open Source Geospatial Foundation Repository</name> 
      <url>http://download.osgeo.org/webdav/geotools/</url> 
     </repository> 
    </repositories> 
    <dependencies> 
     <dependency> 
      <groupId>org.openstreetmap.osmosis</groupId> 
      <artifactId>osmosis-core</artifactId> 
      <version>0.43-RELEASE</version> 
      <scope>${osmosisScope}</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.openstreetmap.osmosis</groupId> 
      <artifactId>osmosis-xml</artifactId> 
      <version>0.43.1</version> 
      <scope>${osmosisScope}</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-geotiff</artifactId> 
      <version>${geotools.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-epsg-hsql</artifactId> 
      <version>${geotools.version}</version>     
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <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>hello.OSMOSIS.DoNothingBecauseImAPluginOnly</Main-Class> 
             <Implementation-Vendor>Blapfi</Implementation-Vendor> 
             <Implementation-Vendor-Id>huiuiui</Implementation-Vendor-Id> 
             <Implementation-Version>bapfi</Implementation-Version> 
            </manifestEntries> 
           </transformer> 
           <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
          </transformers> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Peut-être que quelqu'un peut me donner une idée sur ce que je fais mal? Serait très bien. :-)

Répondre

0

J'ai peut-être trouvé une explication maintenant: Le registre JAI semble être initialisé lorsque le JAI JAI - ou un pot qui le contient - est ajouté au classpath. Malheureusement, les fichiers JAR du répertoire plugins d'OSMOSIS ne sont jamais ajoutés à un chemin de classe mais lus par OSMOSIS lui-même.

Alors, ma solution est de construire le plugin comme un pot, livré avec un dossier lib qui contient toutes les dépendances, et un README qui indique à l'utilisateur d'ajouter /plugins/lib/* au CLASSPATH OSMOSE. Cela peut être fait en changeant -cp "%PLEXUS_CP%" à -cp "%PLEXUS_CP%";plugins/lib/*. Dans les versions Linux, vous devez utiliser un : au lieu de ;, je pense (https://stackoverflow.com/a/219801/4249849). Edit1: Cela ne fonctionne que si votre répertoire de travail actuel est osmosis/bin. Si vous voulez l'utiliser de partout (chemin), vous devez ajouter les commandes pushd et popd (Windows).