如何修复 Android Studio 中的“模块 java.base 不会“打开 java.io”到未命名模块的“错误”?

Ash*_*nxy 10 java android android-studio

背景

  1. 我在 android studio 开始了我的第一个项目,以熟悉 Android 编程。
  2. 我正在关注本教程,其中
  • 我创建了一个新项目 Empty Activity,没有任何更改
  • 它应该模拟一个显示“Hello World”消息的简单应用程序

问题描述 但是每次我尝试运行和构建(我现在想要模拟器)时,我都会收到以下错误消息。

Unable to make field private final java.lang.String java.io.File.path accessible:
Unable to make field private final java.lang.String java.io.File.path
accessible: module java.base does not "opens java.io" to unnamed module @42760a00
Run Code Online (Sandbox Code Playgroud)

这是我的配置设置

  1. Android Gradle 插件版本:4.2.1
  2. Gradle 版本:7.0.1(更改为解决我在同步 Gradle 时遇到的另一个问题(“Gradle 同步失败:不支持的类文件主要版本 60”)和基于此论坛上的讨论,如下所述)

Andrey Dernov 评论 2021 年 4 月 14 日 00:18 请使用 Gradle 7.0 或低于 16 版本的 JDK 来导入和构建项目(设置(macOS 上的首选项)| 构建、执行、部署 | 构建工具 | Gradle | Gradle JVM 选项)。

  1. JDK:16.0.1

有什么建议或想法吗?

lor*_*chi 312

GitHub上的解决方案对我有用。无需降级 Java JDK。只需将 gradle-wrapper 属性中的 gradle 版本更改为 7.1.1(6.x 不支持 java 16),并在 gradle.properties 中添加以下行:

org.gradle.jvmargs=-Xmx1536M \
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
--add-opens=java.base/java.io=ALL-UNNAMED \
--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)

  • 这对我也有用。但你能解释一下这条线到底是做什么的吗? (6认同)
  • 谢啦!它对我有用,我只是复制代码并将其粘贴到 android/gradle.properties (5认同)
  • 对于 ButterKnife 编译器,还要添加 `--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.code=全部未命名 --add-exports=jdk.compiler/com.sun.tools.javac.util=全部未命名` (3认同)
  • 这不是正确的答案,尽管它给了我改变 gradle 类路径的想法,并且中提琴它起作用了 (2认同)
  • 将属性更改为 7.3.3 并在 jvmargs 中进行更改后为我工作 (2认同)

usa*_*een 185

您使用的 JDK 版本必须不受 Gradle 版本支持。(无需降级)

1-从C:\Program Files\Java检查您的 JDK 版本。就我而言,它是 JDK-17.0.2

2-检查 JDK 的相应 Gradle 版本 https://docs.gradle.org/current/userguide/compatibility.html

3-从.\android\gradle\wrapper\打开gradle-wrapper.properties gradle-wrapper.properties 文件的屏幕截图并将distributionUrl更改为您所需的 gradle 版本

例如对于 JDK 17

distributionUrl = https\://services.gradle.org/distributions/gradle-7.3-all.zip
Run Code Online (Sandbox Code Playgroud)

4-从.\android\build.gradle打开build.gradle build.gradle 文件中的类路径 并将类路径中的插件更改为根据您的gradle版本的插件

例如

classpath("com.android.tools.build:gradle:4.2.2") for Gradle 6.7.1+
classpath("com.android.tools.build:gradle:7.0.0") for Gradle 7+
Run Code Online (Sandbox Code Playgroud)

检查您的 Gradle 版本的兼容插件: https://developer.android.com/studio/releases/gradle-plugin#updating-gradle

5 次运行npx react-native run-android


小智 23

曾在 Macbook Air M1 Apple Silicon 为我工作。您无需降级或卸载 Java JDK。

就我而言,只需将 gradle-wrapper.properties 中的 gradle 版本更改为 7.2,如下所示:

distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip 
Run Code Online (Sandbox Code Playgroud)

并在 gradle.properties 中添加以下行:

org.gradle.jvmargs=-Xmx1536M --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)

github上有相关解决方案


Tar*_*ood 15

在 gradle.properties 文件中添加此行。

org.gradle.jvmargs=-Xmx1536M --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)


And*_*rea 10

运行Flutter doctor,如果出现\xc2\xb4s 错误,表明无法找到\xc2\xb4t 捆绑的 java(特别是如果您有 Android Studio 版本Artic Fox),如果使用 Mac,请运行以下命令:

\n
    \n
  1. cd /Applications/Android\\ Studio.app/Contents/jre
  2. \n
  3. ln -s ../jre jdk
  4. \n
  5. ln -s "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin" jdk
  6. \n
\n

  • @lopes710原因是因为Artic Fox版本的java库位置不同,上面的命令是为了给出正确的路径。当您从旧版本的 Android Studio 转到 Artic Fox 时,通常会发生此错误 (2认同)

小智 10

就我而言,以下步骤成功了:

  1. 将 gradle-wrapper.properties 中的 gradle 版本更改为:
    distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将 build.gradle 中的 build gradle 和 google services 类路径版本更改为:
    dependencies {
        classpath 'com.android.tools.build:gradle:7.2.1'
        classpath 'com.google.gms:google-services:4.3.5'
    }
    
    Run Code Online (Sandbox Code Playgroud)


Ash*_*nxy 8

我发现这个讨论与我的问题有关。但无法弄清楚如何在 Android Studio 中传递 JVM 参数。

但是,用 JDK 15 替换 JDK 16 后错误消失了。

  • 我还通过将 jdk 16 替换为 1.8 来解决该问题。 (2认同)

Kew*_*hah 7

我能够通过使用 Android Studio 升级等级项目设置来修复它,并将其替换 classpath("com.android.tools.build:gradle:4.2.2")classpath('com.android.tools.build:gradle:7.0.3')inandroid/build.gradle


小智 6

我想我找到了解决方案。

如果您正在导入旧项目,您可能会遇到此错误。

基本上,您使用较低的 JDK 版本制作了旧项目,现在您的系统中当前安装了较高的 JDK 版本。

您应该避免使用更高的 JDK 版本来构建较旧的项目。

  1. 基本上下载 JDK 8 (1.8) 并安装它。
  2. 更改环境变量(将 JDK 8 路径写入环境变量)
  3. 然后更改您的项目结构并将 JDK 8 路径写入 JDK 位置。

在此处输入图片说明

  1. 使缓存无效并重新启动 android studio。
  2. 构建您的项目,它应该可以工作。

如果您收到以下错误:

Error:Cannot fit requested classes in a single dex file.Try supplying a main-dex list. # methods: 72477 > 65536
Run Code Online (Sandbox Code Playgroud)

然后在 app.gradle 文件中添加以下依赖项:

 // multidex
implementation 'com.android.support:multidex:1.0.3'
Run Code Online (Sandbox Code Playgroud)

那么你需要在你的 app.gradle 文件中启用 multidex。

android {
compileSdkVersion 30

defaultConfig {
    applicationId "com.convenient.easymeasure"
    minSdkVersion 19
    targetSdkVersion 30
    versionCode 1
    versionName "1.0"
    multiDexEnabled true

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Run Code Online (Sandbox Code Playgroud)


mod*_*diX 5

将 Android Studio 更新为 electric eel 后,我在 Flutter 2 项目中遇到了同样的问题。我仍然能够构建 android 项目,但flutter run在 Flutter 项目上会导致此问题。lortschi 的答案是关键,但它缺少一个使其工作的条目,所以我最终的 gradle.properties 现在看起来像这样:

org.gradle.jvmargs=-Xmx1536M \
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
--add-opens=java.base/java.io=ALL-UNNAMED \
--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED \
--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
android.useAndroidX=true
android.enableJetifier=true
Run Code Online (Sandbox Code Playgroud)

我非常怀疑,但它确实有效。


jon*_*jon 5

对于那些在最新 Android Studio - Electric Eel 版本以及其他金丝雀和预览版本中遇到这些问题的用户,请注意,jreAndroid Studio 安装文件夹中的捆绑目录现已重命名为jbr

(这个答案来自eja这个问题回答。)

要解决这个问题,只需创建一个符号链接jre-> jbr,Flutter 就不会抱怨。

在 Linux 上

cd ~/android-studio/ && ln -s jbr jre
Run Code Online (Sandbox Code Playgroud)

Windows(检查安装文件夹)

cd C:\Program Files\Android\Android Studio
mklink /D "jre" "jbr"
Run Code Online (Sandbox Code Playgroud)

或者

New-Item -ItemType SymbolicLink -Path .\jre -Target .\jbr
Run Code Online (Sandbox Code Playgroud)

苹果系统

cd /Applications/Android\ Studio.app/Contents
ln -s jbr jre
Run Code Online (Sandbox Code Playgroud)

请注意,如果您运行的是预览版,默认安装目录可能会有所不同,例如在 Linux 上,默认安装目录是

~/android-studio-preview/
Run Code Online (Sandbox Code Playgroud)


Mar*_*ues 5

这是 Gradle 在启用测试分发的情况下使用 Java 17 运行测试时的一个已知问题

将其添加到您的 build.gradle(.kts 版本可在下面的链接中找到)

tasks.named('test', Test) {
    jvmArgs(
        '--add-opens', 'java.base/java.lang=ALL-UNNAMED',
        '--add-opens', 'java.base/java.util=ALL-UNNAMED'
    )
}
Run Code Online (Sandbox Code Playgroud)

请参阅https://docs.gradle.com/enterprise/test-distribution/#accessing_jdk_internal_classes_from_your_tests

请参阅原始 github 问题https://github.com/gradle/gradle/issues/18647


小智 5

就我而言,当我使用时发生了错误

Gradle version = 6.5Gradle JDK version = 17.0.6Android Studio Giraffe (Stable)

您可以在文件中的这一行检查 Gradle 版本gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip

并检查 JDK 版本:

File > Settings > Build, Execution, Deployment > Build Tools > Gradle > Gradle JDK

要修复此错误,您需要选择与您的 Gradle Version 兼容的 JDK 版本。您可以在这里检查兼容性:

https://developer.android.com/build/releases/gradle-plugin#updating-gradle

我选择JDK 11.0.18Gradle version 6.5与我当前的 JDK 相比较低的 JDK 版本)

综上所述,选择兼容的JDK版本就是这个错误的答案。


anK*_*ner 5

降级你的Java版本。它对我有用

在此输入图像描述


Dhe*_*pta -2

检查 JDK 是否已安装或未配置您的 SDK,然后重试您可以从Java SE下载 JDK