无法使用Java 9运行sdkmanager --list


94

我下载并安装了:

  • 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

这是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。
小清庞-明日香贤治

链接的答案不是特定于Android SDK的。它没有指出要编辑哪个脚本以及在哪里编辑。请注意,并非每个人都知道shell脚本,即使对于有经验的人,它也有助于快速解决问题。您是否要阅读不是由您编写的脚本来解决一个简单的配置问题,而某个可行的解决方案已经有人测试过?
小清蓬-明日香贤治

2
在此注释上,我已投票决定重新打开stackoverflow.com/questions/46402772/…即使评论已指出。
纳曼

在重新打开stackoverflow.com/q/46402772/142239之前,请不要删除它,我在此处复制答案。我没有我的StackOverflow帖子的备份。谢谢!
小清庞-明日香贤治

Answers:


159

借助此答案,我成功解决了该问题。

我们将在中应用修复程序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,因为sdkmanager如果tools包更新软件包。

相关答案


1
如《 JDK 9迁移指南》中所述,--add-modules java.se.ee应将其视为临时解决方法。从Java SE和JDK删除java.xml.bind模块的建议是此处的草案形式:bugs.openjdk.java.net/browse/JDK-8189188
Alan Bateman

11
为什么不直接导出JAVA_OPTS环境变量export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee',而不是修补SDK源文件?
拉法

6
FWIW,我今天在Windows 10上下载并安装了JDK和Android SDK Tools,并且必须设置该行以set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0.." -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee使com.android.sdklib.tool.SdkManagerCli该类正确运行
RJ Cuthbertson

1
尽管我确定了这个解决方案(便于我跟踪),但这里还有一个替代的“解决方案”。长期修复将是美好的。
SherylHohman

4
这个 -XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee或`--add-modules java.xml.bind在Mac OS上不适用于Java 11。如何在不安装其他Java版本的情况下进行修复?
Manish

37

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

例:

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

4
请注意,在Windows上,您应该省略引号:set SDKMANAGER_OPTS=--add-modules java.se.ee
Amfasis

18
java.se.ee不再存在。
奥斯卡

2
这个答案已经过时了,请有人解决这个问题
Developerium

21

截至2019年2月,已接受的答案已过时。这是一个有效的答案,直到sdkmanager迁移到Java的较新版本为止。但是到那时,您将不再有此问题。

OpenJDK的10是由OpenJDK的11 superseeded,它没有实现java.se.ee 在所有。这意味着添加--add-modules java.se.ee操作不再起作用。这也意味着,如果正确配置了更新,则在下次更新时,OpenJDK 10将自动从系统中删除,并由OpenJDK 11替换。

sdkmanager通过JAVA_HOME 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'
@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的最高位置设置为从Android Studio安装Java:C:\ Program Files \ Android \ Android Studio \ jre
clzola

2
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_HOME上设置了Java 11
notes-jj,

19

系统中装有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

Java 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
我这样做了,但仍然收到错误:等...线程“主”中的异常java.lang.NoClassDefFoundError:javax / xml / bind / annotation / XmlSchema ..我正在使用Java 12.0.1
james emanon

@jamesemanon可能会重新启动以应用更改。我没头绪
thodwris

bash: /usr/libexec/java_home: file not found在我的安装中。
尤金(Eugene Gr)。Philippov

13

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


3
在Windows 10上为我工作
。– AntonB

10

正如我们在前面的注释中所读到的那样,由于当前的SDK版本与最新的Java版本9和10不兼容,因此发生了此错误。

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

Linux:

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

Windows

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

这将解决该错误 sdkmanager

为了使其永久保存,您可以将JAVA_OPTS导出到linux(等)上的配置文件中.zshrc.bashrc或者作为Windows环境中的环境变量永久添加。


ps。这对于没有Java EE模块的Java 11+不起作用。使用此选项是个好主意,请降级Java版本或等待Flutter 更新

参考:JDK 11:Java EE模块的终结


11
当我尝试此操作时,我收到另一个错误:启动层java.lang.module.FindException初始化期间发生错误:找不到模块java.se.ee
Sherin

@SherinBinu您使用的是哪个Java版本?
valdeci

1
尝试使用--add-modules java.xml.bind代替--add-modules java.se.ee
valdeci '18

@valdeci确实有效!非常感谢!
Apoorv Goyal

10

更新2019-10:

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

您可以在Android Studio中下载并使用新的Android SDK命令行工具(1.0.0),也可以从Google服务器手动下载它们:

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

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


8

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

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

我安装了Java 8:

sudo apt-get install openjdk-8-jdk

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

sudo update-alternatives --config java

因此,我选择了Java 8的ID号。

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

希望这对某人有帮助!



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

通过强制使用嵌入在Android Studio Itself中的Java,我可以使用经过编辑的sdkmanager.bat文件来解决此问题,我假设使用的是OpenJDK8。这是我使用的经过编辑的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。


2

在升级到最新版本之前,使用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 \,并将以下内容添加到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

这是我在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)

1

对我而言,唯一可行的解​​决方案是使用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"

如果您使用fishShel,请将其放入~/.config/fish/config.fish

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

(这是针对mac的,但是我确信它可以通过设置正确的路径与Linux和Windows一起使用)


这可能会干扰其他尝试使用Oracle的Java原始版本/非OpenJDK版本的应用程序。尽管OpenJDK功能强大,但有些人可能还需要另一个。
Jemsheer KD

1

JDK 13.0.1,Android SDK 29,Windows 10

基本上我尝试了所有方法,但是对我有用的最有效且唯一的解决方案是降级到jdk 1.8。我不知道为什么,这是2020年初,必须将Jdk版本降级为最新的flutter版本。也许问题出在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年3月发布。因此它已经存在1年多了……
pqnet

是的。但是自Java 8以来Oracle的政策已经改变。组织不再免费。因此,每个人都被迫使用Java8
Kedar Sukerkar,

问题是较新的Java运行时(9+)没有Javax库,应该将它们与应用程序一起提供。因此,期望在Java 8以及更低版本上运行的软件不会提供这些库,因此无法在9+上运行。正如您所猜测的,原因是使标准JDK完全开源(这些库不是GPL),所以我想说许可条款有所改进。
pqnet

1

在.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

1

因为删除了整个JAXB API,所以这是使它在Java 11及更高版本上工作的答案。

下载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给了我一些问题。并固定了它。


0

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

1
是否知道如何针对SDK 12修复此问题?
Richie

@Richie您是否解决了这个问题,我也有Java 12并遇到了这个问题,此处没有任何帮助。
james emanon

1
回想一下,我认为您必须下载包含java.se.ee的jar文件并将其添加到路径(或类似名称)中。AFAIK Oracle从JDK取消捆绑了与J2EE相关的jar,并且适用于12和更高版本。没有使用sdkmanager测试。
mmccabe

@jamesemanon我没有解决。尝试上述建议
Richie



0

我下载了Java 8 SDK

  1. Unistall Java SDK前提条件
  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


-1

非常简单,只需导出 JAVA_HOME环境变量,并将其设置为JDK安装的路径即可。

我是在Ubuntu上手动安装Java的,因此对我来说如下所示:

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

并确保它也存在于您的路径中...

export PATH="$PATH:$JAVA_HOME"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.