我正在使用maven shade插件将geotools包打包到我的uber jar中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>this.is.my.MainClass</mainClass>
</transformer>
</transformers>
<shadedArtifactAttached>false</shadedArtifactAttached>
<shadedClassifierName>launcher</shadedClassifierName>
</configuration>
</execution>
</executions>
</plugin>
当jar在docker compose环境中构建和运行时,该服务可以工作,但是当我在netbeans中运行该服务时,会出现几个异常:
Dec 09, 2020 8:04:53 AM org.geotools.factory.FactoryRegistry scanForPlugins
WARNING: Can't load a service for category "CRSAuthorityFactory". Cause is "ServiceConfigurationError: org.opengis.referencing.crs.CRSAuthorityFactory: Provider org.geotools.referencing.factory.epsg.CartesianAuthorityFactory could not be instantiated".
java.util.ServiceConfigurationError: org.opengis.referencing.crs.CRSAuthorityFactory: Provider org.geotools.referencing.factory.epsg.CartesianAuthorityFactory could not be instantiated
Caused by: java.lang.NoSuchFieldException: UNIT
Dec 09, 2020 8:04:53 AM org.geotools.factory.FactoryRegistry scanForPlugins
WARNING: Can't load a service for category "CRSAuthorityFactory". Cause is "ServiceConfigurationError: org.opengis.referencing.crs.CRSAuthorityFactory: Provider org.geotools.referencing.factory.wms.AutoCRSFactory could not be instantiated".
java.util.ServiceConfigurationError: org.opengis.referencing.crs.CRSAuthorityFactory: Provider org.geotools.referencing.factory.wms.AutoCRSFactory could not be instantiated
Caused by: java.lang.VerifyError: Bad return type
Exception Details:
Location:
org/geotools/referencing/factory/AuthorityFactoryAdapter.missingFactory(Ljava/lang/Class;Ljava/lang/String;)Lorg/opengis/referencing/FactoryException; @25: areturn
Reason:
Type 'org/opengis/referencing/NoSuchAuthorityCodeException' (current frame, stack[0]) is not assignable to 'org/opengis/referencing/FactoryException' (from method signature)
Current Frame:
bci: @25
flags: { }
locals: { 'org/geotools/referencing/factory/AuthorityFactoryAdapter', 'java/lang/Class', 'java/lang/String' }
stack: { 'org/opengis/referencing/NoSuchAuthorityCodeException' }
等等。
我的pom包含:
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>24.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-referencing</artifactId>
<version>24.0</version>
<type>jar</type>
</dependency>
与geotools相关的maven依赖树是:
[INFO] +- org.geotools:gt-referencing:jar:24.0:compile
[INFO] | +- org.ejml:ejml-ddense:jar:0.34:compile
[INFO] | | \- org.ejml:ejml-core:jar:0.34:compile
[INFO] | +- commons-pool:commons-pool:jar:1.5.4:compile
[INFO] | +- org.geotools:gt-metadata:jar:24.0:compile
[INFO] | | +- org.geotools:gt-opengis:jar:24.0:compile
[INFO] | | | \- systems.uom:systems-common:jar:2.0.1:compile
[INFO] | | | +- tech.units:indriya:jar:2.0.2:compile
[INFO] | | | | +- tech.uom.lib:uom-lib-common:jar:2.0:compile
[INFO] | | | | \- javax.inject:javax.inject:jar:1:compile
[INFO] | | | +- si.uom:si-quantity:jar:2.0.1:compile
[INFO] | | | \- si.uom:si-units:jar:2.0.1:compile
[INFO] | | | \- jakarta.annotation:jakarta.annotation-api:jar:1.3.4:compile
[INFO] | | +- org.apache.commons:commons-lang3:jar:3.8.1:compile
[INFO] | | \- org.geotools.ogc:net.opengis.ows:jar:24.0:compile
[INFO] | | +- org.geotools.ogc:org.w3.xlink:jar:24.0:compile
[INFO] | | +- org.eclipse.emf:org.eclipse.emf.common:jar:2.15.0:compile
[INFO] | | +- org.eclipse.emf:org.eclipse.emf.ecore:jar:2.15.0:compile
[INFO] | | \- org.eclipse.emf:org.eclipse.emf.ecore.xmi:jar:2.15.0:compile
[INFO] | +- it.geosolutions.jgridshift:jgridshift-core:jar:1.3:compile
[INFO] | +- net.sf.geographiclib:GeographicLib-Java:jar:1.49:compile
[INFO] | \- javax.media:jai_core:jar:1.1.3:compile
[INFO] +- org.geotools:gt-epsg-hsql:jar:24.0:compile
[INFO] | \- org.hsqldb:hsqldb:jar:2.4.1:compile
[INFO] \- org.geotools:gt-epsg-extension:jar:24.0:compile
正在执行的代码是:
sourceCRS = CRS.decode("EPSG:4326");
编辑:我忘了说我在运行Fedora31和OpenJDK11。netbeans配置为使用OpenJDK1.8作为默认平台。这可能是由于类装入器导致的问题?
知道我做错了什么吗?谢谢
1条答案
按热度按时间stszievb1#
您需要提供引用代码的实际实现。从常见问题:
问:如何选择epsg权威机构?
引用模块并不是很现成的-它需要有人告诉它所有有趣的代码是什么意思(例如“epsg:4326”).
您需要选择一个epsg jar作为类路径的一部分;如果你的类路径上有几个epsg jar,你会得到一个factoryexception。
对于大多数需求,只需使用gt epsg hsql插件即可:
gt epsgh hsql:将包含官方epsg数据库的hsql数据库解压到一个temp目录中,这是一个非常适合桌面应用程序的解决方案。
有几种选择:
gt epsg wkt:使用内部属性文件,是轻量级的,而不是正式的和正确的。一个很好的小程序解决方案
gt epsg postgres:使用官方的epsg数据库,您必须自己加载到postgresql中。一个很好的javaee应用程序解决方案。
gt epsg access:直接使用正式的epsg数据库作为分发。对于需要最新官方数据库的windows用户来说,这是一个很好的解决方案。
不支持:
gt epsg oracle:将官方epsg数据库加载到oracle中以使用此插件
gt-epsgh-h2:使用这个流行的纯java数据库