使用 Java9运行 sdkmanager —— list 失败

我下载并安装了:

  • 来自 Oracle 给你的 JDK (jdk-9.0.1_osx-x64_bin.dmg)
  • Android SDK (sdk-tools-darwin-3859397.zip) from Google 给你.

在配置了 PATH变量之后,我尝试运行 sdkmanager,它替换了用于管理 SDK 组件的 android命令。然而,它失败了,如下所示:

$ sdkmanager --list
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.SdkManagerCli.main(SdkManagerCli.java:117)
at com.android.sdklib.tool.SdkManagerCli.main(SdkManagerCli.java:93)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 5 more

下面是 Java 版本:

$ java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)

有人知道如何在不回到 Java8的情况下修复它吗?

相关问题

警告

请注意,我已经提到了上面回到 爪哇8或并排运行它是 没有我想要的。

151114 次浏览

这个答案的帮助下,我成功地解决了这个问题。

我们将在 sdkmanager中应用一个修复程序。这是一个 shell 脚本。它位于 $android_sdk/tools/bin$android_sdk是您解压 Android SDK 的地方。

  1. 在您喜欢的编辑器中打开 sdkmanager
  2. 找到设置 DEFAULT_JVM_OPTS变量的行。在我的副本中,它在第31行:

    DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'
    
  3. Append the following options to the variable: -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee. Please pay attention to the quotes. In my copy, the line becomes:

    DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
    
  4. Save the file and quit the editor.
  5. Run the command again.

Here is the result:

$ sdkmanager --list
Installed packages:
Path    | Version | Description              | Location
------- | ------- | -------                  | -------
tools   | 26.0.1  | Android SDK Tools 26.0.1 | tools/


Available Packages:
Path                              | Version      | Description
-------                           | -------      | -------
add-ons;addon-g..._apis-google-15 | 3            | Google APIs
add-ons;addon-g..._apis-google-16 | 4            | Google APIs
add-ons;addon-g..._apis-google-17 | 4            | Google APIs
add-ons;addon-g..._apis-google-18 | 4            | Google APIs
add-ons;addon-g..._apis-google-19 | 20           | Google APIs
add-ons;addon-g..._apis-google-21 | 1            | Google APIs
add-ons;addon-g..._apis-google-22 | 1            | Google APIs
add-ons;addon-g..._apis-google-23 | 1            | Google APIs
add-ons;addon-g..._apis-google-24 | 1            | Google APIs
...

你好,成功了!

—— Edit: 2017-11-07——编辑: 2017-11-07

请注意,在运行 sdkmanager --update之后,您可能需要再次应用上面的修复程序,因为如果更新了 tools包,sdkmanager shell 脚本可能会被覆盖。

相关答案

我花了很长时间才找到这个解决方案,只是添加了可以工作的 sdkmanager. bat

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  sdkmanager startup script for Windows
@rem
@rem ##########################################################################


@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal


set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%..


@rem Add default JVM options here. You can also use JAVA_OPTS and SDKMANAGER_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.."




@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome


set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init


echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.


goto fail


:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe


if exist "%JAVA_EXE%" goto init


echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.


goto fail


:init
@rem Get command-line arguments, handling Windows variants


if not "%OS%" == "Windows_NT" goto win9xME_args


:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2


:win9xME_args_slurp
if "x%~1" == "x" goto execute


set CMD_LINE_ARGS=%*


:execute
@rem Setup the command line


