Java geotools 20.5错误:无法实例化提供程序org.geotools.referencement.factory.epsg.CartesianAuthorityFactory

Java geotools 20.5错误:无法实例化提供程序org.geotools.referencement.factory.epsg.CartesianAuthorityFactory,java,gradle,build.gradle,geotools,Java,Gradle,Build.gradle,Geotools,我正在从事一个java项目,该项目需要将WGS84转换为UMT。我使用geotools v20.5创建了一个带有以下代码的转换: transform = CRS.findMathTransform( CRS.decode("EPSG:4326", true), CRS.decode("EPSG:3857", true), false); 在geotools改变回购协议之前,它一直在正常工作。 当前,当我运行程序

我正在从事一个java项目,该项目需要将WGS84转换为UMT。我使用geotools v20.5创建了一个带有以下代码的转换:

transform = CRS.findMathTransform(
              CRS.decode("EPSG:4326", true),
              CRS.decode("EPSG:3857", true),
              false);
在geotools改变回购协议之前,它一直在正常工作。 当前,当我运行程序时,我将收到一条警告:

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".
然后出现以下错误:

Caused by: java.lang.NoSuchFieldError: ONE
Execution failed for task ':Application.main()'.
> Process 'command '/usr/lib/jvm/java-8-openjdk-amd64/bin/java'' finished with non-zero exit value 255
我的环境:Ubuntu 20.04和OpenJDK 8(64位) 我用其他Windows机器测试过,它遇到了同样的错误。 以下是我从org.geotools使用的libs

def geotoolsVersion=20.5

    compile group: 'org.geotools', name: 'gt-opengis', version: geotoolsVersion
    compile group: 'org.geotools', name: 'gt-referencing', version: geotoolsVersion
    compile group: 'org.geotools', name: 'gt-epsg-wkt', version: geotoolsVersion
    compile group: 'org.geotools', name: 'gt-geometry', version: geotoolsVersion
您可能会注意到,我使用gt epsg wkt而不是那些带有db的目录,因为我可能没有对生产中的某些目录的写入权限。但我用db测试了其他插件,仍然遇到了同样的错误。 我试着调试geotools中的哪部分代码导致了这个错误,我发现了。 错误开始于Units的最后一行。在gt referenceinglib中的Parser.java类中自动更正(…)以下代码

    /**
     * Parses an "UNIT" element. This element has the following pattern:
     *
     * <blockquote>
     *
     * <code>
     * UNIT["<name>", <conversion factor> {,<authority>}]
     * </code>
     *
     * </blockquote>
     *
     * @param parent The parent element.
     * @param unit The contextual unit. Usually {@link SI#METRE} or {@link SI#RADIAN}.
     * @return The "UNIT" element as an {@link Unit} object.
     * @throws ParseException if the "UNIT" can't be parsed.
     * @todo Authority code is currently ignored. We may consider to create a subclass of {@link
     *     Unit} which implements {@link IdentifiedObject} in a future version.
     */
    @SuppressWarnings("unchecked")
    private <T extends Quantity<T>> Unit<T> parseUnit(final Element parent, final Unit<T> unit)
            throws ParseException {
        final Element element = parent.pullElement("UNIT");
        final String name = element.pullString("name");
        final double factor = element.pullDouble("factor");
        final Map<String, ?> properties = parseAuthority(element, name);
        element.close();
        Unit<T> finalUnit = (factor != 1) ? unit.multiply(factor) : unit;
        return Units.autoCorrect(finalUnit);
    }
我现在完全不知所措了,为什么在他们改变远程回购协议后,它还能工作,却不能工作?! 如果您需要我提供更多信息,请留言,我仍在等待解决方案,因为我无法轻松更改geotools库。 谢谢大家

顺便说一句,我通过代码EPSG:4326或EPSG:3857确认它得到了正确的WKT

更新
我将geotools的版本改为12.5,该版本写在他们的网站上,并将JTS lib切换到com.livitSolutions.JTS,然后现在就可以使用了。我想我可能需要在他们的github上提出一个问题。

解决这类问题的诀窍是使用
gradle-q依赖项查看
gradle
作为依赖项引入的内容。如果您有一个构建良好的构建,您应该看到如下内容:

