Flutter doctor --android-licenses命令出现Java错误。

337
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
    at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
    at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
    at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 5 more

当我运行flutter doctor --android-licenses时,出现上述错误。有人知道为什么会发生这种情况以及我该如何解决吗?我已经在flutter控制台上运行它了。

16个回答

720

我安装了Android SDK 命令行工具,从Android SDK Manager中进行。

  1. 打开工具>SDK Manager
  2. 从左边选择外观和行为>系统设置>Android SDK
  3. 从顶部菜单选择SDK Tools
  4. 选中Android SDK 命令行工具并点击“应用”。

步骤#1的替代方法:WINDOWS:文件>设置(Ctrl+Alt+S) / MAC: Android Studio>首选项

这个解决方案适用于WindowsLinuxMac OS X


这里输入图片描述

如果您尝试上述步骤仍然遇到问题,可以尝试将系统升级到JDK 8。 JDK 8升级的官方文档在这里


9
谢谢!这解决了问题,但为什么呢?如果Flutter Doctor需要SDK命令行工具,那为什么这些工具没有与Flutter一起打包呢? - ahmadkarimi12
5
“Android SDK Command-line tools” 是一个 Android SDK 包工具,包含在你的 Android Studio 中(参考链接:https://developer.android.com/studio/command-line)。它无法包含在 Flutter 安装中。 - sariDon
2
显然,在MacBook上需要这个,但在Windows上不需要。我没有在Windows中设置命令行工具。 - Syed Ali
15
我在Windows环境下遇到了问题。 - sariDon
2
出人意料的是,这个解决方案即使对于使用VS Code进行开发的人也能解决问题。 - Stefan
显示剩余3条评论

165

我是Mac用户,我解决了这个问题。

根据用户的反馈,这个答案也可以帮助Windows用户和Linux用户解决这个问题。

首先,这是我遇到的问题:

$ flutter doctor -v enter image description here

以下命令在我的情况下无效:

$ flutter doctor --android-licenses enter image description here

解决这个问题的方法是安装Android SDK命令行工具。怎么做呢?只需要按照以下两个步骤即可。

安装:Android SDK命令行工具

步骤1. 打开SDK管理器
顶部菜单 -> 工具 -> SDK管理器 enter image description here

步骤2. 安装命令行工具

  1. 展开外观和行为
  2. 展开系统设置
  3. 点击Android SDK
  4. 点击SDK工具选项卡
  5. 勾选Android SDK命令行工具(最新版)
  6. 点击应用按钮。 在此输入图片描述 然后点击“确定”按钮完成安装。

继续签署Android许可证。

在Android Studio安装完成后,您可以执行以下步骤。
$ flutter doctor --android-licenses
在此输入图片描述 回答yes多次后,所有的Android许可证都已经签署完毕。

再次通过flutter doctor进行检查。

$ flutter doctor -v
在此输入图片描述

您可以看到 所有Android许可证均已被接受。

恭喜,您已经完成了这个任务!


3
适用于 Windows 操作系统。谢谢。 - yoadev
3
也适用于Linux操作系统。 - Marcin
2
在 MacBook M1 上工作过 ✅ - Sharjeel Ali
2
曾在Pops!_OS上工作过。 - Guillaume Petit
1
@sabertabatabaeeyazdi 很好!感谢您的反馈。它将帮助更多的人。 - Milo Chen
显示剩余7条评论

63

我曾遇到过同样的问题,通过安装Android Studio的命令行工具来解决它

点击文件,设置,然后在搜索栏中键入sdk并单击Android SDK Android Sdk

然后点击sdk工具,勾选android命令行工具框,然后点击应用程序允许下载。然后再次在cmd上运行flutter doctor --android-licenses,您将被提示接受许可证。


1
在Mac上,设置窗口可以在Android Studio -> 首选项下找到。 - rawbee

22

看起来您遇到了JDK异常,这通常是由于您的系统变量中没有设置JAVA_HOME,或者您已经几乎设置好了JDK但是在错误的文件夹中,或者您正在尝试使用错误的JDK运行SDK Manager(该管理器允许您接受Android许可证)。

针对JDK 9或更高版本:

实际上,Android SDK Manager仅适用于使用JDK 8版本进行编译的Gradle进行Android开发。因此,如果您的系统变量中已经设置了最新的JDK版本,请考虑将其降级为JDK版本8。

这个版本对我来说很好用:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

如果已安装JDK 8:

如果您手动将JDK文件夹提取到目录中,可能您设置了“错误”的路径。我的意思是:指向bin Java文件夹的路径是错误的,但它仍然可以工作。您必须将JAVA_HOME设置为JDK的根目录,例如:

在JDK压缩文件夹中,您需要提取它并将系统变量指向未解压缩的文件夹,而不是直接指向bin目录,您必须将JAVA_HOME指向系统变量并将bin文件夹声明为可执行文件。

示例:

Linux

在您的shell配置文件中:

export JAVA_HOME="/home/user/jdk1.8.0_261"
export PATH="$PATH:$JAVA_HOME/bin"

Windows

在您的环境变量管理器中:

设置一个名为JAVA_HOME的新系统变量

enter image description here

然后,编辑PATH变量并向其添加一个新的注册表:

%JAVA_HOME%\bin

其实,我不太清楚如何在MacOS中管理JDK,如果你的操作系统是这个的话,抱歉:(

希望能有所帮助!


1
这个解决方案在我的Windows 10上不起作用。 - Adrien Arcuri
@user12166478 非常感谢,这解决了我的问题。但我一直缺少的是我的变量系统名称是JAVA_HOME而不是bin,我将其更改为%JAVA_HOME%\bin,现在一切都像魔法般地运行!干杯 - Justin Imran
1
这个方法解决了我在Windows 10上的问题,谢谢!值得注意的是,参考JDK 8可以使用,而不需要更重的Oracle许可证。仍然觉得奇怪的是,Android Studio附带Java 11,但SDK工具仍然需要Java 8。 - Jason Etheridge

5

在Linux上

Android SDK 只能与 JDK 8 配合使用,因此卸载当前的 JDK 版本。

粘贴命令并按下 Tab 键以进行自动补全,删除所有以 openjdk- 开头的提示信息。

sudo apt remove openjdk-

现在安装JDK 8

sudo apt install openjdk-8-jdk

3

首先,您需要知道Flutter在JDK 8上运行,因此如果您安装了其他版本,则需要清除它们以完全删除其他版本。

注意:这是根据我的情况Ubuntu 20.04,这是根据我的情况,不能保证适用于您

如果您有JDK 11,则使用以下两个命令中的一个进行卸载,具体取决于您安装的哪个版本,或者如果您不知道其中哪个已安装在您的计算机上,则可以同时运行这两个命令。

sudo apt purge openjdk-11-jre-headless

sudo apt purge openjdk-11-jre

如果是其他版本,请用相应的数字替换11。 如果您使用默认的jdk,则可以使用以下命令卸载。
sudo apt purge default-jre

为了确保我们删除与Java相关的所有内容,请执行以下命令:
sudo apt auto remove

注意:您可以运行上述所有命令,以确保完全删除与Java相关的所有内容

为了验证我们已经删除了所有内容,运行以下命令:

java -v

如果您看到以下错误或Java版本,则表示Java尚未被卸载。
Unrecognized option: --version
Error: Could not create the Java Virtual Machine. 
Error: A fatal exception has occurred. Program will exit.

如果你收到“未找到Java”并且有Java安装建议的响应,这意味着Java已被卸载。

现在我们需要安装JDK 8,请运行以下命令。

sudo apt install openjdk-8-jre

如果一切顺利,请重新启动您的计算机,运行 flutter doctor 命令,并按照说明接受许可证。祝好,希望这篇文章对您有帮助。

除了卸载现有的Java版本外,您还可以使用 sudo apt purge openjdk* 卸载任何现有的Java版本,然后执行 sudo apt autoremove 清除并删除系统上的任何Java相关组件。 - Abdulbasit
1
我认为仅仅为了让 flutter doctor --android-licenses 起作用而卸载并重新安装一个特定的 Java 版本并不是一个好主意。实际上,如果你安装了多个版本的 Java,通过导出所需的版本来 switch 到另一个 Java 版本会更合适,例如:export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home/。在内部,flutter doctor 会检查 JAVA_HOME 是否有目标 Java 版本。好处显而易见,一次性在命令行窗口中执行导出命令不会对其他任何东西产生影响。 - Neil.Ling

3

对我而言,在Windows 10上,答案很简单——移除JAVA_HOME环境变量。

如果你是Java开发人员或者依赖于某些Java软件来完成工作,那么这可能不是一个好主意。但如果你是一个不从事Java开发的开发人员,而且像我一样刚开始接触Flutter,那么就进入系统环境变量并把它删除吧。在我这样做之后,flutter doctor --android-licenses 就能正常地工作了。


太奇怪了!这对我也起作用了。谢谢!我卡了好几个小时... - Josh O'Connor

3
我建议清除android-studio-dir和android-sdk设置,让flutter自动检测它们的路径:这对我有效。
flutter config --android-studio-dir=""

flutter config --android-sdk=""

2
@guccisekspir:它会如何检测?我需要再次运行flutter doctor吗? - Abhishek Thapliyal
它在我的macOS上运行良好。 - Gk Mohammad Emon

2
我的解决方案是: 我安装了Android SDK Build-Tools、Android Emulator和Android SDK Platform-Tools。同时,我在环境变量中设置了JAVA_HOME变量。
因此,我决定卸载Android SDK Build-Tools、Android Emulator和Android SDK Platform-Tools,并重新安装它们。此外,我删除了JAVA_HOME变量。然后,在终端中运行flutter doctor --android-licenses命令。结果一切都正常了。

1
我发现我需要将我的Android SDK命令行工具降级。
当我使用最新版本时,运行flutter doctor --android-licenses会显示以下内容:
$ flutter doctor --android-licenses
Error: LinkageError occurred while loading main class com.android.sdklib.tool.sdkmanager.SdkManagerCli
    java.lang.UnsupportedClassVersionError: com/android/sdklib/tool/sdkmanager/SdkManagerCli has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
Android sdkmanager tool was found, but failed to run (/Users/user/Library/Android/sdk/cmdline-tools/latest/bin/sdkmanager): "exited code 1".
Try re-installing or updating your Android SDK,
visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions.

然后我移除了Android SDK Command-line Tools (latest)(11)并添加了版本10。

enter image description here

只有在那之后,我才能接受这些许可证:
$ flutter doctor --android-licenses
Warning: Observed package id 'ndk-bundle' in inconsistent location '/Users/user/Library/Android/sdk/ndk-bundle.backup.version_17c' (Expected '/Users/user/Library/Android/sdk/ndk-bundle')
Warning: Observed package id 'ndk-bundle' in inconsistent location '/Users/user/Library/Android/sdk/ndk-bundle.backup.version_17c' (Expected '/Users/user/Library/Android/sdk/ndk-bundle')
[=======================================] 100% Computing updates...             
All SDK package licenses accepted.

1
很棒的降级到10版本。对我很有帮助,谢谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接