我在JDK 11上运行了基于模块化泽西的微服务。它可以很好地部署到Google App Engine。可以在此处下载代码(或克隆主项目并切换到3.1标记): https://github.com/Leejjon/SimpleJerseyService/releases/tag/3.1
现在,我想添加对Google Cloud Datastore API(在我以前的非模块化Java 8项目中可用)的访问权限。因此,我添加了Maven依赖项:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-datastore</artifactId>
<version>1.80.0</version>
</dependency>
然后将requires google.cloud.datastore;
添加到我的module-info.java中。
mvn clean install
运行正常,但是当我通过mvn exec:exec
或java -p simple-service-1.0-SNAPSHOT.jar;appengine-staging/ -m myModule/com.example.Main localhost
运行时
我得到:
Error occurred during initialization of boot layer
java.lang.module.ResolutionException: Modules grpc.context and grpc.api export package io.grpc to module org.apache.httpcomponents.httpclient
在我的module-info.java中可以做些什么来解决此问题?
阅读以下帖子后: https://blog.codefx.org/java/java-9-migration-guide/#Split-Packages https://blog.codefx.org/java/jsr-305-java-9/#Modular-Project Modules A and B export package some.package to module C in Java 9
我怀疑这个google-cloud-datastore库尚未准备好用于Java模块系统。我将参考此stackoverflow帖子在Google Cloud Client API github上发布问题。
答案 0 :(得分:0)
直到Google将有效的module-info.java文件添加到他们的google-cloud-datastore和google-cloud-core maven依赖项(我在他们的github here上报告了一个问题)之前,解决方法是使用旧的类路径。
对于我的项目,请从以下位置更改exec-maven-plugin的配置:
<configuration>
<executable>java</executable>
<arguments>
<argument>-p</argument> <!-- or -p -->
<!-- automatically creates the modulepath using all project dependencies,
also adding the project build directory -->
<modulepath/>
<argument>-m</argument> <!-- or -m -->
<argument>myModule/com.example.Main</argument>
<argument>localhost</argument>
</arguments>
</configuration>
到
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<!-- automatically creates the classpath using all project dependencies,
also adding the project build directory -->
<classpath/>
<argument>com.example.Main</argument>
<argument>localhost</argument>
</arguments>
</configuration>
使用mvn -X exec:exec
将显示完整的java命令,其中包括所有必需的jar。 The entire java command will be super long like this pastebin.
答案 1 :(得分:0)
pmakani from github managed通过排除依赖项来“修复”我的项目:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-datastore</artifactId>
<version>1.80.0</version>
<exclusions>
<exclusion>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</exclusion>
<exclusion>
<groupId>io.grpc</groupId>
<artifactId>grpc-core</artifactId>
</exclusion>
</exclusions>
</dependency>
似乎可以访问数据存储,但是日志中仍然包含以下错误: java.lang.reflect.InaccessibleObjectException:无法使字段受保护的易变java.io.InputStream java.io.FilterInputStream.in可访问:模块java.base不会“打开java.io”模块数据
完整日志: https://pastebin.com/e431R7pW
我想Google仍应将其gcloud库(及其依赖的所有依赖项)模块化。