ไม่สามารถเรียกใช้ sdkmanager --list ด้วย Java 9


96

ฉันดาวน์โหลดและติดตั้ง:

  • JDK ( jdk-9.0.1_osx-x64_bin.dmg) จาก Oracle ที่นี่
  • Android SDK ( sdk-tools-darwin-3859397.zip) จาก Google ที่นี่

หลังจากกำหนดค่า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

นี่คือเวอร์ชัน 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

1
แค่สงสัย: จุดประสงค์ของการทำสิ่งนี้คืออะไร?
GhostCat

2
ลองใช้คุณสมบัติใหม่ใน Java 9 แต่ในขณะเดียวกันก็พัฒนาแอพ Android และต้องการ JDK เพียงตัวเดียวในระบบ
Siu Ching Pong -Asuka Kenji-

คำตอบที่เชื่อมโยงไม่ใช่ Android SDK โดยเฉพาะ ไม่ได้ชี้ให้เห็นว่าต้องแก้ไขสคริปต์ใดและควรแก้ไขที่ใด โปรดทราบว่าไม่ใช่ทุกคนที่รู้เชลล์สคริปต์และจะช่วยแก้ปัญหาได้อย่างรวดเร็วแม้กระทั่งสำหรับผู้ที่รู้ คุณต้องการอ่านแม้ว่าคุณจะไม่ได้เขียนสคริปต์เพื่อแก้ปัญหาการกำหนดค่าอย่างง่ายในขณะที่โซลูชันที่ใช้งานได้มีการทดสอบโดยใครบางคนแล้วหรือไม่?
Siu Ching Pong -Asuka Kenji-

2
ในบันทึกนั้นฉันได้โหวตให้เปิดstackoverflow.com/questions/46402772/…อีกครั้งแม้ว่าความคิดเห็นจะชี้ให้เห็นก็ตาม
Naman

โปรดอย่าลบสิ่งนี้จนกว่าstackoverflow.com/q/46402772/142239จะเปิดขึ้นมาใหม่และฉันคัดลอกคำตอบที่นั่น ฉันไม่มีข้อมูลสำรองของโพสต์ StackOverflow ของฉัน ขอบคุณ!
Siu Ching Pong -Asuka Kenji-

คำตอบ:


159

ด้วยความช่วยเหลือของคำตอบนี้ฉันแก้ปัญหาได้สำเร็จ

sdkmanagerเราจะใช้การแก้ไขใน มันเป็นเชลล์สคริปต์ ตั้งอยู่ที่$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เนื่องจากsdkmanagerเชลล์สคริปต์อาจถูกแทนที่หากtoolsมีการอัปเดตแพ็กเกจ

คำตอบที่เกี่ยวข้อง

  • https://stackoverflow.com/a/43574427/142239
    • @ andy-guibert ชี้ให้เห็นตัวเลือกที่จำเป็นในการทำงานนี้ เขายังสรุปสั้น ๆ ว่าตัวเลือกลึกลับเหล่านั้นหมายถึงอะไร

1
ตามที่ระบุไว้ในคู่มือการย้าย JDK 9 --add-modules java.se.eeควรถือเป็นวิธีแก้ปัญหาชั่วคราว ข้อเสนอในการวางโมดูล java.xml.bind จาก Java SE และ JDK อยู่ในรูปแบบร่างที่นี่: bugs.openjdk.java.net/browse/JDK-8189188
Alan Bateman

11
ทำไมไม่เพียงแค่ส่งออกJAVA_OPTSตัวแปรสภาพแวดล้อมexport JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee'แทนการแก้ไขไฟล์ต้นฉบับ SDK?
Rafa

7
FWIW ฉันดาวน์โหลดและติดตั้งทั้ง JDK และ Android SDK Tools บน Windows 10 แล้วและต้องตั้งค่าบรรทัดเพื่อset DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0.." -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.eeให้com.android.sdklib.tool.SdkManagerCliคลาสทำงานได้อย่างถูกต้อง
RJ Cuthbertson

2
เมื่อมี java 11 ในระบบโซลูชันที่ @SherylHohman เสนอจะต้องรวมกับอันนี้ java 11 จะต้อง "ซ่อน" จากรายการเพื่อให้งานนี้ทำงานได้
Alejandro Moya

5
สิ่งนี้ -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.eeหรือ `--add-modules java.xml.bind ไม่ทำงานกับ Java 11 บน Mac OS ฉันจะแก้ไขได้อย่างไรโดยไม่ต้องติดตั้ง Java เวอร์ชันอื่น
Manish

37

คุณสามารถตั้งค่าตัวเลือก sdkmanager ด้วย SDKMANAGER_OPTS

ตัวอย่าง:

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

4
โปรดทราบใน Windows คุณไม่ควรใส่เครื่องหมายคำพูด:set SDKMANAGER_OPTS=--add-modules java.se.ee
Amfasis

20
java.se.ee ไม่มีอยู่แล้ว
ออสการ์

2
คำตอบนี้ล้าสมัยมีคนแก้ไขโปรด
Developerium

25

คำตอบที่ได้รับการยอมรับล้าสมัยในเดือนกุมภาพันธ์ 2019 นี่คือคำตอบที่จะใช้ได้จนกว่าsdkmanagerจะย้ายไปใช้ Java เวอร์ชันใหม่กว่า แต่หลังจากนั้นคุณจะไม่มีปัญหานี้อีกต่อไป

OpenJDK 10 superseeded โดย OpenJDK 11ซึ่งไม่ได้ดำเนินการในทุกjava.se.ee ซึ่งหมายความว่าการแฮ็กการเพิ่ม--add-modules java.se.eeจะไม่ทำอะไรอีกต่อไป นอกจากนี้ยังหมายความว่า OpenJDK 10 จะถูกลบออกจากระบบของคุณโดยอัตโนมัติและแทนที่ด้วย OpenJDK 11 ในครั้งต่อไปที่คุณอัปเดตหากการอัปเดตของคุณได้รับการกำหนดค่าอย่างเหมาะสม

แก้ไขsdkmanagerเพื่อใช้ Java 8 โดยตั้งค่าJAVA_HOME ภายใน 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_HOME เป็นการชั่วคราวเป็นการติดตั้ง Java จาก Android Studio: C: \ Program Files \ Android \ Android Studio \
jre

3
set JAVA_HOME="...\android-studio\current\jre"ช่วยฉันใน Windows 10 ในขณะที่คำตอบอื่น ๆ ไม่ได้
NearHuscarl

set JAVA_HOME="C:\Program Files\Android\Android Studio\jre"ทำงานแทนฉันบน Windows 10 ค้นหาเส้นทาง Android Studio ของคุณ ฉันได้ตั้งค่า Java 11 บน JAVA_HOME ดั้งเดิมของฉันแล้ว
บันทึก -jj

สิ่งนี้ใช้ไม่ได้: Java 8 ไม่มีอยู่ใน Debian Stable (อายุ1½ปี) และใหม่กว่าอีกต่อไป
mirabilos

21

เมื่อมี java 11 ในระบบโซลูชันที่ให้มาจะไม่ถูกต้อง

นี้-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee or--add โมดูล java.xml.bind จะไม่ได้ทำงานกับ Java 11 บน Mac OS

ด้วยเหตุนี้คุณต้องดาวน์เกรดเวอร์ชัน 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

1
ฉันทำสิ่งนี้แล้ว แต่ยังคงได้รับข้อผิดพลาด: etc ... ข้อยกเว้นในเธรด "main" java.lang.NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema .. ฉันใช้ Java 12.0.1
james emanon

@jamesemanon อาจทำการรีสตาร์ทเพื่อใช้การเปลี่ยนแปลง ฉันไม่มีเบาะแสใด ๆ
thodwris

1
bash: /usr/libexec/java_home: file not foundที่การติดตั้งของฉัน
ยูจีน Gr. Philippov

13

สำหรับ Windows หากไม่มีอะไรทำงานให้ลองทำสิ่งนี้:

  • เปิดsdkmanager.batด้วย 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%


3
ทำงานให้ฉันบน windows 10
AntonB

11

อัปเดต 2019-10:

ตามที่ระบุไว้ในเครื่องมือติดตามปัญหา Google ได้พัฒนาเครื่องมือ SDK ใหม่ที่ทำงานบน JVMs ปัจจุบัน (9+)!

คุณสามารถดาวน์โหลดและใช้Android SDK Command-line Tools (1.0.0) ใหม่ใน Android Studio หรือดาวน์โหลดด้วยตนเองจากเซิร์ฟเวอร์ของ Google:

สำหรับรุ่นล่าสุดตรวจสอบ URL ที่ภายในrepository.xml

หากคุณแกะเครื่องมือบรรทัดคำสั่งด้วยตนเองให้จัดการวางไว้ในโฟลเดอร์ย่อยภายใน$ANDROID_HOME(เช่น$ANDROID_HOME/cmdline-tools/...) ของคุณ


1
เครื่องมือบรรทัดคำสั่ง 2.1 (ล่าสุด) ก็ล้มเหลวเช่นกันกับ Java 11
mirabilos

10

ตามที่เราอ่านในความคิดเห็นก่อนหน้านี้ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากเวอร์ชัน SDK ปัจจุบันเข้ากันไม่ได้กับ Java เวอร์ชันล่าสุด: 9 และ 10

ดังนั้นในการแก้ปัญหาคุณสามารถปรับลดรุ่น java ของคุณเป็น Java 8 หรือเป็นวิธีแก้ปัญหาชั่วคราวคุณสามารถส่งออกตัวเลือกต่อไปนี้บนเทอร์มินัลของคุณ:

ลินุกซ์:

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

Windows :

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

สิ่งนี้จะแก้ไขข้อผิดพลาดนี้สำหรับไฟล์ sdkmanager

และเพื่อให้การบันทึกไว้อย่างถาวรคุณสามารถส่งออก JAVA_OPTS ในแฟ้มประวัติของคุณบนลินุกซ์ ( .zshrc, .bashrcและอื่น ๆ ) หรือเพิ่มเป็นตัวแปรสภาพแวดล้อมอย่างถาวรบน Windows


ปล. สิ่งนี้ใช้ไม่ได้กับ Java 11/11 + ซึ่งไม่มีโมดูล Java EE สำหรับตัวเลือกนี้เป็นความคิดที่ดีปรับลดรุ่น Java ของคุณหรือรอให้กระพือปรับปรุง

Ref: JDK 11: จุดสิ้นสุดของถนนสำหรับโมดูล Java EE


12
เมื่อฉันลองสิ่งนี้ฉันได้รับข้อผิดพลาดอื่น: เกิดข้อผิดพลาดระหว่างการเริ่มต้นของชั้นบูต java.lang.module.FindException: ไม่พบโมดูล java.se.ee
Sherin Binu

@SherinBinu คุณใช้ Java เวอร์ชันไหน
valdeci

1
พยายามใช้--add-modules java.xml.bindแทน--add-modules java.se.ee
valdeci

@valdeci ใช้งานได้จริง! ขอบคุณมาก!
Apoorv Goyal

8

ดังที่บางคนได้กล่าวไว้ก่อนหน้านี้ปัญหานี้อาจเป็นปัญหาที่ง่ายกว่าที่เกี่ยวข้องกับการติดตั้ง java หนึ่งที่มีความสำคัญเหนือกว่าอีกรายการหนึ่ง

ในกรณีของฉันมันคือ java 8 ที่ถูกบดบังด้วย java ที่ใหม่กว่าเริ่มต้น

ฉันติดตั้ง java 8:

sudo apt-get install openjdk-8-jdk

จากนั้นฉันอัปเดต java ที่ติดตั้งให้เป็นค่าเริ่มต้นใหม่:

sudo update-alternatives --config java

โดยที่ฉันเลือกหมายเลข id ของ java 8

หลังจากทำตามขั้นตอนเหล่านี้ (ค่อนข้างง่าย) ฉันสามารถเรียกใช้ sdkmanager ได้โดยไม่มีข้อผิดพลาด

หวังว่านี่จะช่วยใครสักคน!


สิ่งนี้ใช้ไม่ได้: Java 8 ไม่มีอยู่ใน Debian Stable (อายุ1½ปี) และใหม่กว่าอีกต่อไป
mirabilos

7

เครื่องมือ Android ยังไม่สามารถใช้งานร่วมกับ 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

ฉันกลัวว่ามันจะใช้งานไม่ได้เพราะจะหยุดทำงานเมื่อ SDK เวอร์ชันใหม่ออกมาเนื่องจากข้อมูลโค้ดนี้มีเวอร์ชันฮาร์ดโค้ด:set CLASSPATH=%APP_HOME%\lib\sdklib-25.3.1.jar
izogfif

4

ฉันสามารถแก้ปัญหานี้ได้โดยใช้ไฟล์ sdkmanager.bat ที่แก้ไขแล้วโดยบังคับให้ใช้ Java ที่ฝังอยู่ใน Android Studio Itself ซึ่งฉันคิดว่าใช้ 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 ซึ่งจริงๆแล้วชี้ไปที่ JRE ที่ฝังอยู่ในสตูดิโอ Android เช่น ../android_studio/jre

นอกจากนี้ยังมีทางเลือกเป็น JAVA_HOME หากไม่ได้ตั้งค่า ANDROID_STUDIO_JAVA_HOME


3

นี่คือสิ่งที่ฉันทำใน 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)

สิ่งนี้ใช้ไม่ได้: Java 8 ไม่มีอยู่ใน Debian Stable (อายุ1½ปี) และใหม่กว่าอีกต่อไป
mirabilos

2

เพิ่มเติมสั้น ๆ ข้างต้นสำหรับ openJDK 11 พร้อมเครื่องมือ android sdk ก่อนที่จะอัปเกรดเป็นเวอร์ชันล่าสุด

วิธีแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน

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

เพื่อให้ทำงานได้ฉันได้ติดตั้ง jaxb-ri (การใช้งานอ้างอิง) จาก maven repo

ข้อมูลได้รับ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 \ และเพิ่มสิ่งต่อไปนี้ในตัวแปร classpath:

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

บางทีฉันอาจพลาด lib เนื่องจากมีข้อผิดพลาดเล็กน้อยปรากฏขึ้น แต่ sdkmanager.bat --update หรือ --list กำลังทำงานอยู่


2

นี่คือคำตอบที่จะทำให้สิ่งนี้ใช้ได้กับ Java 11 ขึ้นไปเนื่องจาก JAXB API ทั้งหมดถูกลบออก

ดาวน์โหลดJakarta XML Bindingโดยเฉพาะไฟล์zipนี้ คุณต้องการเพียง 3 ไฟล์ในโฟลเดอร์ mod เช่น 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ทำให้ฉันมีปัญหา และสิ่งนี้แก้ไขได้


2

(หน้าต่าง)

หากคุณติดตั้ง Android Studio ไปแล้วให้ไปที่File>> Project Structure...>> ตำแหน่ง SDK

ไปที่ตำแหน่งนั้น + \cmdline-tools\latest\bin คัดลอกเส้นทางลงในEnvironment Variables

ดีกว่าที่จะใช้เครื่องมือบรรทัดคำสั่ง


1

ทางออกเดียวที่ใช้งานได้สำหรับฉันคือใช้ java ที่มาพร้อมกับ Android studio

ตั้งค่า 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เชลให้ใส่สิ่งนี้เข้าไป~/.config/fish/config.fish

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

(สำหรับ mac แต่ฉันแน่ใจว่ามันควรจะทำงานกับ linux และ windows โดยตั้งค่าเส้นทางที่ถูกต้อง)


ซึ่งอาจรบกวนแอปพลิเคชันอื่นที่พยายามใช้ Java เวอร์ชัน Original / Non-OpenJDK จาก Oracle แม้ว่า OpenJDK จะมีความสามารถมากกว่า แต่บางคนก็อาจต้องการตัวอื่นเช่นกัน
Jemsheer KD

1

JDK 13.0.1, Android SDK 29, Windows 10

โดยทั่วไปฉันลองทุกอย่างแล้ว แต่วิธีแก้ปัญหาที่ได้ผลที่สุดและมีเพียง 1 วิธีที่ใช้ได้กับฉันคือการดาวน์เกรดเป็น jdk 1.8 ฉันไม่รู้ว่าทำไมมันถึงต้นปี 2020 และต้องปรับลดรุ่นเป็นรุ่น jdk อายุ 1 ปีเทียบกับเวอร์ชันล่าสุด อาจมีปัญหาในเวอร์ชัน 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


Java 8 เปิดตัวในเดือนมีนาคม 2014 ดังนั้นมันจึงมากกว่า 1 ปี ...
pqnet

ใช่.. แต่นโยบายของ Oracle เปลี่ยนไปตั้งแต่ Java 8 ..... มันไม่ฟรีสำหรับองค์กรอีกต่อไป ดังนั้นทุกคนถูกบังคับให้ใช้ Java8
Kedar Sukerkar

ปัญหาคือ java runtimes รุ่นใหม่ (9+) ไม่มีไลบรารี javax คุณควรจัดส่งพร้อมกับแอปพลิเคชันของคุณ ดังนั้นซอฟต์แวร์ที่เขียนขึ้นโดยคาดหวังว่าจะทำงานบน java 8 และก่อนหน้านี้จะไม่จัดส่งไลบรารีเหล่านี้และจะไม่ทำงานบน 9+ เหตุผลตามที่คุณคาดเดาคือการสร้างโอเพ่นซอร์ส JDK มาตรฐานอย่างสมบูรณ์ (ไลบรารีเหล่านี้ไม่ใช่ GPL) ดังนั้นฉันจะบอกว่าเงื่อนไขสิทธิ์การใช้งานดีขึ้น
pqnet

1

กำหนดโฮมไดเร็กทอรีของ JDK เวอร์ชันต่างๆใน. bashrc หรือ. zshrc ของคุณ:

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

สิ่งนี้ใช้ไม่ได้: Java 8 ไม่มีอยู่ใน Debian Stable (อายุ1½ปี) และใหม่กว่าอีกต่อไป
mirabilos

0

https://adoptopenjdk.netปัจจุบันรองรับ JDK ทั้งหมดตั้งแต่เวอร์ชัน 8 เป็นต้นไป ตัวอย่างเช่น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

1
มีความคิดอย่างไรในการแก้ไขปัญหานี้สำหรับ SDK 12
Richie

@Richie คุณแก้ปัญหานี้หรือไม่ฉันก็มี Java 12 เช่นกันและพบปัญหานี้และไม่มีสิ่งใดที่โพสต์ที่นี่ช่วยได้
james emanon

1
อย่างที่ฉันจำได้ฉันคิดว่าคุณต้องดาวน์โหลดไฟล์ jar ที่มี java.se.ee และเพิ่มลงในพา ธ (หรืออะไรที่คล้ายกัน) AFAIK Oracle ไม่รวมขวดที่เกี่ยวข้องกับ J2EE จาก JDK เป็นเวลา 12 ปีขึ้นไป ไม่ได้ทดสอบกับ sdkmanager
mmccabe

@jamesemanon ฉันไม่สามารถแก้ปัญหาได้ ลองทำตามคำแนะนำข้างต้น
Richie

0

อีกวิธีหนึ่งที่เป็นไปได้สำหรับข้อผิดพลาดนี้คือตรวจสอบเวอร์ชัน Java ของคุณบางทีคุณสามารถแก้ปัญหาได้โดยดาวน์โหลด jdk oracle-jdk-8นี่เป็นความผิดพลาดของฉัน: P


0

คุณต้องติดตั้งไฟล์ jaxb har และรวมไว้ใน classpath ใช้งานได้ใน java 11 ถึง 12 ล่าสุด

สำหรับผู้ที่กำลังมองหาการแก้ไขฉันได้ทำส่วนสำคัญใน github หวังว่าจะช่วยได้ และลิงค์ต่างๆให้ด้วย

https://gist.github.com/Try-Parser/b7106d941cc9b1c9e7b4c7443a7c3540


0

ฉันดาวน์โหลด Java 8 SDK

  1. unistall java sdk previuse
  2. ปิด android studio
  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

0

เห็นได้ชัดว่าหากคุณใช้ "commandlinetools" เวอร์ชันที่มากกว่า 3.6.0 คุณอาจใช้ JDK11 + เพื่อติดตั้งส่วนประกอบ Android SDK

มีอยู่ที่นี่: https://developer.android.com/studio#command-tools

ตัวติดตามปัญหาอย่างเป็นทางการแจ้งว่าได้รับการแก้ไขแล้ว: https://issuetracker.google.com/issues/122210344#comment11


-2

มันง่ายมากเพียงแค่ส่งออกJAVA_HOMEตัวแปรสภาพแวดล้อมตั้งค่าเส้นทางของการติดตั้ง JDK ของคุณ

ฉันติดตั้ง Java ด้วยตนเองบน Ubuntu ดังนั้นสำหรับฉันสิ่งนี้ดูเหมือน:

export JAVA_HOME="$HOME/pkg-src/jdk1.8.0_251"

และตรวจสอบให้แน่ใจว่ามีอยู่ในเส้นทางของคุณด้วย ...

export PATH="$PATH:$JAVA_HOME"

สิ่งนี้ใช้ไม่ได้: Java 8 ไม่มีอยู่ใน Debian Stable (อายุ1½ปี) และใหม่กว่าอีกต่อไป
mirabilos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.