Невозможно скомпилировать библиотеку Java с Gradle, работает с IDE - PullRequest
0 голосов
/ 28 января 2019

У меня странная проблема, когда я пытаюсь собрать свой проект через Gradle.

Сборка работает нормально, когда я импортирую проект в IntelliJ и собираю / запускаю тесты черезIDE.Однако, если я запускаю ./gradlew test, сборка завершается неудачно, и он не может разрешить символы в JDK (например, GenericArrayType).

Если я делегирую действия IntelliJ по сборке / запуску Gradle, я вижу те же проблемыв моей IDE, так что, похоже, что-то не так с моей сборкой Gradle, и я не могу понять, что.Другие проекты работают нормально, поэтому, похоже, проблема в этом конкретном проекте.

Я пробовал это на разных машинах (на одной работает Ubuntu, а на другой - macOS), а также на разных версиях Gradle (4.10.2)., 5.1.1), но проблема сохраняется.Я скопировал и вставил исходный код в другой проект, который уже отлично работает, а затем он начал давать сбой и с теми же ошибками, когда я запускал модульные тесты.

Может кто-нибудь помочь мне выяснить, что происходит не так?здесь?

Вот как выглядит мой settings.gradle:

rootProject.name = 'types'

И build.gradle:

group 'com.vinaysshenoy'
version '1.0.0'

buildscript {
  ext.junit_version = '4.12'
  ext.assertj_version = '3.11.1'
  ext.jsr305_version = '3.0.2'

  repositories {
    mavenCentral()
  }
}

apply plugin: 'java-library'

java {
  sourceCompatibility JavaVersion.VERSION_1_8
  targetCompatibility JavaVersion.VERSION_1_8
}

repositories {
  mavenCentral()
}

dependencies {
  implementation "com.google.code.findbugs:jsr305:$jsr305_version"
  testImplementation "junit:junit:$junit_version"
  testImplementation "org.assertj:assertj-core:$assertj_version"
}

