当我尝试通过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)
@Zgurskyi\xe2\x80\x99s 答案是一个很好的解决方法,但是,我相信它只能解决实际问题的症状(见下文)。com.vinaysshenoy.types.util.UtilHere\xe2\x80\x99是另一种更干净的方法来解决根本问题:使from com.vinaysshenoy.types.Types non-static的嵌套类型的导入:
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;\nRun Code Online (Sandbox Code Playgroud)\n\n(顺便说一句,除了 @Zgurskyi 之外,我还可以通过手动javac调用来重现这一点。我只安装了一个 JDK;也许javac命令行上的 @Zgurskyi\xe2\x80\x99s 与 Gradle 使用的 JDK 不同。)
您静态导入嵌套类(不仅仅是类成员),尽管这永远不是必要的。我\xe2\x80\x99m 实际上很惊讶这似乎通常有效,但显然一些 Java 编译器在某些情况下至少会卡住。
\n\n在您的情况下,Gradle 使用的 Java 编译器无法\xe2\x80\x99 正确解析以下场景中的导入(仅对编译器的功能进行粗略的、不是非常技术性的描述):
\n\ncom.vinaysshenoy.types.util.Util,编译器发现 的静态导入com.vinaysshenoy.types.Types.arrayOf,因此编译器会查看该类com.vinaysshenoy.types.Types。com.vinaysshenoy.types.Types具有 的静态导入com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl,因此编译器会查看嵌套GenericArrayTypeImpl类。com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl使用 ( java.lang.reflect.) GenericArrayType,但是,此时尚未处理该类型的导入,这会导致 \xe2\x80\x9ccannot find symbol\xe2\x80\x9d 错误。可以说,它也可以被认为是 JDK 的错误,它适用于某些编译器,但不适用于其他编译器。
\n| 归档时间: |
|
| 查看次数: |
664 次 |
| 最近记录: |