使用maven程序集插件

时间:2017-07-03 14:13:37

标签: java maven maven-assembly-plugin geotools

我想使用Geotools(v.17.1)访问不同的Geotools数据存储区。在我的POM中,我使用maven程序集插件(v.3.0.0)来聚合我的项目输出:

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

我的geotools依赖项:

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>
...

问题是我可以访问Shapefiles。在测试类中,我编写了此代码以确定是否可以找到数据存储区:

Iterator gtIterator = DataStoreFinder.getAvailableDataStores();
while(gtIterator.hasNext()){
    System.out.println(gtIterator.next().toString());
}
// results in:
/*
org.geotools.data.postgis.PostgisNGJNDIDataStoreFactory@25a65b77
org.geotools.data.postgis.PostgisNGDataStoreFactory@55ca8de8
org.geotools.geopkg.GeoPkgDataStoreFactory@8b96fde
org.geotools.data.mysql.MySQLJNDIDataStoreFactory@5d47c63f
org.geotools.data.oracle.OracleNGOCIDataStoreFactory@105fece7
org.geotools.data.shapefile.ShapefileDataStoreFactory@1dd92fe2
org.geotools.data.mysql.MySQLDataStoreFactory@275710fc
org.geotools.data.oracle.OracleNGDataStoreFactory@35083305
org.geotools.data.csv.CSVDataStoreFactory@6f3b5d16
org.geotools.data.shapefile.ShapefileDirectoryFactory@4f9a3314
org.geotools.data.oracle.OracleNGJNDIDataStoreFactory@2145433b
*/

如果我使用生成的JAR运行相同的代码,我得到:

//org.geotools.data.shapefile.ShapefileDataStoreFactory@1188e820
//org.geotools.data.shapefile.ShapefileDirectoryFactory@40f08448

任何可能导致此问题的想法?

1 个答案:

答案 0 :(得分:4)

Geotools使用Java的服务基础架构来加载实现某些接口的类,如DataStores。 Java的服务基础结构使用位于jar文件中的/ META-INF / services /中的文本文件。

在构建jar-with-dependencies时,将多个jar文件合并为一个。最有可能的是,当多个jar文件为同一个接口提供实现时,/ META-INF / services /中的文本文件会互相覆盖。

您可以通过查看创建的“fat-jar”中的services-directory来验证,尤其是在/META-INF/services/org.geotools.data.DataStoreFactorySpi条目中。一些原始的Geotools jar文件将有一个具有不同内容的条目,但是“fat-jar”将只包含一个随机内容(在你的情况下是ShapeFiles的内容)。

我对maven-shade-plugin并不熟悉,但关于SO的其他问题(如Maven shade + resteasy Could find writer for content-type建议使用额外的变换器:

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

还要看一下与GeoTools类似的SO问题:Geotools cannot find HSQL EPSG DB, throws error: NoSuchAuthorityCodeException