Вот что я вижу, когда запускаю его черезкомандная строка:

      public static final class GenericArrayTypeImpl implements GenericArrayType {
                                                                ^
      symbol:   class GenericArrayType
      location: class Util
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:230: error: cannot find symbol
      public static final class ParameterizedTypeImpl implements ParameterizedType {
                                                                 ^
      symbol:   class ParameterizedType
      location: class Util
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:340: error: cannot find symbol
      public static final class WildcardTypeImpl implements WildcardType {
                                                            ^
      symbol:   class WildcardType
      location: class Util
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:54: error: incompatible types: ParameterizedTypeImpl cannot be converted to ParameterizedType
        return new ParameterizedTypeImpl(null, rawType, typeArguments);
               ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:63: error: incompatible types: ParameterizedTypeImpl cannot be converted to ParameterizedType
        return new ParameterizedTypeImpl(ownerType, rawType, typeArguments);
               ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:68: error: incompatible types: GenericArrayTypeImpl cannot be converted to GenericArrayType
        return new GenericArrayTypeImpl(componentType);
               ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:78: error: incompatible types: WildcardTypeImpl cannot be converted to WildcardType
        return new WildcardTypeImpl(new Type[] { bound }, EMPTY_TYPE_ARRAY);
               ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:86: error: incompatible types: WildcardTypeImpl cannot be converted to WildcardType
        return new WildcardTypeImpl(new Type[] { Object.class }, new Type[] { bound });
               ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:153: error: incompatible types: ParameterizedType cannot be converted to ParameterizedTypeImpl
          Type[] aTypeArguments = pa instanceof ParameterizedTypeImpl
                                  ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:154: error: incompatible types: ParameterizedType cannot be converted to ParameterizedTypeImpl
              ? ((ParameterizedTypeImpl) pa).typeArguments
                                         ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:156: error: incompatible types: ParameterizedType cannot be converted to ParameterizedTypeImpl
          Type[] bTypeArguments = pb instanceof ParameterizedTypeImpl
                                  ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/Types.java:157: error: incompatible types: ParameterizedType cannot be converted to ParameterizedTypeImpl
              ? ((ParameterizedTypeImpl) pb).typeArguments
                                         ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:52: error: incompatible types: bad type in conditional expression
          return c.isArray() ? new GenericArrayTypeImpl(canonicalize(c.getComponentType())) : c;
                               ^
        GenericArrayTypeImpl cannot be converted to Type
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:55: error: incompatible types: Type cannot be converted to ParameterizedTypeImpl
          if (type instanceof ParameterizedTypeImpl) { return type; }
              ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:57: error: incompatible types: ParameterizedTypeImpl cannot be converted to Type
          return new ParameterizedTypeImpl(p.getOwnerType(),
                 ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:61: error: incompatible types: Type cannot be converted to GenericArrayTypeImpl
          if (type instanceof GenericArrayTypeImpl) { return type; }
              ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:63: error: incompatible types: GenericArrayTypeImpl cannot be converted to Type
          return new GenericArrayTypeImpl(g.getGenericComponentType());
                 ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:66: error: incompatible types: Type cannot be converted to WildcardTypeImpl
          if (type instanceof WildcardTypeImpl) { return type; }
              ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:68: error: incompatible types: WildcardTypeImpl cannot be converted to Type
          return new WildcardTypeImpl(w.getUpperBounds(), w.getLowerBounds());
                 ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:118: error: incompatible types: bad type in conditional expression
                ? new ParameterizedTypeImpl(newOwnerType, original.getRawType(), args)
                  ^
        ParameterizedTypeImpl cannot be converted to Type
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:260: error: method does not override or implement a method from a supertype
        @Override
        ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:265: error: method does not override or implement a method from a supertype
        @Override
        ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:270: error: method does not override or implement a method from a supertype
        @Override
        ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:279: error: incompatible types: ParameterizedTypeImpl cannot be converted to Type
              && Types.equals(this, (ParameterizedType) other);
                              ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:313: error: method does not override or implement a method from a supertype
        @Override
        ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:321: error: incompatible types: GenericArrayTypeImpl cannot be converted to Type
              && Types.equals(this, (GenericArrayType) o);
                              ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:363: error: method does not override or implement a method from a supertype
        @Override
        ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:368: error: method does not override or implement a method from a supertype
        @Override
        ^
    /Users/vinay/Dev/IdeaProjects/types/src/main/java/com/vinaysshenoy/types/util/Util.java:376: error: incompatible types: WildcardTypeImpl cannot be converted to Type
              && Types.equals(this, (WildcardType) other);
                          ^

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Решение

@ Ответ Згурского - хороший обходной путь, однако я считаю, что он только излечивает симптом реальной проблемы (см. Ниже).Вот еще один, ИМХО более чистый способ исправить основную проблему: сделать импорт вложенных типов com.vinaysshenoy.types.util.Util из com.vinaysshenoy.types.Types нестатическим :

diff --git a/src/main/java/com/vinaysshenoy/types/Types.java b/src/main/java/com/vinaysshenoy/types/Types.java
index e3a44d8..92ac237 100644
--- a/src/main/java/com/vinaysshenoy/types/Types.java
+++ b/src/main/java/com/vinaysshenoy/types/Types.java
@@ -17,9 +17,9 @@ package com.vinaysshenoy.types;


 import static com.vinaysshenoy.types.util.Util.EMPTY_TYPE_ARRAY;
-import static com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl;
-import static com.vinaysshenoy.types.util.Util.ParameterizedTypeImpl;
-import static com.vinaysshenoy.types.util.Util.WildcardTypeImpl;
+import com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl;
+import com.vinaysshenoy.types.util.Util.ParameterizedTypeImpl;
+import com.vinaysshenoy.types.util.Util.WildcardTypeImpl;
 import static com.vinaysshenoy.types.util.Util.getGenericSupertype;
 import static com.vinaysshenoy.types.util.Util.resolve;

(Кстати, другиекроме @Zgurskyi, я также могу воспроизвести это с помощью ручного javac вызова. У меня установлен только один JDK; возможно, @ 1011 * @ Zgurskyi в командной строке не из того же JDK, который использует Gradle.)

Актуальная проблема

Статически импортируются вложенные классы (а не только класс members ), хотя это никогда не требуется.Я на самом деле удивлен, что это, кажется, обычно работает, но, очевидно, некоторые Java-компиляторы, по крайней мере, подавляют его при определенных обстоятельствах.

В вашем случае компилятор Java, используемый Gradle, не мог правильно разрешить импорт вследующий сценарий (только грубое, не очень техническое описание того, что делает компилятор):

  1. при обработке com.vinaysshenoy.types.util.Util компилятор находит статический импорт com.vinaysshenoy.types.Types.arrayOf, поэтому компилятор смотрит накласс com.vinaysshenoy.types.Types.
  2. com.vinaysshenoy.types.Types имеет статический импорт com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl, поэтому компилятор смотрит на вложенный класс GenericArrayTypeImpl.
  3. com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl использует (java.lang.reflect.) GenericArrayType, однако импорт для этого типа еще не был обработан на этом этапе, что приводит к ошибке «не удается найти символ».

Возможно, его также можно считать JDKошибка в том, что это работает с некоторыми компиляторами, но не с другими.

0 голосов
/ 03 февраля 2019

Чтобы построить проект, используйте полные имена для реализованных интерфейсов для статических вложенных классов, определенных в com.vinaysshenoy.types.util.Util:

  public static final class ParameterizedTypeImpl implements java.lang.reflect.ParameterizedType { ... }

  public static final class GenericArrayTypeImpl implements java.lang.reflect.GenericArrayType { ... }

  public static final class WildcardTypeImpl implements java.lang.reflect.WildcardType { ... }

Также, если вы не хотитеиспользовать полностью определенные имена, а затем просто извлечь статические вложенные классы на верхний уровень.

Примечания:

  1. Проект компилируется без ошибок при использовании компилятора JDK:
javac -cp path_to_jsr305-3.0.2.jar -d bin src/main/java/com/vinaysshenoy/types/Types.java src/main/java/com/vinaysshenoy/types/util/Util.java
Эта проблема, похоже, зависит от платформы.Я пытался собрать проект на Windows 10 / Oracle JDK 1.8.0_111 - и никаких проблем не наблюдалось.Однако проблема воспроизводится точно так, как описано в Ubuntu 16.04 / Oracle JDK 1.8.0_201 и Ubuntu 16.04 / OpenJDK 1.8.0_191.
0 голосов
/ 04 февраля 2019

после сборки проекта я пришел к совершенно другому выводу: кажется, что в масштабе всей системы JDK повреждены файлы - и что он работает с IDE, потому что он использует встроенную версию.

в случае, если Gradle не может использовать этот JDK, его можно определить в файле gradle.properties (путь к встроенному в IDE JDK должен работать лучше, чем тот, который установлен в масштабе всей системы, как используетсяпо умолчанию):

# replace this path with the path to the IDE's embedded JDK:
org.gradle.java.home = /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home

... и это уже должно сделать сборку.

0 голосов
/ 28 января 2019

Я проверил ваш проект и смог успешно построить его с помощью gradlew clean build.

Я предполагаю, что gradle не может найти установку JDK , из-за

  • JDK не устанавливается (IDE часто поставляются с собственной установкой в ​​комплекте)или
  • переменная окружения JAVA_HOME не установлена ​​должным образом (установите и укажите ее в установочном каталоге JDK).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...