将google-cloud-datastore依赖项添加到模块化Java 11项目时,java.lang.module.ResolutionException

时间:2019-06-30 22:35:39

标签: java maven module google-cloud-datastore jigsaw

我在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:execjava -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上发布问题。

2 个答案:

答案 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库(及其依赖的所有依赖项)模块化。