【问题标题】:Cannot find Geotools datastores when using maven assembly plugin使用 Maven 程序集插件时找不到 Geotools 数据存储
【发布时间】:2017-07-03 14:13:36
【问题描述】:

我想使用 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>
...

问题是我只能访问 Shapefile。在一个测试类中,我编写了这段代码来确定是否可以找到数据存储:

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

有什么想法会导致这个问题吗?

【问题讨论】:

    标签: java maven maven-assembly-plugin geotools


    【解决方案1】:

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

    在构建带有依赖项的 jar 时,您可以将多个 jar 文件合并为一个。当多个 jar 文件为同一接口提供实现时,/META-INF/services/ 中的文本文件很可能会相互覆盖。

    您可以通过查看创建的“fat-jar”中的服务目录来验证这一点,尤其是在条目 /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

    【讨论】:

    • 谢谢,你是对的。 org.geotools.data.DataStoreFactorySpi 中的存储被覆盖。不过,顺序似乎不是随机的。
    • 查看常见问题解答 (docs.geotools.org/stable/userguide/build/faq.html) 了解所需的 Maven Shade 设置的详细信息
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2014-10-20
    • 2021-04-23
    • 2010-11-07
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多