无法使用Gradle编译Java库,可以使用IDE

Vin*_*noy 6 java gradle

当我尝试通过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'
Run Code Online (Sandbox Code Playgroud)

而且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"
}
Run Code Online (Sandbox Code Playgroud)

这是我通过命令行运行时看到的内容:

      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);
                          ^
Run Code Online (Sandbox Code Playgroud)

Chr*_*iki 2

解决方案

\n\n

@Zgurskyi\xe2\x80\x99s 答案是一个很好的解决方法,但是,我相信它只能解决实际问题的症状(见下文)。com.vinaysshenoy.types.util.UtilHere\xe2\x80\x99是另一种更干净的方法来解决根本问题:使from com.vinaysshenoy.types.Types non-static的嵌套类型的导入:

\n\n
diff --git a/src/main/java/com/vinaysshenoy/types/Types.java b/src/main/java/com/vinaysshenoy/types/Types.java\nindex e3a44d8..92ac237 100644\n--- a/src/main/java/com/vinaysshenoy/types/Types.java\n+++ b/src/main/java/com/vinaysshenoy/types/Types.java\n@@ -17,9 +17,9 @@ package com.vinaysshenoy.types;\n\n\n import static com.vinaysshenoy.types.util.Util.EMPTY_TYPE_ARRAY;\n-import static com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl;\n-import static com.vinaysshenoy.types.util.Util.ParameterizedTypeImpl;\n-import static com.vinaysshenoy.types.util.Util.WildcardTypeImpl;\n+import com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl;\n+import com.vinaysshenoy.types.util.Util.ParameterizedTypeImpl;\n+import com.vinaysshenoy.types.util.Util.WildcardTypeImpl;\n import static com.vinaysshenoy.types.util.Util.getGenericSupertype;\n import static com.vinaysshenoy.types.util.Util.resolve;\n
Run Code Online (Sandbox Code Playgroud)\n\n

(顺便说一句,除了 @Zgurskyi 之外,我还可以通过手动javac调用来重现这一点。我只安装了一个 JDK;也许javac命令行上的 @Zgurskyi\xe2\x80\x99s 与 Gradle 使用的 JDK 不同。)

\n\n

实际问题

\n\n

您静态导入嵌套类(不仅仅是类成员),尽管这永远不是必要的。我\xe2\x80\x99m 实际上很惊讶这似乎通常有效,但显然一些 Java 编译器在某些情况下至少会卡住。

\n\n

在您的情况下,Gradle 使用的 Java 编译器无法\xe2\x80\x99 正确解析以下场景中的导入(仅对编译器的功能进行粗略的、不是非常技术性的描述):

\n\n
    \n
  1. 在处理 时com.vinaysshenoy.types.util.Util,编译器发现 的静态导入com.vinaysshenoy.types.Types.arrayOf,因此编译器会查看该类com.vinaysshenoy.types.Types
  2. \n
  3. com.vinaysshenoy.types.Types具有 的静态导入com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl,因此编译器会查看嵌套GenericArrayTypeImpl类。
  4. \n
  5. com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl使用 ( java.lang.reflect.) GenericArrayType,但是,此时尚未处理该类型的导入,这会导致 \xe2\x80\x9ccannot find symbol\xe2\x80\x9d 错误。
  6. \n
\n\n

可以说,它也可以被认为是 JDK 的错误,它适用于某些编译器,但不适用于其他编译器。

\n