安装Flutter环境遇到Android license status unknown问题解决,支持Java9,Java10,Java11

本文开发环境为Windows10,Linux跟Mac OS没试过,应该也差不多,可以作为参考。

如题,安装Flutter环境,最后执行flutter doctor时出现:

Android license status unknown.

按照正常步骤肯定是各种百度,然后按照文章提示执行:

flutter doctor --android-licenses

执行上面这个命令,它会提示让你进入AndroidSDK安装目录下面的tools\bin执行:

sdkmanager.bat --update

到这来问题来了,出现错误:

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.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 5 more

网上那些教程都是建议把Java版本降到Java8的,我不喜欢,我就要用Java11,写web api用var爽!

很明显就是Java9及更高版本才会出现这个问题,因为Java9之后干掉了一些库,如果写过Springcloud的同学应该会知道,需要添加jaxb相关依赖:

activation.jar

jaxb-impl.jar

jaxb-xjc.jar

jaxb-core.jar

jaxb-jxc.jar

jaxb-api.jar

在AndroidSDK目录的tools文件夹下面创建一个名为"jaxb"的文件夹,将上面的jar包都下载到里,如图:

提示:如果下载后的jar带有版本号可以将版本号删除掉,如:activation-1.1.1.jar可以重命名为activation.jar

完成之后我们使用Notepad++之类的文本编辑工具打开sdkmanager.bat文件进行编辑,打开后,在大约66行那里我们会看到这样的一行代码:

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

我们按照这个规则将jaxb相关依赖添加进去就好了,下面是我添加的:

set CLASSPATH=%APP_HOME%\jaxb\activation.jar;%APP_HOME%\jaxb\jaxb-impl.jar;%APP_HOME%\jaxb\jaxb-xjc.jar;%APP_HOME%\jaxb\jaxb-core.jar;%APP_HOME%\jaxb\jaxb-jxc.jar;%APP_HOME%\jaxb\jaxb-api.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

到这里执行:

sdkmanager.bat --update

没什么问题的话应该正常了,如果出现下面的错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/istack/FinalArrayList
        at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:219)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:217)
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:175)
        at javax.xml.bind.ContextFinder.find(ContextFinder.java:353)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:508)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:465)
        at com.android.repository.impl.meta.SchemaModuleUtil.getContext(SchemaModuleUtil.java:104)
        at com.android.repository.impl.meta.SchemaModuleUtil.setupUnmarshaller(SchemaModuleUtil.java:211)
        at com.android.repository.impl.meta.SchemaModuleUtil.unmarshal(SchemaModuleUtil.java:194)
        at com.android.repository.impl.manager.LocalRepoLoaderImpl.parsePackage(LocalRepoLoaderImpl.java:301)
        at com.android.repository.impl.manager.LocalRepoLoaderImpl.parsePackages(LocalRepoLoaderImpl.java:159)
        at com.android.repository.impl.manager.LocalRepoLoaderImpl.getPackages(LocalRepoLoaderImpl.java:124)
        at com.android.repository.impl.manager.RepoManagerImpl$LoadTask.run(RepoManagerImpl.java:518)
        at com.android.repository.api.RepoManager$DummyProgressRunner.runSyncWithProgress(RepoManager.java:397)
        at com.android.repository.impl.manager.RepoManagerImpl.load(RepoManagerImpl.java:365)
        at com.android.repository.api.RepoManager.loadSynchronously(RepoManager.java:290)
        at com.android.sdklib.repository.AndroidSdkHandler$RepoConfig.createRepoManager(AndroidSdkHandler.java:725)
        at com.android.sdklib.repository.AndroidSdkHandler.getSdkManager(AndroidSdkHandler.java:296)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCliSettings.setSdkHandler(SdkManagerCliSettings.java:101)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.<init>(SdkManagerCli.java:95)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:74)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: com.sun.istack.FinalArrayList
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 26 more

这是少了istack-commons-runtime依赖,附上地址:

istack-commons-runtime.jar

下载后按照上面的jaxb步骤将istack-commons-runtime.jar加入CLASSPATH,完整的应该是这样的:

set CLASSPATH=%APP_HOME%\jaxb\activation.jar;%APP_HOME%\jaxb\jaxb-impl.jar;%APP_HOME%\jaxb\jaxb-xjc.jar;%APP_HOME%\jaxb\jaxb-core.jar;%APP_HOME%\jaxb\jaxb-jxc.jar;%APP_HOME%\jaxb\jaxb-api.jar;%APP_HOME%\jaxb\istack-commons-runtime.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

再次:

sdkmanager.bat --update

正常了!

 

我们执行:

flutter doctor

执行结果如下:

AndroidStudio相关配置已经正常了,但是有一个警告:! Some Android licenses not accepted.按照提示我们执行:

flutter doctor --android-licenses

然后按照提示不断"y"然后回车就好了,到这里问题已经解决!

参考文章:

https://stackoverflow.com/questions/53076422/getting-android-sdkmanager-to-run-with-java-11

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值