+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
|    +--- commons-pool:commons-pool:1.5.4
|    +--- systems.uom:systems-common-java8:0.7.2
|    |    +--- tec.uom:uom-se:1.0.8
|    |    |    +--- javax.measure:unit-api:1.0
|    |    |    \--- tec.uom.lib:uom-lib-common:1.0.2
|    |    |         \--- javax.measure:unit-api:1.0
|    |    +--- si.uom:si-quantity:0.7.1
|    |    |    \--- javax.measure:unit-api:1.0
|    |    \--- si.uom:si-units-java8:0.7.1
|    |         +--- javax.measure:unit-api:1.0
|    |         +--- tec.uom:uom-se:1.0.8 (*)
|    |         \--- si.uom:si-quantity:0.7.1 (*)
|    \--- javax.media:jai_core:1.1.3
+--- org.geotools:gt-epsg-wkt:23.1
|    +--- org.geotools:gt-referencing:23.1
|    |    +--- org.ejml:ejml-ddense:0.34
|    |    |    \--- org.ejml:ejml-core:0.34
|    |    +--- commons-pool:commons-pool:1.5.4
|    |    +--- org.geotools:gt-metadata:23.1
+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
+--- org.geotools:gt-epsg-wkt:23.1
+--- org.geotools:gt-geometry:23.1
+--- org.geotools:gt-referencing:23.1
+--- org.geotools:gt-main:23.1
\--- org.geotools:gt-metadata:23.1
repositories {
     maven { url "http://download.java.net/maven/2" }
     maven { url "https://repo.osgeo.org/repository/release/" }
     maven { url "http://maven.geo-solutions.it/" }
     maven { url "https://repo.maven.apache.org/maven2" }
}
但是,如果您看到以下内容:

+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
|    +--- commons-pool:commons-pool:1.5.4
|    +--- systems.uom:systems-common-java8:0.7.2
|    |    +--- tec.uom:uom-se:1.0.8
|    |    |    +--- javax.measure:unit-api:1.0
|    |    |    \--- tec.uom.lib:uom-lib-common:1.0.2
|    |    |         \--- javax.measure:unit-api:1.0
|    |    +--- si.uom:si-quantity:0.7.1
|    |    |    \--- javax.measure:unit-api:1.0
|    |    \--- si.uom:si-units-java8:0.7.1
|    |         +--- javax.measure:unit-api:1.0
|    |         +--- tec.uom:uom-se:1.0.8 (*)
|    |         \--- si.uom:si-quantity:0.7.1 (*)
|    \--- javax.media:jai_core:1.1.3
+--- org.geotools:gt-epsg-wkt:23.1
|    +--- org.geotools:gt-referencing:23.1
|    |    +--- org.ejml:ejml-ddense:0.34
|    |    |    \--- org.ejml:ejml-core:0.34
|    |    +--- commons-pool:commons-pool:1.5.4
|    |    +--- org.geotools:gt-metadata:23.1
+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
+--- org.geotools:gt-epsg-wkt:23.1
+--- org.geotools:gt-geometry:23.1
+--- org.geotools:gt-referencing:23.1
+--- org.geotools:gt-main:23.1
\--- org.geotools:gt-metadata:23.1
repositories {
     maven { url "http://download.java.net/maven/2" }
     maven { url "https://repo.osgeo.org/repository/release/" }
     maven { url "http://maven.geo-solutions.it/" }
     maven { url "https://repo.maven.apache.org/maven2" }
}
那就有问题了。从我对gradle的(简短的)实验来看,您似乎需要以下东西:

