2017-07-03 2 views
1

Je souhaite accéder à différentes banques de données Geotools à l'aide de Geotools (version 17.1). Dans mon POM J'utilise le plugin de montage Maven (v 3.0.0.) Pour agréger ma sortie de projet:Impossible de trouver les banques de données Geotools lors de l'utilisation du plugin d'assemblage maven

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>3.0.0</version> 
    <configuration> 
     <archive> 
      <manifest> 
       <mainClass>de.my.project.MainClass</mainClass> 
       <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
       <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> 
      </manifest> 
     </archive> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
    <executions> 
     <execution> 
      <id>make-assembly</id> <!-- this is used for inheritance merges --> 
      <phase>package</phase> <!-- bind to the packaging phase --> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Mes GeoTools dépendances:

dependency> 
    <groupId>org.geotools</groupId> 
    <artifactId>gt-shapefile</artifactId> 
    <version>17.1</version> 
</dependency> 
<dependency> 
    <groupId>org.geotools</groupId> 
    <artifactId>gt-geopkg</artifactId> 
    <version>17.1</version> 
</dependency> 
... 

Le problème est que je peux accéder Shapefiles . Dans une classe de test, j'ai écrit ce code pour savoir si les Datastores se trouvent:

Iterator gtIterator = DataStoreFinder.getAvailableDataStores(); 
while(gtIterator.hasNext()){ 
    System.out.println(gtIterator.next().toString()); 
} 
// results in: 
/* 
[email protected] 
[email protected] 
[email protected] 
org.geotools.data.mysql.M[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
*/ 

Si j'exécute le même code en utilisant le JAR généré Je viens d'obtenir:

//[email protected] 
//[email protected] 

Toutes les idées que pourrait causer ce problème?

Répondre

4

Geotools utilise l'infrastructure Java de Service pour charger les classes implémentant certaines interfaces, telles que DataStores. L'infrastructure de service Java fonctionne avec les fichiers texte situés dans/META-INF/services/dans les fichiers jar. Lors de la création d'un fichier jar avec dépendances, vous combinez plusieurs fichiers jar en un seul. Très probablement, les fichiers texte dans/META-INF/services/se remplacent mutuellement lorsque plusieurs fichiers jar fournissent des implémentations pour la même interface.

Vous pouvez vérifier cela en regardant le répertoire de services dans le "fat-jar" créé, en particulier à l'entrée /META-INF/services/org.geotools.data.DataStoreFactorySpi. Plusieurs des fichiers jar Geotools originaux auront une telle entrée avec un contenu différent, mais le "fat-jar" n'en contiendra qu'un avec le contenu d'un fichier aléatoire (dans votre cas celui pour les ShapeFiles).

Je ne suis pas vraiment familier avec le maven-plugin-ombre, mais d'autres questions sur SO (comme Maven shade + resteasy Could find writer for content-type suggère d'utiliser un transformateur supplémentaire:

<transformer 
    implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 

ont aussi un coup d'oeil à la même question SO- avec GeoTools: Geotools cannot find HSQL EPSG DB, throws error: NoSuchAuthorityCodeException

+0

Merci, vous avez raison Les magasins dans 'org.geotools.data.DataStoreFactorySpi' sont remplacés L'ordre ne semble pas aléatoire – Lars

+0

Voir la FAQ (http://docs.geotools. org/stable/userguide/build/faq.html) pour plus de détails sur l'installation de Maven Shade requise –