为了账号安全,请及时绑定邮箱和手机立即绑定

无法使用 Gradle 编译 Java 库,可与 IDE 一起使用

无法使用 Gradle 编译 Java 库,可与 IDE 一起使用

慕婉清6462132 2022-05-25 10:15:30
当我尝试通过 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"}
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

为了构建项目,请使用完全限定名称来实现定义的静态嵌套类的接口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 { ... }

此外,如果您不想使用完全限定名称,则只需将静态嵌套类提取到顶层即可。


笔记:


当使用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 上的描述重现。


查看完整回答
反对 回复 2022-05-25
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

解决方案

@Zgurskyi 的回答是一个很好的解决方法,但是,我相信它只能解决实际问题的症状(见下文)。这是解决根本问题的另一种恕我直言的更清洁方法:导入com.vinaysshenoy.types.util.Utilfrom 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

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;也许命令行上的@Zgurskyijavac不是来自Gradle 使用的同一个JDK。)

实际问题

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

在您的情况下,Gradle 使用的 Java 编译器在以下情况下无法正确解析导入(只是对编译器所做工作的粗略、不是非常技术性的描述):

  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 错误,它适用于某些编译器,但不适用于其他编译器。


查看完整回答
反对 回复 2022-05-25
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

我检查了您的项目,并且可以使用gradlew clean build.

我假设gradle 找不到 JDK 安装,因为

  • 未安装 JDK(IDE 通常带有自己的捆绑安装),或者

  • 环境变量未正确设置(设置并将其JAVA_HOME指向您的 JDK 安装目录)。


查看完整回答
反对 回复 2022-05-25
  • 3 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信