+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
|    +--- commons-pool:commons-pool:1.5.4
|    +--- systems.uom:systems-common-java8:0.7.2
|    |    +--- tec.uom:uom-se:1.0.8
|    |    |    +--- javax.measure:unit-api:1.0
|    |    |    \--- tec.uom.lib:uom-lib-common:1.0.2
|    |    |         \--- javax.measure:unit-api:1.0
|    |    +--- si.uom:si-quantity:0.7.1
|    |    |    \--- javax.measure:unit-api:1.0
|    |    \--- si.uom:si-units-java8:0.7.1
|    |         +--- javax.measure:unit-api:1.0
|    |         +--- tec.uom:uom-se:1.0.8 (*)
|    |         \--- si.uom:si-quantity:0.7.1 (*)
|    \--- javax.media:jai_core:1.1.3
+--- org.geotools:gt-epsg-wkt:23.1
|    +--- org.geotools:gt-referencing:23.1
|    |    +--- org.ejml:ejml-ddense:0.34
|    |    |    \--- org.ejml:ejml-core:0.34
|    |    +--- commons-pool:commons-pool:1.5.4
|    |    +--- org.geotools:gt-metadata:23.1
+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
+--- org.geotools:gt-epsg-wkt:23.1
+--- org.geotools:gt-geometry:23.1
+--- org.geotools:gt-referencing:23.1
+--- org.geotools:gt-main:23.1
\--- org.geotools:gt-metadata:23.1
repositories {
     maven { url "http://download.java.net/maven/2" }
     maven { url "https://repo.osgeo.org/repository/release/" }
     maven { url "http://maven.geo-solutions.it/" }
     maven { url "https://repo.maven.apache.org/maven2" }
}

确保gradle能够找到您(和GeoTools)需要的所有依赖项。注意:如果您正在使用GeoTools的快照,则需要
https://repo.osgeo.org/repository/snapshot/
而不是
https://repo.osgeo.org/repository/release/

解决这类问题的诀窍是使用
gradle-q依赖项查看
gradle
作为依赖项引入的内容-如果您有一个构造良好的构建,您应该看到如下内容:

+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
|    +--- commons-pool:commons-pool:1.5.4
|    +--- systems.uom:systems-common-java8:0.7.2
|    |    +--- tec.uom:uom-se:1.0.8
|    |    |    +--- javax.measure:unit-api:1.0
|    |    |    \--- tec.uom.lib:uom-lib-common:1.0.2
|    |    |         \--- javax.measure:unit-api:1.0
|    |    +--- si.uom:si-quantity:0.7.1
|    |    |    \--- javax.measure:unit-api:1.0
|    |    \--- si.uom:si-units-java8:0.7.1
|    |         +--- javax.measure:unit-api:1.0
|    |         +--- tec.uom:uom-se:1.0.8 (*)
|    |         \--- si.uom:si-quantity:0.7.1 (*)
|    \--- javax.media:jai_core:1.1.3
+--- org.geotools:gt-epsg-wkt:23.1
|    +--- org.geotools:gt-referencing:23.1
|    |    +--- org.ejml:ejml-ddense:0.34
|    |    |    \--- org.ejml:ejml-core:0.34
|    |    +--- commons-pool:commons-pool:1.5.4
|    |    +--- org.geotools:gt-metadata:23.1
+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
+--- org.geotools:gt-epsg-wkt:23.1
+--- org.geotools:gt-geometry:23.1
+--- org.geotools:gt-referencing:23.1
+--- org.geotools:gt-main:23.1
\--- org.geotools:gt-metadata:23.1
repositories {
     maven { url "http://download.java.net/maven/2" }
     maven { url "https://repo.osgeo.org/repository/release/" }
     maven { url "http://maven.geo-solutions.it/" }
     maven { url "https://repo.maven.apache.org/maven2" }
}
但是,如果您看到以下内容:

