java.lang.module.ResolutionException при добавлении зависимости google-cloud-datastore в модульный проект Java 11 - PullRequest
1 голос
/ 01 июля 2019

У меня есть микросервис на основе модульного джерси, работающий на 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; в мой модуль-info.java.

A 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 Модули A и B экспортируют пакет some.package в модуль C в Java 9

Я подозреваю, что эта библиотека google-cloud-datastore просто не готова к модульной системе Java. Я опубликую проблему в github API Облачного клиента Google, ссылаясь на эту публикацию stackoverflow.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

pmakani из github удалось"исправить" мой проект, исключив зависимости:

<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 (и все зависимости, от которых они зависят) модульными.

0 голосов
/ 02 июля 2019

Пока Google не добавит действительные файлы module-info.java в свои зависимости gven-cloud-datastore и google-cloud-core maven (я сообщал о проблеме на их github здесь ), обходной путь должен использовать старый путь к классам.

В случае моего проекта измените конфигурацию 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, которая включает в себя все необходимые банки. Вся команда java будет очень длинной, как этот pastebin.

...