android - 尝试为 Android 项目构建 dockerfile 时出错
问题描述
我正在尝试为用于 CI 配置的 Android 项目构建映像(这将是我管道中的第一步)
我正在尝试运行此命令:
docker build -t android-build:some-name -f Dockerfile .
下面是我的 Dockerfile:
FROM openjdk:11.0.7
ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" \
ANDROID_HOME="/usr/local/android-sdk" \
ANDROID_VERSION=29 \
ANDROID_BUILD_TOOLS_VERSION=28.0.3
RUN mkdir "$ANDROID_HOME" .android \
&& cd "$ANDROID_HOME" \
&& curl -o sdk.zip $SDK_URL \
&& unzip sdk.zip \
&& rm sdk.zip \
&& yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses
RUN $ANDROID_HOME/tools/bin/sdkmanager --update
RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
"platforms;android-${ANDROID_VERSION}" \
"platform-tools"
RUN mkdir /application
WORKDIR /application
我收到如下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
11:11:42
at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
11:11:42
at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
11:11:42
at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
11:11:42
at com.android.sdklib.tool.SdkManagerCli.main(SdkManagerCli.java:117)
11:11:42
at com.android.sdklib.tool.SdkManagerCli.main(SdkManagerCli.java:93)
11:11:42
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
11:11:42
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
11:11:42
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) [0m [91m
11:11:42
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
11:11:42
... 5 more
11:11:42
The command '/bin/sh -c mkdir "$ANDROID_HOME" .android && cd "$ANDROID_HOME" && curl -o sdk.zip $SDK_URL && unzip sdk.zip && rm sdk.zip && yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses' returned a non-zero code: 1
11:11:42
[0m
我也在尝试另一种配置:
FROM openjdk:11.0.7
ENV SDK_URL="https://dl.google.com/android/repository/commandlinetools-linux-6604631_latest.zip" \
ANDROID_HOME="/usr/local/android-sdk" \
ANDROID_VERSION=29 \
ANDROID_BUILD_TOOLS_VERSION=28.0.3 \
RUN mkdir "$ANDROID_HOME" .android \
&& cd "$ANDROID_HOME" \
&& curl -o sdk.zip $SDK_URL \
&& unzip sdk.zip \
&& rm sdk.zip
RUN yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --licenses
RUN $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --update
RUN yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME \
"build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
"platforms;android-${ANDROID_VERSION}"
RUN mkdir /application
WORKDIR /application
但这给了我一个错误,如下所示:
Error response from daemon: failed to parse Dockerfile: Syntax error - can't find = in "RUN". Must be of the form: name=value
11:22:51
Process exited with code 1
不幸的是,我不是 DevOps 人,所以我的配置有什么问题?有人可以帮忙吗?
解决方案
你有两个选项来解决这个问题
- 降级 JDK,以便您拥有 SDK 所需的模块,因为这些模块已在
JDK 9+
- 或者使用可以使用的新 SDK
JDK 9+
FROM openjdk:8
ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" \
ANDROID_HOME="/usr/local/android-sdk" \
ANDROID_VERSION=29 \
ANDROID_BUILD_TOOLS_VERSION=28.0.3
RUN mkdir "$ANDROID_HOME" .android \
&& cd "$ANDROID_HOME" \
&& curl -o sdk.zip $SDK_URL \
&& unzip sdk.zip \
&& rm sdk.zip \
&& yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses
RUN $ANDROID_HOME/tools/bin/sdkmanager --update
RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
"platforms;android-${ANDROID_VERSION}" \
"platform-tools"
RUN mkdir /application
WORKDIR /application
或者您可以查看这个以获取新的 SDK
Google 一直在开发新的 Android SDK 命令行工具版本,该版本可在当前 JVM(9、10、11+)上运行,并且不依赖于已弃用的 JAXB EE 模块!
推荐阅读
- https - 强制 Cloudinary URL 使用 HTTPS
- wordpress - Wordpress 是如何加载模板文件和分享方法的?
- android - 即使全部覆盖,Firebase 也会显示自动通知
- angular - Angular 2+父/子路由
- unity3d - 项目解决方案 | 建筑 | 场景和视图
- ruby - Rails 5.2 中的路由
- excel - 当单元格内容更改时,将单元格内容放入 Excel 工作表页眉或页脚
- php - Laravel POST 方法作为 GET 方法发送。代码 405
- state-machine - sysml - 与警卫一起做活动
- reactjs - React Redux - 递增状态变量不起作用