+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
|    +--- commons-pool:commons-pool:1.5.4
|    +--- systems.uom:systems-common-java8:0.7.2
|    |    +--- tec.uom:uom-se:1.0.8
|    |    |    +--- javax.measure:unit-api:1.0
|    |    |    \--- tec.uom.lib:uom-lib-common:1.0.2
|    |    |         \--- javax.measure:unit-api:1.0
|    |    +--- si.uom:si-quantity:0.7.1
|    |    |    \--- javax.measure:unit-api:1.0
|    |    \--- si.uom:si-units-java8:0.7.1
|    |         +--- javax.measure:unit-api:1.0
|    |         +--- tec.uom:uom-se:1.0.8 (*)
|    |         \--- si.uom:si-quantity:0.7.1 (*)
|    \--- javax.media:jai_core:1.1.3
+--- org.geotools:gt-epsg-wkt:23.1
|    +--- org.geotools:gt-referencing:23.1
|    |    +--- org.ejml:ejml-ddense:0.34
|    |    |    \--- org.ejml:ejml-core:0.34
|    |    +--- commons-pool:commons-pool:1.5.4
|    |    +--- org.geotools:gt-metadata:23.1
+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
+--- org.geotools:gt-epsg-wkt:23.1
+--- org.geotools:gt-geometry:23.1
+--- org.geotools:gt-referencing:23.1
+--- org.geotools:gt-main:23.1
\--- org.geotools:gt-metadata:23.1
repositories {
     maven { url "http://download.java.net/maven/2" }
     maven { url "https://repo.osgeo.org/repository/release/" }
     maven { url "http://maven.geo-solutions.it/" }
     maven { url "https://repo.maven.apache.org/maven2" }
}
那就有问题了。从我对gradle的(简短的)实验来看,您似乎需要以下东西:

+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
|    +--- commons-pool:commons-pool:1.5.4
|    +--- systems.uom:systems-common-java8:0.7.2
|    |    +--- tec.uom:uom-se:1.0.8
|    |    |    +--- javax.measure:unit-api:1.0
|    |    |    \--- tec.uom.lib:uom-lib-common:1.0.2
|    |    |         \--- javax.measure:unit-api:1.0
|    |    +--- si.uom:si-quantity:0.7.1
|    |    |    \--- javax.measure:unit-api:1.0
|    |    \--- si.uom:si-units-java8:0.7.1
|    |         +--- javax.measure:unit-api:1.0
|    |         +--- tec.uom:uom-se:1.0.8 (*)
|    |         \--- si.uom:si-quantity:0.7.1 (*)
|    \--- javax.media:jai_core:1.1.3
+--- org.geotools:gt-epsg-wkt:23.1
|    +--- org.geotools:gt-referencing:23.1
|    |    +--- org.ejml:ejml-ddense:0.34
|    |    |    \--- org.ejml:ejml-core:0.34
|    |    +--- commons-pool:commons-pool:1.5.4
|    |    +--- org.geotools:gt-metadata:23.1
+--- org.locationtech.jts:jts-core:1.16.1
+--- org.geotools:gt-opengis:23.1
+--- org.geotools:gt-epsg-wkt:23.1
+--- org.geotools:gt-geometry:23.1
+--- org.geotools:gt-referencing:23.1
+--- org.geotools:gt-main:23.1
\--- org.geotools:gt-metadata:23.1
repositories {
     maven { url "http://download.java.net/maven/2" }
     maven { url "https://repo.osgeo.org/repository/release/" }
     maven { url "http://maven.geo-solutions.it/" }
     maven { url "https://repo.maven.apache.org/maven2" }
}

确保gradle能够找到您(和GeoTools)需要的所有依赖项。注意:如果您正在使用GeoTools的快照,则需要
https://repo.osgeo.org/repository/snapshot/
而不是
https://repo.osgeo.org/repository/release/

你构建罐子的方式可能会出现重复或其他问题?我认为这和我遇到的问题不一样。我根据geotools架构页面添加了这些JAR。我确信它一直在工作,直到他们改变了他们的远程报告,我把geotools版本改为12.5,它依赖于com.livitSolutions.jts:1.13而不是org.locationtech.jts,这个问题已经解决并开始工作。因此,我认为问题只存在于GeoTools的最新稳定版本中,而不是当前的稳定版本是23.x而不是12.x,尽管页面上说可能是重复的,或者您构建jar的方式出了问题?我认为这与我遇到的问题不同。我根据geotools架构页面添加了这些JAR。我确信它一直在工作,直到他们改变了他们的远程报告,我把geotools版本改为12.5,它依赖于com.livitSolutions.jts:1.13而不是org.locationtech.jts,这个问题已经解决并开始工作。因此,我认为问题只存在于GeoTools的最新稳定版本中,而不是当前的稳定版本是23.x而不是12.x,尽管页面上写着Shello Ian,再次感谢您帮助我解决了这个问题。只需发布jira case的链接:你好,伊恩,再次感谢你帮助我解决了这个问题。只需发布jira案例的链接: