无法使用Java 9运行sdkmanager --list(Android SDK)

Siu*_*ji- 79 java android android-sdk-tools android-sdk-manager java-9

我下载并安装了:

  • JDK(jdk-9.0.1_osx-x64_bin.dmg从Oracle)在这里
  • Android的SDK( sdk-tools-darwin-3859397.zip)从谷歌在这里.

配置PATH变量后,我尝试运行sdkmanager,它取代了android管理SDK组件的命令.但是,它失败了,如下所示:

$ 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
Run Code Online (Sandbox Code Playgroud)

这是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)
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何修复它而不回到Java 8?

相关问题

  • 无法安装android-sdk
    • 这篇文章提出了类似的问题.但是,帖子已经关闭,唯一的答案就是回到Java 8.

Siu*_*ji- 140

借助这个答案,我成功地解决了这个问题.

我们将要应用修复程序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"'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将以下选项附加到变量:-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee.请注意报价.在我的副本中,该行变为:

    DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 保存文件并退出编辑器.
  5. 再次运行该命令.

结果如下:

$ 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
...
Run Code Online (Sandbox Code Playgroud)

你好!有用!

- 编辑:2017-11-07 -

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

相关答案

  • /sf/answers/3050209921/
    • @ andy-guibert指出了实现这项工作的必要选择.他还简要介绍了那些神秘的选择.

  • 为什么不简单地导出`JAVA_OPTS`环境变量,`export JAVA_OPTS =' - XX:+ IgnoreUnrecognizedVMOptions --add-modules java.se.ee'`,而不是修补SDK源文件? (9认同)
  • FWIW,我今天在Windows 10上下载并安装了JDK和Android SDK工具,并且必须将该行设置为`set DEFAULT_JVM_OPTS =" - Dcom.android.sdklib.toolsdir =%~dp0 .." - XX:+ IgnoreUnrecognizedVMOptions --add-modules java.se.ee`让`com.android.sdklib.tool.SdkManagerCli`类正确运行 (5认同)
  • 这个`-XX:+ IgnoreUnrecognizedVMOptions --add-modules java.se.ee`或`--add-modules java.xml.bind在Mac OS上不能与Java 11一起使用.如何在不安装其他版本的Java的情况下修复它? (4认同)
  • 当系统中有 java 11 时,@SherylHohman 提出的解决方案必须与这个结合起来,java 11 必须从列表中“隐藏”才能使其工作 (2认同)
  • 在使用 Java --version 11 的 ubuntu 18.04 中,这不起作用,而是抛出错误 ``` 启动层 java.lang.module.FindException 初始化期间发生错误:重新运行后未找到模块 java.se.ee ```命令 (2认同)
  • 从 Java 11 或更高版本开始,此解决方案不再适用,因为 Java EE API 不再包含在 JDK 包中。如果可以选择降级 Java,Java 1.8 也可以正常工作。 (2认同)

Nat*_*ram 35

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

OpenJDK的10是由OpenJDK的11 superseeded,它没有实现java.se.ee 在所有。这意味着添加的黑客--add-modules java.se.ee不再做任何事情。这也意味着 OpenJDK 10 将自动从您的系统中删除,并在您下次更新时替换为 OpenJDK 11,如果您的更新配置正确。

sdkmanager通过将JAVA_HOME inside 设置sdkmanager为 Java 8 安装来修改以使用 Java 8 。默认情况下,它位于~/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'
Run Code Online (Sandbox Code Playgroud)
@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\.."
Run Code Online (Sandbox Code Playgroud)

这样,您可以在系统上继续使用一个健全且维护良好的 Java 版本,同时使用sdkmanager.

@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\.."
Run Code Online (Sandbox Code Playgroud)

现在我有一些管道要修理。

  • `set JAVA_HOME="...\android-studio\current\jre"` 在 Windows 10 上帮助我,而所有其他答案都没有 (3认同)
  • 2022 年 3 月,这个答案仍然有效 +1 (2认同)

bem*_*mpa 33

您可以使用SDKMANAGER_OPTS设置sdkmanager选项.

例:

export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list
Run Code Online (Sandbox Code Playgroud)

  • java.se.ee不再存在。 (7认同)
  • 请注意在Windows上你应该省略引号:`set SDKMANAGER_OPTS = - add-modules java.se.ee` (4认同)
  • 这个答案已经过时了,请有人修复这个问题 (4认同)

aar*_*rkk 30

通过 Android Studio 在 SDK 管理器中安装命令行工具。

安装命令行工具

然后从cmdline-tools目录(而不是tools目录)运行 SDK Manager 的版本。

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

  • 这应该是正确答案 (6认同)

小智 15

在此输入图像描述

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

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


Sag*_*tri 12

对于Windows,如果没有任何作用,请尝试这样:

  • sdkmanager.bat用记事本打开.

  • 找到以下行:

    %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%

  • 在Windows 10上为我工作. (3认同)

tho*_*ris 11

系统中装有Java 11时,提供的解决方案无效。

-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or在Mac OS上,此--add-modules java.xml.bind不适用于Java 11。

因此,您必须从此处将Java版本降级为版本8:http : //www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

列出已安装的Java版本

/usr/libexec/java_home -V
Run Code Online (Sandbox Code Playgroud)

Java 11

export JAVA_HOME=$(/usr/libexec/java_home -v 11)
Run Code Online (Sandbox Code Playgroud)

Java 1.8

export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
Run Code Online (Sandbox Code Playgroud)

然后去

cd ~/Library/Android/sdk/tools/bin
Run Code Online (Sandbox Code Playgroud)

./sdkmanager --licenses
Run Code Online (Sandbox Code Playgroud)


cod*_*ade 9

在我们阅读之前的评论时,发生此错误是因为当前的SDK版本与最新的Java版本不兼容:9和10.

因此,要解决此问题,您可以将Java版本降级到Java 8,或者作为解决方法,您可以在终端上导出以下选项:

Linux的:

export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
Run Code Online (Sandbox Code Playgroud)

Windows:

set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
Run Code Online (Sandbox Code Playgroud)

这将解决此错误 sdkmanager

并使其永久保存您可以导出JAVA_OPTS在您的个人资料文件在Linux( .zshrc,.bashrc等)或添加到环境变量永久在Windows上.

  • 错误说现在找不到Module java.xml.bind (10认同)
  • 当我尝试这个时,我得到另一个错误:在启动层初始化期间发生错误java.lang.module.FindException:找不到模块java.se.ee' (9认同)
  • 尝试使用`--add-modules java.xml.bind`代替`--add-modules java.se.ee` (2认同)

小智 9

正如一些人之前提到的,这很可能是一个更简单的问题,因为一个 Java 安装优先于另一个。

在我的情况下,Java 8 被默认的较新 Java 掩盖了。

我安装了 Java 8:

sudo apt-get install openjdk-8-jdk
Run Code Online (Sandbox Code Playgroud)

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

sudo update-alternatives --config java
Run Code Online (Sandbox Code Playgroud)

其中我选择了java 8的id号。

完成这些(非常简单的)步骤后,我可以毫无错误地运行 sdkmanager。

希望这可以帮助某人!


Ger*_*man 6

Android Tools仍然与JDK 9或10不兼容。您需要安装JDK 8,或者,如果需要多个Java版本,请确保系统范围的Java主页指向JDK 8。

此处有更多详细信息:如何将Unity 2017.4配置为以Android为目标并避免在OSX上构建失败?


小智 5

我很难找到这个解决方案,只需添加工作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
Run Code Online (Sandbox Code Playgroud)


G00*_*0fY 5

更新2019-10:

问题追踪器所述,Google正在开发一个新的SDK工具版本,该版本可在当前JVM(9+)上运行!

您已经可以在Android Studio内部的canary通道上下载并使用新的Android SDK命令行工具(1.0.0 rc1),也可以通过从Google服务器手动下载它们:

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

如果您手动打开命令行工具的包装,请注意将其放在您的子文件夹中$ANDROID_HOME(例如$ANDROID_HOME/cmdline-tools/...)。

  • 命令行工具 2.1(最新)在 Java 11 中也会出现这样的问题。 (2认同)

归档时间:

查看次数:

60524 次

最近记录:

5 年,11 月 前