栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Geotools找不到HSQL EPSG DB,引发错误:NoSuchAuthorityCodeException

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Geotools找不到HSQL EPSG DB,引发错误:NoSuchAuthorityCodeException

Geotools使用Java的Service基础结构来加载负责EPSG查找的类。原始的

gt-epsg-hsql.jar
条目中
/meta-INF/services/
指定了jar文件实现哪些接口,以及哪些接口可以在运行时动态加载。

构建uber-jar时,将多个jar文件合并为一个。最有可能的是,另一个jar文件也实现了相同的接口(例如

gt-referencing.jar
),因此文件中具有相同的名称
/meta-INF/services/
。当将所有内容放入一个jar文件时,这些条目很可能会被覆盖(至少我找不到maven-shade-
plugin合并此类服务文件的任何引用)。

您可以通过查看创建的uber-jar中的services-directory来验证这一点,尤其是在entry处

/meta-INF/services/org.opengis.referencing.crs.CRSAuthorityFactory
。双方
gt-epsg-hsql.jar
gt-referencing.jar
有(从GeoTools可能也和其他jar文件)这样的文件,以及最有可能的,只有一个的内容会在你的尤伯杯罐子,导致所有其他类没有被发现/在运行时加载。

我对maven-shade-plugin并不是很熟悉,但是关于SO的其他问题(例如[1])建议使用其他转换器:

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

编辑: 由于此答案会定期访问,并且我现在已经熟悉了阴影插件,因此这里是使用阴影插件的更详细的指南。

因此,我们可以使用maven-shade插件来创建一个多合一的jar,而不是使用maven-assembly插件。为此,请在室内配置maven-
shade插件

pom.xml
并将其绑定到包阶段(因此,每当您调用时
mvn package
,都会创建阴影罐子:

<build>  <plugins>    <plugin>      <groupId>org.apache.maven.plugins</groupId>      <artifactId>maven-shade-plugin</artifactId>      <version>3.1.0</version>      <executions>        <execution>          <phase>package</phase>          <goals> <goal>shade</goal>          </goals>          <configuration> <transformers>   <!-- This bit sets the main class for the executable jar as you otherwise -->   <!-- would with the assembly plugin      -->   <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">     <manifestEntries>       <Main-Class>com.example.YourMainClass</Main-Class>       <Implementation-Vendor>Your Company Name</Implementation-Vendor>       <Implementation-Version>${project.version}</Implementation-Version>     </manifestEntries>   </transformer>   <!-- This bit merges the various GeoTools meta-INF/services files         -->   <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers>          </configuration>        </execution>      </executions>    </plugin>  </plugins></build>

并不一定在所有情况下都需要使用

Implementation-Vendor
Implementation-Version
,但是我观察到以下情况:缺少此信息时,某些代码(我认为是JAI-
Java高级映像)会抱怨并且行为不当,这可能是因为原始JAR包含了此类信息,而阴影部分并未默认值,因此最好将其包括在内。

运行时

mvn package
,它将原始jar文件重命名为
original-myArtifact.jar
,并将阴影(= all-in-one,fat-
jar,uber-
jar)放在
myArtifact.jar
。如果您不喜欢这种行为,并且想要保持原始的jar文件完整并保留阴影的jar文件,请在代码
configuration
块中添加以下行:

<shadedArtifactAttached>true</shadedArtifactAttached>

在这种情况下,构建过程将创建一个文件

myArtifact-shaded.jar
(类似于
myArtifact-jar-with-dependencies.jar
程序集插件创建的文件)。




转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437959.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号