簡體   English   中英

無法使用 Java 9 運行 sdkmanager --list

[英]Failed to run sdkmanager --list with Java 9

我下載並安裝了:

  • JDK ( jdk-9.0.1_osx-x64_bin.dmg ) 來自 Oracle 這里
  • Android SDK ( sdk-tools-darwin-3859397.zip ) 來自谷歌這里

配置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 的位置。

  1. 在您喜歡的編輯器中打開sdkmanager
  2. 找到設置DEFAULT_JVM_OPTS變量的行。 在我的副本中,它位於第 31 行:

     DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME"'
  3. 將以下選項附加到變量: -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee 請注意報價。 在我的副本中,該行變為:

     DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'
  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
...

你好! 它有效!

-- 編輯:2017-11-07 --

請注意,您可能需要在運行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

列出安裝的 Java 版本

/usr/libexec/java_home -V

爪哇 11

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

爪哇 1.8

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更新

參考: JDK 11:Java EE 模塊之路的盡頭

正如一些人之前提到的,這很可能是一個更簡單的問題,因為一個 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。

更多細節在這里: 如何配置 Unity 2017.4 以針對 Android 並避免在 OSX 上構建失敗?

我很難找到這個解決方案,只是添加了有效的 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

  1. 卸載java sdk previuse
  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

如果您使用的是 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

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

安裝命令行工具

然后cmdline-tools目錄運行 SDK Manager 的版本,而不是從tools目錄運行

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

正如上面由 Saifur Ra​​hman 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-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 並工作!

轉到{SDK_FOLDER}/lib/_/ (下划線文件夾)。 _文件夾中的所有文件復制到其父文件夾/lib

我下載並安裝了:

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

配置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?

相關問題

  • 無法安裝android-sdk
    • 這篇文章提出了類似的問題。 但是,該帖子已關閉,唯一的答案是建議回到Java 8。

我在嘗試使用統一引擎構建 apk 時遇到了同樣的錯誤。 此錯誤的主要問題是使用“jdk11”而不是“jdk8”。 我已經完成了以下步驟來成功編譯我的 apk

  1. 刪除 java 文件夾中存在的所有文件夾。 C:\\程序文件\\Java
  2. 卸載系統中任何現有的 Java 應用程序 在此處輸入圖像描述

3 從 oracle https://www.oracle.com/in/java/technologies/javase/javase-jdk8-downloads.html下載 java8 4. 安裝。 通過按照上述我解決了這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM