【问题标题】:Getting Android sdkmanager to run with Java 11让 Android sdkmanager 与 Java 11 一起运行
【发布时间】:2019-04-04 05:02:40
【问题描述】:

我在使用 Java 11(不是工作室,只有 SDK 工具)运行 Android sdkmanager 时遇到问题。我不想安装 JDK 8 或类似的东西。有没有办法使用 JDK 11 为 Android sdkmanager 解决这个问题?

我已经使用了this answer,但它没有为 java 11 提供命令行修复。还有其他可能的解决方法吗?

【问题讨论】:

  • 您是否面临与链接问题类似的问题,或者您面临的问题是什么?您是否尝试过使用 Java11 开始运行?
  • 如果你能准确地命名问题而不是说“一个问题”,这可能会有所帮助。编辑您的问题并添加错误消息和/或堆栈跟踪。
  • 我也遇到了同样的问题。抛出的异常是:线程“main”中的异常 java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema

标签: android java-11


【解决方案1】:

下载jxab和jaf,将它们全部放入classpath中。

例如

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%
...
【解决方案2】:

更新:如另一个答案中所述,新命令行工具中的 sdkmanager 支持 JDK 11+。旧的 sdkmanager 多年未收到更新,因此不需要此解决方法。检查@dmertins 答案以获取链接和更多详细信息。


如果有人正在寻找 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 的回答(除非您使用 gnu-sed,否则在 mac 上不起作用):

sed -ie 's%^CLASSPATH=.*%\0:$APP_HOME/jaxb_lib/*%' bin/sdkmanager bin/avdmanager

或者手动,向下滚动到 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!...>

【讨论】:

  • 在我朋友的mac上试过了,安装wget后也可以使用
  • MacOS 用户在这里 -- 这是截至 2019 年 9 月 12 日我在互联网上找到的最佳答案。
  • macOS 10.14.6, Java: 13.0.1 2019-10-15,这里还是错误./sdkmanager --version WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.sun.xml.bind.v2.runtime.reflect.opt.Injector$1 (file:/Users/limao/Library/Android/sdk/tools/bin/jaxb_lib/jaxb-impl.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) ...,
  • 我添加了这个答案的更方便的版本作为单独的答案。我不是为了上网点,所以我最初打算在这里发表评论作为建议,但是有最大评论长度,并且不支持 cmets 中的代码块,所以我不得不将它放在一个单独的答案中有用。如果此答案得到更新以纳入改进,请告诉我,我会删除我的。
  • 如果使用与 JDK11+ 兼容的新“命令行工具”包,则不需要这样做。请参阅下面的更新答案
【解决方案3】:

线程“主”java.lang.NoClassDefFoundError 中的异常:javax/xml/bind/annotation/XmlSchema 在 com.android.repository.api.SchemaModule$SchemaModuleVersion.(SchemaModule.java:156) 在 com.android.repository.api.SchemaModule.(SchemaModule.java:75) 在 com.android.sdklib.repository.AndroidSdkHandler.(AndroidSdkHandler.java:81) 在 com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73) 在 com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.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 更多

使用 Java 12,这些是我绕过此警告所遵循的步骤。感谢王倩。

导航到安装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

