让Android sdkmanager与java11一起运行

让Android sdkmanager与java11一起运行,android,java-11,Android,Java 11,我在用Java11(不是studio,只有SDK工具)运行Androidsdkmanager时遇到了一个问题。我不想安装JDK 8或类似的东西。有没有办法用JDK 11解决Androidsdkmanager的问题 我已经看过了,但它没有为Java11提供命令行修复。任何其他可能的解决方法?下载jxab和jaf,将它们全部放入类路径 e、 g sdkmanager.bat ... set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-api.jar se

我在用Java11(不是studio,只有SDK工具)运行Android
sdkmanager
时遇到了一个问题。我不想安装JDK 8或类似的东西。有没有办法用JDK 11解决Android
sdkmanager
的问题


我已经看过了,但它没有为Java11提供命令行修复。任何其他可能的解决方法?

下载jxab和jaf,将它们全部放入类路径

e、 g

sdkmanager.bat

...
set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-api.jar
set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-core.jar
set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-impl.jar
set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-jxc.jar
set CLASSPATH=%CLASSPATH%;mylib\jaxb-ri\lib\jaxb-xjc.jar
set CLASSPATH=%CLASSPATH%;mylib\jaf-1.1.1\activation.jar

@rem Execute sdkmanager
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS%  -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS%
...

更新:正如另一个答案中所解释的,来自新命令行工具的sdkmanager支持JDK 11+。旧的sdkmanager已多年没有收到更新,因此不需要此解决方案。查看@dmertins answer以获取链接和更多详细信息


如果有人正在寻找Java 11上的Linux修复程序。我在前面答案的基础上建立了这个

cd Android/tools
mkdir jaxb_lib
wget https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar -O jaxb_lib/activation.jar
wget https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.3/jaxb-impl-2.3.3.jar -O jaxb_lib/jaxb-impl.jar
wget https://repo1.maven.org/maven2/com/sun/istack/istack-commons-runtime/3.0.11/istack-commons-runtime-3.0.11.jar -O jaxb_lib/istack-commons-runtime.jar
wget https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-xjc/2.3.3/jaxb-xjc-2.3.3.jar -O jaxb_lib/jaxb-xjc.jar
wget https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar -O jaxb_lib/jaxb-core.jar
wget https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-jxc/2.3.3/jaxb-jxc-2.3.3.jar -O jaxb_lib/jaxb-jxc.jar
wget https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar -O jaxb_lib/jaxb-api.jar
下载完成后(确保所有文件都已下载正常),必须在tools/bin目录中编辑sdkmanager和avdmanager脚本。您可以手动或自动执行此操作

来自Simon Ruggier answer(除非您使用gnu sed,否则在mac上不起作用):

或者手动向下滚动到CLASSPATH变量,添加我们刚刚下载的新JAR,如下所示:

CLASSPATH=$APP_HOME/jaxb_lib/activation.jar:$APP_HOME/jaxb_lib/jaxb-impl.jar:$APP_HOME/jaxb_lib/jaxb-xjc.jar:$APP_HOME/jaxb_lib/jaxb-core.jar:$APP_HOME/jaxb_lib/jaxb-jxc.jar:$APP_HOME/jaxb_lib/jaxb-api.jar:<etc etc...DO NOT REMOVE THE OTHER JARS!...>
CLASSPATH=$APP_HOME/jaxb_lib/activation.jar:$APP_HOME/jaxb_lib/jaxb impl.jar:$APP_HOME/jaxb_lib/jaxb core.jar:$APP_HOME/jaxb_lib/jaxb jxc.jar:$APP_HOME/jaxb_lib/jaxb-api.jar:
线程“main”java.lang.NoClassDefFoundError中出现异常:javax/xml/bind/annotation/XmlSchema 位于com.android.repository.api.SchemaModule$SchemaModule版本。(SchemaModule.java:156) 位于com.android.repository.api.SchemaModule(SchemaModule.java:75) 位于com.android.sdklib.repository.AndroidSdkHandler.(AndroidSdkHandler.java:81) 位于com.android.sdklib.tool.sdkmanager.sdkmanagerli.main(sdkmanagerli.java:73) 位于com.android.sdklib.tool.sdkmanager.sdkmanagerli.main(sdkmanagerli.java:48) 原因:java.lang.ClassNotFoundException:javax.xml.bind.annotation.XmlSchema 位于java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) 位于java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) 位于java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 还有5个