set CLASSPATH=%APP_HOME%\lib\sdklib-25.3.1.jar;%APP_HOME%\lib\layoutlib-api-25.3.1.jar;%APP_HOME%\lib\dvlib-25.3.1.jar;%APP_HOME%\lib\repository-25.3.1.jar;%APP_HOME%\lib\gson-2.2.4.jar;%APP_HOME%\lib\commons-compress-1.8.1.jar;%APP_HOME%\lib\httpclient-4.1.1.jar;%APP_HOME%\lib\httpmime-4.1.jar;%APP_HOME%\lib\common-25.3.1.jar;%APP_HOME%\lib\kxml2-2.3.0.jar;%APP_HOME%\lib\annotations-25.3.1.jar;%APP_HOME%\lib\annotations-12.0.jar;%APP_HOME%\lib\jimfs-1.1.jar;%APP_HOME%\lib\httpcore-4.1.jar;%APP_HOME%\lib\commons-logging-1.1.1.jar;%APP_HOME%\lib\commons-codec-1.4.jar;%APP_HOME%\lib\guava-18.0.jar


@rem Execute sdkmanager
"%JAVA_EXE%" %DEFAULT_JVM_OPTS%  -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee  %JAVA_OPTS% %SDKMANAGER_OPTS%  -classpath "%CLASSPATH%" com.android.sdklib.tool.SdkManagerCli %CMD_LINE_ARGS%


:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd


:fail
rem Set variable SDKMANAGER_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%SDKMANAGER_EXIT_CONSOLE%" exit 1
exit /b 1


:mainEnd
if "%OS%"=="Windows_NT" endlocal


:omega

可以使用 SDKMANAGER _ OPTS 设置 SDKMANAGER 选项。

例如:

export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list

The Android Tools are still incompatible with JDK 9 or 10. You need to install JDK 8 or, if you need multiple Java versions make sure that the system-wide Java home points to a JDK 8.

详情请浏览这里: How to configure Unity 2017.4 to target Android and avoid build failures on OSX?

对于 Windows 系统,如果没有任何效果,那么尝试以下方法:

  • Open sdkmanager.bat with Notepad.

  • 找到以下一行:

    %JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS%

  • 加入 --add-modules java.xml.bind

修改后的行应该是这样的:

%JAVA_EXE%" %DEFAULT_JVM_OPTS% --add-modules java.xml.bind %JAVA_OPTS% %SDKMANAGER_OPTS%

正如我们在前面的注释中读到的那样,这个错误的发生是因为当前的 SDK 版本与最新的 Java 版本(9和10)不兼容。

所以,为了解决这个问题,你可以把你的 Java 版本降级到 Java8,或者作为一个解决方案,你可以在你的终端上导出以下选项:

Linux:

export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

视窗 :

set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'

如果这不工作尝试导出 java.xml.bind而不是。

Linux:

export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.xml.bind'

视窗 :

set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.xml.bind'

这将解决 sdkmanager的这个错误

为了让它永久保存,你可以导出你在 Linux 上的配置文件中的 JAVA _ OPTS (.zshrc.bashrc等等) ,或者把它作为一个永久的环境变量添加到 Windows 上。


注意。这不适用于没有 JavaEE 模块的 Java11/11 + 。对于这个选项是一个好主意,降级您的 Java 版本或等待 Flutter 更新

档号: JDK11: JavaEE 模块的终结

当系统中有 java11时,所提供的解决方案是无效的。

这个 -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or—— add-module Java.xml.bind 不能在 Mac OS 上与 Java11一起工作。

由于这个原因,您必须从这里将 java 版本降级到版本8: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

列出已安装的 Java 版本

/usr/libexec/java_home -V

爪哇11

export JAVA_HOME=$(/usr/libexec/java_home -v 11)

Java 1.8

export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

那就去

cd ~/Library/Android/sdk/tools/bin

还有

./sdkmanager --licenses

Https://adoptopenjdk.net 目前支持从版本8开始的所有 JDK 发行版。 例如 < a href = “ https://optopenjdk.net/release ases.html # x64 _ win”rel = “ nofollow norefrer”> https://adoptopenjdk.net/releases.html#x64_win

下面的例子说明了我是如何使用 JDK 版本8和 sdkmanager 以及更多内容的: https://travis-ci.com/mmcc007/screenshots/builds/109365628

对于 JDK 9(我认为可能是10,也可能是11,但不是12或更多) ,以下内容可以让 sdkmanager 工作起来:

export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list

我可以通过使用一个经过编辑的 sdkmanager. bat 文件解决这个问题,方法是强制使用嵌入在 Android Studio 本身中的 Java,我推测 Android Studio 使用的是 OpenJDK 8。以下是我使用过的经过编辑的 sdkmanager:

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  sdkmanager startup script for Windows
@rem
@rem ##########################################################################


@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal


set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%..


@rem Add default JVM options here. You can also use JAVA_OPTS and SDKMANAGER_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.."


@rem find Java from Android Studio
@rem Find java.exe
if defined ANDROID_STUDIO_JAVA_HOME goto findJavaFromAndroidStudioJavaHome


set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init


goto findJavaNormally


:findJavaFromAndroidStudioJavaHome
set JAVA_HOME=%ANDROID_STUDIO_JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe


if exist "%JAVA_EXE%" goto init


goto findJavaNormally








@rem java from java home
@rem Find java.exe
:findJavaNormally
if defined JAVA_HOME goto findJavaFromJavaHome


set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init


goto javaError


:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe


if exist "%JAVA_EXE%" goto init


goto javaDirectoryError






:javaError
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.


goto fail


:javaDirectoryError
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.


goto fail




:init
@rem Get command-line arguments, handling Windows variants


if not "%OS%" == "Windows_NT" goto win9xME_args


:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2


:win9xME_args_slurp
if "x%~1" == "x" goto execute


set CMD_LINE_ARGS=%*


:execute
@rem Setup the command line


set CLASSPATH=%APP_HOME%\lib\dvlib-26.0.0-dev.jar;%APP_HOME%\lib\jimfs-1.1.jar;%APP_HOME%\lib\jsr305-1.3.9.jar;%APP_HOME%\lib\repository-26.0.0-dev.jar;%APP_HOME%\lib\j2objc-annotations-1.1.jar;%APP_HOME%\lib\layoutlib-api-26.0.0-dev.jar;%APP_HOME%\lib\gson-2.3.jar;%APP_HOME%\lib\httpcore-4.2.5.jar;%APP_HOME%\lib\commons-logging-1.1.1.jar;%APP_HOME%\lib\commons-compress-1.12.jar;%APP_HOME%\lib\annotations-26.0.0-dev.jar;%APP_HOME%\lib\error_prone_annotations-2.0.18.jar;%APP_HOME%\lib\animal-sniffer-annotations-1.14.jar;%APP_HOME%\lib\httpclient-4.2.6.jar;%APP_HOME%\lib\commons-codec-1.6.jar;%APP_HOME%\lib\common-26.0.0-dev.jar;%APP_HOME%\lib\kxml2-2.3.0.jar;%APP_HOME%\lib\httpmime-4.1.jar;%APP_HOME%\lib\annotations-12.0.jar;%APP_HOME%\lib\sdklib-26.0.0-dev.jar;%APP_HOME%\lib\guava-22.0.jar


@rem Execute sdkmanager
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS%  -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS%


:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd


:fail
rem Set variable SDKMANAGER_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%SDKMANAGER_EXIT_CONSOLE%" exit 1
exit /b 1


:mainEnd
if "%OS%"=="Windows_NT" endlocal


:omega

这里我使用了一个环境变量 ANDROID _ STUDIO _ JAVA _ HOME,它实际上指向嵌入在 ANDROID 工作室中的 JRE,例如: . ./ANDROID _ Studio/JRE

如果没有设置 ANDROID _ STUDIO _ JAVA _ HOME,那么它也会回退到 JAVA _ HOME。

截至2019年2月,这个已被接受的答案已经过时。这就是答案将一直工作到 sdkmanager迁移到新版本的 Java。但到那时,你就不会再有这个问题了。

OpenJDK 10被 OpenJDK 11 所取代,它不实现 java.se.ee 完全没有。这意味着添加 --add-modules java.se.ee的代码不再起任何作用。这也意味着 OpenJDK 10将自动从您的系统中删除,并在您下次更新时被 OpenJDK 11替换,如果您的更新配置正确的话。

通过将 JAVA_HOME在里面sdkmanager设置为 Java8安装,修改 sdkmanager以使用 Java8。默认是 ~/Android/Sdk/tools/bin/sdkmanager

# Add default JVM options here. You can also use JAVA_OPTS and SDKMANAGER_OPTS to pass JVM options $
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions'
@rem Add default JVM options here. You can also use JAVA_OPTS and SDKMANAGER_OPTS to pass JVM options to this script.
set JAVA_HOME="C:\ProgramData\scoop\apps\android-studio\current\jre"
set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.."

通过这种方式,您可以在系统上继续使用健全的、维护的 Java 版本,同时使用 sdkmanager

# Java
export JAVA_HOME=/usr/lib/jvm/default-java

现在我有些 管道需要修复。

在升级到最新版本之前,使用 android sdk 工具对 openJDK 11进行简短的补充。

上述解决方案对我不起作用

set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.."

为了实现这个功能,我从 maven repo 安装了 jaxb-ri (参考实现)。

信息被给予 https://github.com/javaee/jaxb-v2和链接到 https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/2.3.2/jaxb-ri-2.3.2.zip
此下载包括 mod-Folder 中的独立运行时实现。

我将 mod-Folder 复制到 $android _ sdk tools lib 中,并将以下内容添加到类路径变量:

;%APP_HOME%\lib\mod\jakarta.xml.bind-api.jar;%APP_HOME%\lib\mod\jakarta.activation-api.jar;%APP_HOME%\lib\mod\jaxb-runtime.jar;%APP_HOME%\lib\mod\istack-commons-runtime.jar;

所以最后看起来:

set CLASSPATH=%APP_HOME%\lib\dvlib-26.0.0-dev.jar;%APP_HOME%\lib\jimfs-1.1.jar;%APP_HOME%\lib\jsr305-1.3.9.jar;%APP_HOME%\lib\repository-26.0.0-dev.jar;%APP_HOME%\lib\j2objc-annotations-1.1.jar;%APP_HOME%\lib\layoutlib-api-26.0.0-dev.jar;%APP_HOME%\lib\gson-2.3.jar;%APP_HOME%\lib\httpcore-4.2.5.jar;%APP_HOME%\lib\commons-logging-1.1.1.jar;%APP_HOME%\lib\commons-compress-1.12.jar;%APP_HOME%\lib\annotations-26.0.0-dev.jar;%APP_HOME%\lib\error_prone_annotations-2.0.18.jar;%APP_HOME%\lib\animal-sniffer-annotations-1.14.jar;%APP_HOME%\lib\httpclient-4.2.6.jar;%APP_HOME%\lib\commons-codec-1.6.jar;%APP_HOME%\lib\common-26.0.0-dev.jar;%APP_HOME%\lib\kxml2-2.3.0.jar;%APP_HOME%\lib\httpmime-4.1.jar;%APP_HOME%\lib\annotations-12.0.jar;%APP_HOME%\lib\sdklib-26.0.0-dev.jar;%APP_HOME%\lib\guava-22.0.jar;%APP_HOME%\lib\mod\jakarta.xml.bind-api.jar;%APP_HOME%\lib\mod\jakarta.activation-api.jar;%APP_HOME%\lib\mod\jaxb-runtime.jar;%APP_HOME%\lib\mod\istack-commons-runtime.jar;

也许我错过了一个图书馆,因为一些小错误显示。但是 sdkmanager.bat --update or --list is running now.

对我来说,唯一可行的解决方案就是使用 Android 工作室提供的 Java。

set the JAVA_HOME to /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home