【讨论】:

    【解决方案4】:

    在尝试Wang Qian's answer 之后,我得到了Exception in thread "main" java.lang.NoSuchFieldError: REFLECTION。这可能是因为 jaxb-impl 和 jaxb-core 的版本不匹配。确保下载这两个库的相同版本,例如2.3.0.1

    在那之后,我得到了另一个例外:Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/istack/FinalArrayList。我发现这是因为我们缺少另一个库:istack-commons-runtime。下载它并将其放入类路径中。


    所以需要添加到类路径的库依赖的完整列表应该是:

    • jaxb-api
    • jaxb 核心
    • jaxb 实现
    • jaxb-jxc
    • jaxb-xjc
    • 激活
    • istack-commons-runtime

    在此之后,您应该能够运行sdkmanager,但会收到非法反射访问的警告。您可以忽略它而不会出现任何问题。如果您对此感兴趣,请快速搜索。您会在 Stack Overflow 上找到很多关于此警告的问题。

    【讨论】:

      【解决方案5】:

      根据之前的答案有一个问题,您最好使用更新的jaxb-impl jar,例如2.3.1 以避免反射警告。

      https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.1/jaxb-impl-2.3.1.jar

      另外,如果我们把所有的jar文件放到${APP_HOME}/lib,然后将${APP_HOME}/lib/*追加到CLASSPATH,java会提取所有的jar文件。

      【讨论】:

        【解决方案6】:

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

        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
        # Append jaxb_lib to the CLASSPATH in sdkmanager and avdmanager
        sed -ie 's%^CLASSPATH=.*%\0:$APP_HOME/jaxb_lib/*%' bin/sdkmanager bin/avdmanager
        

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

        【讨论】:

          【解决方案7】:

          如果您使用 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
          

          【讨论】:

            【解决方案8】:

            已弃用的 SDK 工具 软件包附带的 sdkmanager 不支持 JDK 8,并且自 2017 年 9 月起不再接收更新。更多信息 herehere

            新的命令行工具包中包含的sdkmanager支持JDK 11,可以从Android Studio下载页面下载,仅限命令行工具section。无需下载任何其他文件或使用 sdkmanager 脚​​本破解,但是您需要更新 PATH 设置,例如在 Linux 上:$ANDROID_HOME/cmdline-tools/latest/bin 而不是 $ANDROID_HOME/tools/bin

            虽然旧版工具包已被弃用,但默认情况下仍会随 Android Studio 4.1.1 一起安装旧版工具包。这个post 解释了原因。

            【讨论】:

            • 这是 2021 年 3 月的正确答案。通常现在是 PATH 问题,新的命令行工具 ($ANDROID_HOME/cmdline-tools/latest/bin) 在旧工具 ($ANDROID_HOME/tools/bin) 之前不在 PATH 中,但要么引用它们直接或重新组织你的路径,你就有了现代 JDK11 兼容的 sdkmanager。
            • 此建议似乎已于 2021 年 11 月过时。Android SDK 命令行工具的官方下载中没有 latest 文件夹,只有 Java-11 不兼容的 sdkmanager .
            【解决方案9】:

            对于那些在 Travis CI 中看到此问题的人: 我在尝试接受针对 Android 30 的构建工具 30.0.2 的许可协议时看到此错误,Java 11 用于 travis CI 构建。 应用这个答案 (https://stackoverflow.com/a/65782803/6500352) 我最终得到了这个工作 yml

            os: linux
            language: android
            jdk: openjdk11
            
            android:
             components:
               - tools
               - platform-tools
               - tools
               - extra-android-m2repository
            env:
              global:
                - TARGET_VERSION=30
                - ANDROID_BUILD_TOOLS_VERSION=30.0.2
                - ANDROID_HOME=~/android-sdk
            
            before_install:
              - touch $HOME/.android/repositories.cfg
              - wget "https://dl.google.com/android/repository/commandlinetools-linux-7302050_latest.zip" -O commandlinetools.zip
              - unzip commandlinetools.zip -d $ANDROID_HOME/
              - yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager "platforms;android-${TARGET_VERSION}" --sdk_root=$ANDROID_HOME
              - yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" --sdk_root=$ANDROID_HOME
            
            before_script:
             - chmod +x gradlew
            script:
            - ./gradlew your_command_here
            

            【讨论】:

            • tools 和 platform-tools 在 android 组件下不需要,因为您手动获取它们。 Android Gradle 插件也会按需下载 build-tools,因此 platform:android-30 是您需要的唯一组件。
            • 这适用于 Travis CI 和 Java 11。是的,工具、平台工具和构建工具可以删除而不会造成问题。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-28
            • 2016-03-08
            • 2020-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多