使用Java12,我遵循以下步骤绕过此警告。谢谢王倩

导航到安装android sdk的路径,如下所示

%LOCALAPPDATA%\Android\Sdk\tools\bin
使用文本编辑器(如记事本)编辑sdkmanager.bat

在大约第70行找到以下几行

@rem Execute sdkmanager
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS%  -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS%
在这些行的正上方,粘贴以下代码

set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\jaxb-api.jar
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\jaxb-core.jar
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\jaxb-impl.jar
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\jaxb-jxc.jar
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\jaxb-xjc.jar
set CLASSPATH=%CLASSPATH%;%APP_HOME%\mylib\activation.jar
在android sdk安装的tools文件夹中创建一个名为mylib的新文件夹

%LOCALAPPDATA%\Android\Sdk\tools\mylib
下载以下6个jar文件的最新版本,并将它们放在mylib文件夹中

删除文件名中的版本控制,以匹配sdkmanager.bat文件中设置的文件名。您现在应该拥有以下文件

%LOCALAPPDATA%\Android\Sdk\tools\mylib\activation.jar
%LOCALAPPDATA%\Android\Sdk\tools\mylib\jaxb-api.jar
%LOCALAPPDATA%\Android\Sdk\tools\mylib\jaxb-core.jar
%LOCALAPPDATA%\Android\Sdk\tools\mylib\jaxb-impl.jar
%LOCALAPPDATA%\Android\Sdk\tools\mylib\jaxb-jxc.jar
%LOCALAPPDATA%\Android\Sdk\tools\mylib\jaxb-xjc.jar
一切就绪!现在运行sdkmanager--update命令

%LOCALAPPDATA%\Android\sdk\tools\bin\sdkmanager --update
在尝试之后,我在线程“main”java.lang.NoSuchFieldError:REFLECTION中得到了
异常。这可能是因为jaxb impl和jaxb core的版本不匹配。确保下载这两个库的相同版本,例如
2.3.0.1

在那之后,我得到了另一个异常:
线程“main”java.lang.NoClassDefFoundError中的异常:com/sun/istack/FinalArrayList
。我发现这是因为我们缺少另一个库:。下载它并将其放入类路径中


因此,需要添加到类路径的库依赖项的完整列表应该是:

  • jaxb api
  • jaxb内核
  • jaxb impl
  • jaxbjxc
  • jaxbxjc
  • 活化
  • istack公用运行时


在此之后,您应该能够运行
sdkmanager
,但会发出非法反射访问的警告。你可以忽略它,没有任何问题。如果你对它感兴趣,可以快速搜索。关于此警告,您会发现许多有关堆栈溢出的问题

根据前面的回答,有一个问题,您最好使用较新的
jaxb impl
jar,例如
2.3.1
,以避免反射警告