in .bashrc

set JAVA_HOME="/Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home"

如果您使用的是 fish shell,请将其放在 ~/.config/fish/config.fish

set -gx JAVA_HOME /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home

(This is for mac, but I am sure it should work with linux and windows by setting the correct path)

Another solution possible to this error is check your Java version, maybe you can solve it downloading this jdk 甲骨文 JDK-8, this was my mistake :P

2019-10年度最新情况:

作为 在问题跟踪程序中说明,Google 一直在开发一个新的 SDK 工具版本,它可以在当前的 JVM (9 +)上运行!

你可以在 Android Studio 中下载并使用新的 Android SDK Command-line Tools,或者从 Google 服务器上手动下载:

对于最新版本,请检查 repository.xml中的 URL。

如果您手动解压命令行工具,请注意将它们放在 $ANDROID_HOME内的子文件夹中(例如 $ANDROID_HOME/cmdline-tools/...)。

更新2021-03:

最新的稳定命令行工具也可在 谷歌下载-网站上获得

As some people have mentioned before, this very well could be a simpler problem having to do with one java installation taking precedence over the other.

在我的案例中,java 8被默认的较新的 java 所掩盖。

我安装了 java 8:

sudo apt-get install openjdk-8-jdk

然后我将安装的 java 更新为新的默认值:

sudo update-alternatives --config java

我选择了 java 8的 id 号。

完成这些(非常简单的)步骤之后,我就可以运行 sdkmanager 而不出错了。

希望这对谁有帮助!

JDK 13.0.1,Android SDK 29,Windows 10

Basically i tried everything, but the most effective and only 1 solution that worked for me was to downgrade to jdk 1.8. I dont why, it is early 2020 and have to downgrade to 1 year old jdk version against latest flutter version. Maybe problem is in windows version, cause jdk 13.0.1 worked for me on macOS 10.15.2. Hope this solution works.

下载链接(JDK 1.8.0) : Https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

您只需要安装 jaxb har 文件并将其包含在类路径中。这个工程在 java 11至12最新。

To those who are looking for the fix i made some gist in github hope this help. and the links are provided also.

Https://gist.github.com/try-parser/b7106d941cc9b1c9e7b4c7443a7c3540

This is what I did in Ubuntu 18.04 (Any Linux will do):

$ sudo apt-get install openjdk-8-jdk


$ sudo update-alternatives --config java
There are 2 choices for the alternative javac (providing /usr/bin/javac).


Selection    Path                                          Priority   Status
------------------------------------------------------------
0            /usr/lib/jvm/java-11-openjdk-amd64/bin/javac   1111      auto mode
1            /usr/lib/jvm/java-11-openjdk-amd64/bin/javac   1111      manual mode
* 2            /usr/lib/jvm/java-8-openjdk-amd64/bin/javac    1081      manual mode


Press <enter> to keep the current choice[*], or type selection number: 2


$ export JAVA_HOME=$(/usr/lib/jvm/java-1.8.0-openjdk-amd64)

在.bashrc 或.zhrc 中定义不同 JDK 版本的主目录:

export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_14_HOME=$(/usr/libexec/java_home -v14)

首先使用 JDK 版本8。将这一行放在 sdkmanager文件的顶部:

export JAVA_HOME=$JAVA_8_HOME

切换回 JDK 版本14。将这一行放在 sdkmanager文件的底部:

export JAVA_HOME=$JAVA_14_HOME

因为整个 JAXBAPI 都被删除了,所以这是使 Java11及以上版本能够正常工作的答案。

Download Jakarta XML Binding, specifically 这个拉链 file. You need only the 3 files within mod folder i.e. jakarta.activation.jar, jakarta.xml.bind-api.jar and jakarta.xml.bind-api.jar and you can toss the rest off.

将这些文件移动到 APP _ HOME/lib 文件夹。我在其中创建了一个子文件夹 Jaxb。在我的 MacOS 系统上是这样的: $HOME/Library/Android/sdk/tools/lib/jaxb

