我正试图将我的应用程序转换为使用Java 11和Java模块系统,但我很难发现哪些"要求"。要添加到我的模块中的语句。我目前得到错误"The project was not built since its build path is incomplete. Cannot find the class file for org.locationtech.jts.geom.Envelope. Fix the build path then try building this project"
.
我已经通过https://github.com/geotools/geotools搜索过了,但是我找不到关于哪个模块暴露哪个包的任何提示。例如,有一个模块"org.geotools.tile_client",但是在存储库中搜索它得到零命中(所以我假设geotools模块不是通过配置文件处理的?)。
不幸的是,geotools Javadoc也没有帮助,因为geotools还没有使用命名模块。
https://docs.geotools.org/stable/userguide/tutorial/quickstart/java11.html提到使用与我的POM中声明的相同的要求,但对于我的项目要求(gt-shapefile, gt-swing, gt-tile-client, gt-epsg-hsql, gt-grid),这会导致错误:
The project was not built since its build path is incomplete. Cannot find the class file for org.opengis.referencing.crs.CoordinateReferenceSystem. Fix the build path then try building this project
通过深入挖掘maven依赖项,我发现了一些现在也显式需要的依赖项。这给我带来了更多的错误。
requires org.geotools.opengis;
requires org.geotools.referencing;
requires org.geotools.coverage;
requires org.geotools.main;
requires org.geotools.render;
requires org.geotools.epsg_hsql;
requires org.geotools.shapefile;
requires org.geotools.grid;
requires org.geotools.tile_client;
requires org.geotools.swing;
requires org.geotools.http;
然而,我确实找到了一个似乎不想工作的模块(gt-cql,依赖于gt-render)。要求org.geotools.cql无法解析。
所以,正如顶部所问的,我如何为我的GeoTools项目发现正确的Java 11模块名称?是否有一个具体的提示,我应该需要哪个模块,以摆脱org. locationtechnology .jts.geo . envelope问题?
花了一段时间来实现这一点,但我已经得到了以下解决方案,这要归功于jar——describe-module命令,是否有可能在同一个项目中混合Java 8和Java 9源代码而不使用编译器标志?
-
使用mvn dependency:copy-dependencies复制所有.jar文件到target/dependency.
-
在target/dependency中创建一个文件"module-report.cmd"内容如下:
比;module-report.txt (For %%f in (%~dp0*.jar)Jar——file=%%f——describe-module()
只是运行"jar——file=…——describe-module"命令,将其输出到module-report.txt。
- 运行模块-报告。
文本文件的内容包含了所有的模块信息,包括包含的包,需要声明的一切。
使用该报告,我可以简单地搜索我无法访问的包,并轻松获得包含它们的模块的名称。