此外,如果我们将所有jar文件放入
${APP_HOME}/lib
中,然后将
${APP_HOME}/lib/*
附加到
类路径
,java将拾取所有jar文件。

以下是Emilio答案的更自动化版本(谢谢!):

cd/Android工具
mkdir jaxb_库
wgethttps://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar -O jaxb_lib/activation.jar
wgethttps://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.3/jaxb-impl-2.3.3.jar -O jaxb_lib/jaxb-impl.jar
wgethttps://repo1.maven.org/maven2/com/sun/istack/istack-commons-runtime/3.0.11/istack-commons-runtime-3.0.11.jar -O jaxb_lib/istack-commons-runtime.jar
wgethttps://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-xjc/2.3.3/jaxb-xjc-2.3.3.jar -O jaxb_lib/jaxb-xjc.jar
wgethttps://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar -O jaxb_lib/jaxb-core.jar
wgethttps://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-jxc/2.3.3/jaxb-jxc-2.3.3.jar -O jaxb_lib/jaxb-jxc.jar
wgethttps://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar -O jaxb_lib/jaxb-api.jar
#将jaxb_lib附加到sdkmanager和avdmanager中的类路径
sed-ie的%^CLASSPATH=.*%\0:$APP_HOME/jaxb_lib/*%'bin/sdkmanager bin/avdmanager

jar目录也不属于
bin
,因此这些说明将其置于更高的级别。

如果您使用的是Apple Silicon或未安装wget:

cd Android/sdk/tools # or Android/tools
mkdir jaxb_lib
curl https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar -o jaxb_lib/activation.jar
curl https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.3/jaxb-impl-2.3.3.jar -o jaxb_lib/jaxb-impl.jar
curl https://repo1.maven.org/maven2/com/sun/istack/istack-commons-runtime/3.0.11/istack-commons-runtime-3.0.11.jar -o jaxb_lib/istack-commons-runtime.jar
curl https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-xjc/2.3.3/jaxb-xjc-2.3.3.jar -o jaxb_lib/jaxb-xjc.jar
curl https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar -o jaxb_lib/jaxb-core.jar
curl https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-jxc/2.3.3/jaxb-jxc-2.3.3.jar -o jaxb_lib/jaxb-jxc.jar
curl https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar -o jaxb_lib/jaxb-api.jar

# Add To CLASSPATH
sed -ie 's%^CLASSPATH=.*%\0:$APP_HOME/jaxb_lib/*%' bin/sdkmanager bin/avdmanager
# Add this manually on newline after CLASSPATH
CLASSPATH=$APP_HOME/jaxb_lib/activation.jar:$APP_HOME/jaxb_lib/jaxb-impl.jar:$APP_HOME/jaxb_lib/jaxb-xjc.jar:$APP_HOME/jaxb_lib/jaxb-core.jar:$APP_HOME/jaxb_lib/jaxb-jxc.jar:$APP_HOME/jaxb_lib/jaxb-api.jar:$APP_HOME/jaxb_lib/istack-commons-runtime.jar:$CLASSPATH

cd Android/sdk/tools # or Android/tools
mkdir jaxb_lib
curl https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar -o jaxb_lib/activation.jar
curl https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.3/jaxb-impl-2.3.3.jar -o jaxb_lib/jaxb-impl.jar
curl https://repo1.maven.org/maven2/com/sun/istack/istack-commons-runtime/3.0.11/istack-commons-runtime-3.0.11.jar -o jaxb_lib/istack-commons-runtime.jar
curl https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-xjc/2.3.3/jaxb-xjc-2.3.3.jar -o jaxb_lib/jaxb-xjc.jar
curl https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar -o jaxb_lib/jaxb-core.jar
curl https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-jxc/2.3.3/jaxb-jxc-2.3.3.jar -o jaxb_lib/jaxb-jxc.jar
curl https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar -o jaxb_lib/jaxb-api.jar

# Add To CLASSPATH
sed -ie 's%^CLASSPATH=.*%\0:$APP_HOME/jaxb_lib/*%' bin/sdkmanager bin/avdmanager
# Add this manually on newline after CLASSPATH
CLASSPATH=$APP_HOME/jaxb_lib/activation.jar:$APP_HOME/jaxb_lib/jaxb-impl.jar:$APP_HOME/jaxb_lib/jaxb-xjc.jar:$APP_HOME/jaxb_lib/jaxb-core.jar:$APP_HOME/jaxb_lib/jaxb-jxc.jar:$APP_HOME/jaxb_lib/jaxb-api.jar:$APP_HOME/jaxb_lib/istack-commons-runtime.jar:$CLASSPATH