Now open sdkmanager using your favorite text editor and under CLASSPATH= add the following at th beginning:

$APP_HOME/lib/jaxb/jakarta.activation.jar:$APP_HOME/lib/jaxb/jakarta.xml.bind-api.jar:$APP_HOME/lib/jaxb/jaxb-impl.jar

结果看起来像是:

CLASSPATH=$APP_HOME/lib/jaxb/jakarta.activation.jar:$APP_HOME/lib/jaxb/jakarta.xml.bind-api.jar:$APP_HOME/lib/jaxb/jaxb-impl.jar:$APP_HOME/lib/dvlib-26.0.0-dev.jar:$APP_HOME/lib/jimfs-1.1.jar:$APP_HOME/lib/jsr305-1.3.9.jar:$APP_HOME/lib/repository-26.0.0-dev.jar:$APP_HOME/lib/j2objc-annotations-1.1.jar:$APP_HOME/lib/layoutlib-api-26.0.0-dev.jar:$APP_HOME/lib/gson-2.3.jar:$APP_HOME/lib/httpcore-4.2.5.jar:$APP_HOME/lib/commons-logging-1.1.1.jar:$APP_HOME/lib/commons-compress-1.12.jar:$APP_HOME/lib/annotations-26.0.0-dev.jar:$APP_HOME/lib/error_prone_annotations-2.0.18.jar:$APP_HOME/lib/animal-sniffer-annotations-1.14.jar:$APP_HOME/lib/httpclient-4.2.6.jar:$APP_HOME/lib/commons-codec-1.6.jar:$APP_HOME/lib/common-26.0.0-dev.jar:$APP_HOME/lib/kxml2-2.3.0.jar:$APP_HOME/lib/httpmime-4.1.jar:$APP_HOME/lib/annotations-12.0.jar:$APP_HOME/lib/sdklib-26.0.0-dev.jar:$APP_HOME/lib/guava-22.0.jar

差不多就是这样,应该能解决这个问题。

I did these steps because flutter doctor --android-licenses was giving me issues. And this fixed it.

I download Java 8 SDK

  1. 预先卸载 java
  2. 关闭机器人工作室
  3. 安装 java 8
  4. 运行-> cmd-> flutter doctor --install -licenses 之后
flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, v1.12.13+hotfix.9, on Microsoft Windows [Version 10.0.19041.388], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[√] Android Studio (version 4.0)
[√] VS Code (version 1.47.3)
[!] Connected device
! No devices available


! Doctor found issues in 1 category
display  and finish

显然,如果您使用的“ commandlinetools”版本大于3.6.0,您可以使用 JDK11 + 来安装 Android SDK 组件。

他们可以在这里: https://developer.android.com/studio#command-tools

官方问题追踪说,这是固定的: https://issuetracker.google.com/issues/122210344#comment11

(窗户)

如果您已经安装了 Android Studio,请转到 File > > Project Structure... > > SDK Location。

去那个位置 + \cmdline-tools\latest\bin 将路径复制到 Environment Variables

使用命令行工具是可以的。

If you are using flutter, 运行这个命令 flutter doctor --android-licenses

对于 mac 上的用户,我通过修改我的 zhrc 文件并添加以下内容(尽管 java _ home 的配置可能有所不同)解决了一个类似的问题:

export JAVA_HOME=$(/usr/libexec/java_home)
export ANDROID_HOME=/Users/YOURUSER/Library/Android/sdk
export PATH=$PATH:/Users/YOURUSER/Library/Android/sdk/tools
export PATH=$PATH:%ANDROID_HOME%\tools
export PATH=$PATH:/Users/YOURUSER/Library/Android/sdk

转到 {SDK_FOLDER}/lib/_/(下划线文件夹)。将所有文件从 _文件夹复制到其父文件夹 /lib

enter image description here

我只是添加了“ Android SDK 命令行工具(最新)”,这解决了我的问题。

来自这里: Https://github.com/flutter/flutter/issues/56778#issuecomment-742639036

Install the Command-line Tools in the SDK Manager via Android Studio.

Installing Command-line Tools

然后运行 SDK Manager 来自 ABC0目录,而不是 tools目录版本。

$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --version # GOOD!
$ANDROID_HOME/tools/bin/sdkmanager                --version # BAD! (java.lang.NoClassDefFoundError)

我在尝试使用统一引擎构建 apk 时也有同样的错误。 这个错误的主要问题是使用“ jdk11”而不是“ jdk8”。 我已经完成了下面的步骤,以成功地编译我的 apk

  1. 删除 Java 文件夹中的所有文件夹
  2. 卸载 System在此输入图像描述中的任何现有 Java 应用程序

3 Download java8 from oracle https://www.oracle.com/in/java/technologies/javase/javase-jdk8-downloads.html 4、安装。 通过以上步骤,我解决了这个问题

正如上面 Saifur Rahman Mohsin 所解释的,问题在于 sdmanager依赖于 J2EE 功能的可用性,而 J2EE 功能不再附带 JRE/JDK > = 11,所以这可以通过使用实现相同功能的 JAXB 类来解决。

However, you may prefer not (or not be able to) modify the sdkmanager script (e.g. because it is installed by some other process that you do not control). If you are running a Posix/Unix system (like GNU/Linux or BSD, maybe macOS) you may still have a chance.

至少在 sdk-tools-linux-4333796.zip附带的 sdkmanager中(也许在后来的版本中也是如此) ,如果您设置 $JAVA_HOME,它会尝试寻找 $JAVA_HOME/jre/sh/java以获得 IBM 的 AIX SDK 兼容性。因此,您可以利用这种兼容性检查来欺骗 sdkmanager使用一个包装器脚本,该脚本在调用真正的 java程序时将必要的类插入到类路径中。

例如,在已经安装了 OpenJDK 11的 Debian 中(包 openjdk-11-jreopenjdk-11-jdk) ,您可以这样做(作为 root 用户) :

# cd /usr/lib/jvm/java-11-openjdk-amd64  # use your Java home here
# mkdir -p jre/sh
# cd jre/sh
# touch java
# chmod a+rx java

然后编辑刚刚创建的 java脚本,并将这段 Bash 代码写入其中:

#!/bin/bash
cp="$JAVA_EXTRA_CLASSPATH" java="$JAVA_HOME/bin/java"
test "$cp" || exec "$java" "$@"


args=()
for arg in "$@"; do
if [[ "$setcp" ]]; then
cp="$arg:$cp" setcp=
elif [[ "$arg" =~ ^-(cp|-?classpath)$ ]]; then
setcp=y
else
args+=("$arg")
fi
done
exec "$java" -cp "$cp" "${args[@]}"

要使 sdkmanager使用包装器脚本并将 JAXB 类注入到类路径中,首先在系统中安装相关的 JAXB 包(在 Debian 中是 libjaxb-java) ,然后像这样使用 sdmanager:

$ export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"  # for Debian's OpenJDK 11
$ export JAVA_EXTRA_CLASSPATH="/usr/share/java/jaxb-impl.jar"  # for Debian's `libjaxb-java` package
$ (now run sdkmanager or other processes running it as usual)

请注意,$JAVA_EXTRA_CLASSPATH具有类路径语法,因此可以输入冒号分隔的项目列表。

我注意到这个技巧也适用于 Gradle 包装器,也许还有其他的,但是如果没有设置 $JAVA_EXTRA_CLASSPATH,它们可能是安全的。

我有一个 M1芯片组,唯一的解决方案是从 azul zuru 安装 JDK 8,然后将我的 JAVA _ HOME 更改为1.8并工作!