[英]Failed to run sdkmanager --list with Java 9
我下載並安裝了:
配置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)
有誰知道如何在不返回 Java 8 的情況下修復它?
請注意,我在上面已經提到,回到Java 8或並排運行它並不是我想要的。
在這個答案的幫助下,我成功地解決了這個問題。
我們將在sdkmanager
應用修復。 它是一個shell腳本。 它位於$android_sdk/tools/bin
,其中$android_sdk
是您解壓縮 Android SDK 的位置。
sdkmanager
。 找到設置DEFAULT_JVM_OPTS
變量的行。 在我的副本中,它位於第 31 行:
DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'
將以下選項附加到變量: -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee
。 請注意報價。 在我的副本中,該行變為:
DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
結果如下:
$ 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
...
你好! 它有效!
請注意,您可能需要在運行sdkmanager --update
后再次應用上述修復程序,因為如果tools
包更新, sdkmanager
shell 腳本可能會被覆蓋。
您可以使用 SDKMANAGER_OPTS 設置 sdkmanager 選項。
例子:
export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list
已接受的答案截至 2019 年 2 月已過時。 這是一個在sdkmanager
遷移到更新版本的 Java 之前將有效的答案。 但到那時,你就不會再有這個問題了。
OpenJDK的10是由OpenJDK的11 superseeded ,它沒有實現
java.se.ee
可言。 這意味着添加--add-modules java.se.ee
的黑客不再做任何事情。 這也意味着 OpenJDK 10 將自動從您的系統中刪除,並在您下次更新時替換為 OpenJDK 11,如果您的更新配置正確。通過將
sdkmanager
內的JAVA_HOME
設置為 Java 8 安裝,修改sdkmanager
以使用 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'
@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
現在我有一些管道要修理。
當系統中有 java 11 時,提供的解決方案無效。
此-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or
--add-modules java.xml.bind 不適用於 Mac OS 上的 Java 11。
因此,您必須從這里將 Java 版本降級到版本 8: http : //www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
/usr/libexec/java_home -V
export JAVA_HOME=$(/usr/libexec/java_home -v 11)
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
然后去
cd ~/Library/Android/sdk/tools/bin
和
./sdkmanager --licenses
2019-10 更新:
正如問題跟蹤器中所述,Google 一直致力於開發一個新的 SDK 工具版本,該版本可在當前的 JVM(9+)上運行!
您可以在 Android Studio 中下載和使用新的Android SDK 命令行工具,也可以從 Google 服務器手動下載它們:
對於最新版本,請檢查repository.xml 中的 URL。
如果您手動解壓縮命令行工具,請注意將它們放在$ANDROID_HOME
內的子文件夾中(例如$ANDROID_HOME/cmdline-tools/...
)。
2021-03 更新:
最新的穩定命令行工具也可在Google 下載網站上找到
對於 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%
正如我們在之前的評論中所讀到的,發生此錯誤是因為當前的 SDK 版本與最新的 Java 版本不兼容:9 和 10。
因此,要解決此問題,您可以將 Java 版本降級到 Java 8,或者作為一種解決方法,您可以在終端上導出以下選項:
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( .zshrc
、 .bashrc
等)上的配置文件中導出 JAVA_OPTS 或在 Windows 上將其永久添加為環境變量。
附: 這不適用於沒有 Java EE 模塊的 Java 11/11+。 對於此選項是個好主意,請降級您的 Java 版本或等待 Flutter更新。
正如一些人之前提到的,這很可能是一個更簡單的問題,因為一個 Java 安裝優先於另一個。
在我的情況下,java 8 被默認的較新 java 掩蓋了。
我安裝了 Java 8:
sudo apt-get install openjdk-8-jdk
然后我將安裝的 java 更新為新的默認值:
sudo update-alternatives --config java
其中我選擇了java 8的id號。
完成這些(非常簡單的)步驟后,我可以毫無錯誤地運行 sdkmanager。
希望這可以幫助某人!
Android 工具仍然與 JDK 9 或 10 不兼容。您需要安裝 JDK 8,或者,如果您需要多個 Java 版本,請確保系統范圍的 Java 主頁指向 JDK 8。
我很難找到這個解決方案,只是添加了有效的 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.bat 文件來解決該問題,方法是強制使用嵌入在 Android Studio 本身中的 Java,我認為它使用的是 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 studio 中的 JRE,例如:../android_studio/jre
如果 ANDROID_STUDIO_JAVA_HOME 沒有設置,這也有一個回退到 JAVA_HOME 。
這是我在 Ubuntu 18.04 中所做的(任何 Linux 都可以):
$ 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)
我只是添加了“Android SDK 命令行工具(最新)”,這解決了我的問題。
最初來自這里: https : //github.com/flutter/flutter/issues/56778#issuecomment-742639036
在升級到最新版本之前,對帶有 android sdk 工具的 openJDK 11 進行了簡短的補充。
上述解決方案對我不起作用
set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.."
為了使其正常工作,我從 maven 存儲庫安裝了 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 或 --list 現在正在運行。
這是使這項工作適用於 Java 11 及更高版本的答案,因為刪除了整個 JAXB API。
下載Jakarta XML Binding ,特別是這個 zip文件。 您只需要 mod 文件夾中的 3 個文件,即 jakarta.activation.jar、jakarta.xml.bind-api.jar 和 jakarta.xml.bind-api.jar,其余的可以扔掉。
將這些文件移動到 APP_HOME/lib 文件夾。 我為此創建了一個子文件夾jaxb 。 所以,在我的 macOS 系統上,這是: $HOME/Library/Android/sdk/tools/lib/jaxb
現在使用您喜歡的文本編輯器打開 sdkmanager 並在 CLASSPATH= 下添加以下內容:
$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
差不多就是這樣,應該可以解決問題。
我執行這些步驟是因為flutter doctor --android-licenses
給我帶來了問題。 這修復了它。
(視窗)
如果您已經安裝了 Android Studio,請轉到File
>> Project Structure...
>> SDK 位置。
轉到該位置 + \\cmdline-tools\\latest\\bin
將路徑復制到Environment Variables
使用命令行工具就可以了。
對我來說唯一可行的解決方案是使用 Android Studio 附帶的 java。
將 JAVA_HOME 設置為/Applications/Android\\ Studio.app/Contents/jre/jdk/Contents/Home
在.bashrc
set JAVA_HOME="/Applications/Android\\ Studio.app/Contents/jre/jdk/Contents/Home"
如果您使用的fish
SHEL,把這個在~/.config/fish/config.fish
set -gx JAVA_HOME /Applications/Android\\ Studio.app/Contents/jre/jdk/Contents/Home
(這是針對 mac 的,但我確信通過設置正確的路徑,它應該適用於 linux 和 windows)
JDK 13.0.1、Android SDK 29、Windows 10
基本上我嘗試了所有方法,但最有效且唯一對我有用的解決方案是降級到 jdk 1.8。 我不知道為什么,現在是 2020 年初,必須針對最新的 Flutter 版本降級到 1 年的 jdk 版本。 也許問題出在 Windows 版本中,因為 jdk 13.0.1 在 macOS 10.15.2 上對我有用。 希望這個解決方案有效。
下載鏈接(JDK 1.8.0): https : //www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
在 .bashrc 或 .zshrc 中定義不同 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
顯然,如果您使用高於 3.6.0 的“commandlinetools”版本,您可以使用 JDK11+ 來安裝 Android SDK 組件。
它們可在此處獲得: https : //developer.android.com/studio#command-tools
官方問題跟蹤器說它已修復: https : //issuetracker.google.com/issues/122210344#comment11
https://adoptopenjdk.net目前支持從版本 8 開始的所有 JDK 發行版。 例如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
此錯誤的另一種可能解決方案是檢查您的 Java 版本,也許您可以下載此 jdk oracle-jdk-8來解決它,這是我的錯誤:P
您只需要安裝 jaxb har 文件並包含在類路徑中。 這適用於最新的 java 11 到 12。
對於那些正在尋找修復程序的人,我在 github 中做了一些要點,希望能有所幫助。 並且還提供了鏈接。
https://gist.github.com/Try-Parser/b7106d941cc9b1c9e7b4c7443a7c3540
我下載 Java 8 SDK
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
如果您使用的是 flutter,請運行此命令flutter doctor --android-licenses
對於 mac 上的用戶,我通過修改我的 zshrc 文件並添加以下內容(盡管您的 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
正如上面由 Saifur Rahman Mohsin 解釋的,問題在於sdmanager
依賴於 J2EE 功能的可用性,JRE/JDK >= 11 不再附帶,因此可以通過使用實現相同功能的JAXB 類來解決這個問題。
但是,您可能不想(或不能)修改sdkmanager
腳本(例如,因為它是由您無法控制的某個其他進程安裝的)。 如果您正在運行 Posix/Unix 系統(如 GNU/Linux 或 BSD,也許是 macOS),您可能仍有機會。
至少使用sdkmanager
附帶的sdk-tools-linux-4333796.zip
(可能還有更高版本),如果您設置$JAVA_HOME
,它會嘗試查找$JAVA_HOME/jre/sh/java
以獲取 IBM 的 AIX SDK 兼容性。 因此,您可以利用該兼容性檢查來欺騙sdkmanager
使用包裝腳本,該腳本在調用真正的java
程序時將必要的類插入到類路徑中。
例如,在已經安裝了 OpenJDK 11 的 Debian 中(包openjdk-11-jre
或openjdk-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 並工作!
轉到{SDK_FOLDER}/lib/_/
(下划線文件夾)。 將_
文件夾中的所有文件復制到其父文件夾/lib
。
我下載並安裝了:
配置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)
有誰知道如何解決它而無需回到Java 8?
我在嘗試使用統一引擎構建 apk 時遇到了同樣的錯誤。 此錯誤的主要問題是使用“jdk11”而不是“jdk8”。 我已經完成了以下步驟來成功編譯我的 apk
3 從 oracle https://www.oracle.com/in/java/technologies/javase/javase-jdk8-downloads.html下載 java8 4. 安裝。 通過按照上述我解決了這個問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.