我下载并安装了:
jdk-9.0.1_osx-x64_bin.dmg
)
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?
答案 0 :(得分:127)
在this answer的帮助下,我成功解决了问题。
我们将在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
...
HOLA!它有效!
请注意,您可能需要在运行sdkmanager --update
后再次应用上述修补程序,因为如果sdkmanager
程序包已更新,则可能会覆盖tools
shell脚本。
答案 1 :(得分:27)
您可以使用SDKMANAGER_OPTS设置sdkmanager选项。
示例:
export SDKMANAGER_OPTS="--add-modules java.se.ee"
sdkmanager --list
答案 2 :(得分:11)
对于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 :(得分:7)
当我们阅读前面的评论时,会发生此错误,因为当前的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 11+,因为Java 11+没有Java EE模块。使用此选项是个好主意,请降级Java版本或等待Flutter update。
答案 4 :(得分:6)
更新2019-10:
与stated in the issue tracker一样,Google正在开发可在当前JVM(9+)上运行的新SDK工具版本!
您已经可以在Android Studio内部的canary通道上下载并使用新的 Android SDK命令行工具(版本1.0.0 rc1),也可以通过从Google服务器手动下载它们来
:对于最新版本,请检查repository.xml内的URL。
如果您手动解压缩命令行工具,请注意将其放在$ANDROID_HOME
(例如$ANDROID_HOME/cmdline-tools/...
)内的子文件夹中。
答案 5 :(得分: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
答案 6 :(得分:4)
可接受的答案截止到2019年2月已过期。Here's an answer在sdkmanager
迁移到Java的较新版本之前一直有效。但是到那时,您将不再有这个问题。
OpenJDK 10 was superseeded by OpenJDK 11,它根本没有实现
java.se.ee
。这意味着添加--add-modules java.se.ee
的hack不再起作用。这也意味着,如果配置正确,则下次更新时,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
现在我要修理一些pipelines。
答案 7 :(得分:4)
Android Tools仍然与JDK 9或10不兼容。您需要安装JDK 8,或者,如果您需要多个Java版本,请确保系统范围的Java主目录指向JDK 8.
此处有更多详情:How to configure Unity 2017.4 to target Android and avoid build failures on OSX?
答案 8 :(得分:4)
就像某些人之前提到的那样,与一个优先于另一个的Java安装有关,这可能是一个更简单的问题。
在我的情况下,是Java 8被默认的较新Java所遮盖。
我安装了Java 8:
sudo apt-get install openjdk-8-jdk
然后我将安装的java更新为新的默认值:
sudo update-alternatives --config java
因此我选择了Java 8的ID号。
完成这些(非常简单的)步骤之后,我可以运行sdkmanager而不会出错。
希望这对某人有帮助!
答案 9 :(得分: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)
答案 10 :(得分:2)
系统中装有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
答案 11 :(得分:2)
(WINDOWS)
如果您已经安装了Android Studio,请转到File
>> Project Structure...
>> SDK位置。
转到该位置+ \cmdline-tools\latest\bin
将路径复制到Environment Variables
那么可以使用命令行工具。
答案 12 :(得分:2)
这是使Java 11及更高版本有效的答案,因为删除了整个JAXB API。
下载Jakarta XML Binding,特别是this 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
给了我一些问题。这样就解决了。
答案 13 :(得分:1)
我能够通过强制使用嵌入在Android Studio Itself中的Java来使用已编辑的sdkmanager.bat文件来解决此问题,我假定它使用的是OpenJDK8。这是我使用的已编辑sdkmanager:
jQuery('.myitems').each(function (index) {
const count = {}
count[myitem + index] = [jQuery(this).text()];
console.log(count[myitem + index]);
});
在这里,我使用了一个环境变量ANDROID_STUDIO_JAVA_HOME,该变量实际上指向嵌入在android studio中的JRE,例如:../ android_studio / jre
如果未设置ANDROID_STUDIO_JAVA_HOME,则这也将回退到JAVA_HOME。
答案 14 :(得分:1)
在升级到最新版本之前,使用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文件夹复制到$ 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运行时。 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正在运行。
答案 15 :(得分: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"
如果您使用fish
Shel,请将其放在~/.config/fish/config.fish
set -gx JAVA_HOME /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home
(这是用于Mac的,但我确信它可以通过设置正确的路径在Linux和Windows上工作)
答案 16 :(得分: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
答案 17 :(得分: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
答案 18 :(得分:0)
您只需要安装jaxb har文件并将其包含在类路径中即可。这适用于最新的Java 11至12。
对于那些正在寻找解决方案的人,我在github上提出了一些要点,希望对您有所帮助。并且还提供了链接。
https://gist.github.com/Try-Parser/b7106d941cc9b1c9e7b4c7443a7c3540
答案 19 :(得分:0)
通过 Android Studio 在 SDK 管理器中安装命令行工具。
然后从 cmdline-tools
目录(而不是 tools
目录)运行 SDK Manager 版本。
$ANDROID_HOME/tools/bin/sdkmanager --version # BAD! (java.lang.NoClassDefFoundError)
$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --version # GOOD!
答案 20 :(得分:0)
对于 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
答案 21 :(得分:0)
显然,如果您使用的“ commandlinetools”版本高于3.6.0,则可以使用JDK11 +安装Android SDK组件。
可在此处找到它们:https://developer.android.com/studio#command-tools
官方问题跟踪工具说它已修复:https://issuetracker.google.com/issues/122210344#comment11
答案 22 :(得分:0)
我下载了Java 8 SDK
Toast.makeText ( getActivity()....
和之后cmd-> flutter doctor --install -licenses
答案 23 :(得分:0)
该错误的另一种解决方案是检查您的Java版本,也许您可以下载jdk oracle-jdk-8来解决它,这是我的错误:P
答案 24 :(得分: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
答案 25 :(得分:-1)
转到 {SDK_FOLDER}/lib/_/
(下划线文件夹)。将 _
文件夹中的所有文件复制到其父文件夹 /lib
。
答案 26 :(得分:-2)
这非常简单,只需导出JAVA_HOME
环境变量,并将其设置为JDK安装路径即可。
我在Ubuntu上手动安装了Java,因此对我来说,像这样:
export JAVA_HOME="$HOME/pkg-src/jdk1.8.0_251"
并确保它也存在于您的路径中...
export PATH="$PATH:$JAVA_HOME"