Docker容器中用JDK+Maven构建Keycloak示例遇依赖解析失败求助
本人并非Java开发者,公司有一款手机+OTP登录的Keycloak插件未完成构建,为掌握构建方法,尝试构建Keycloak官方认证器示例。已创建包含JDK、Maven及Keycloak运行包的Dockerfile:
FROM amd64/debian:bookworm-slim RUN apt update -qq > /dev/null \ && apt upgrade -qq > /dev/null \ && apt install openjdk-17-jdk -qq -y > /dev/null \ && apt install openjdk-17-jre -qq -y > /dev/null \ && java -version \ && echo 'export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))' >> /etc/bash.bashrc \ && echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/bash.bashrc \ && mkdir -p /Temp > /dev/null \ && chmod 777 --preserve-root /Temp > /dev/null \ && echo 'public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World from Java!"); } }' > /Temp/Hello.java \ && java /Temp/Hello.java \ && apt install wget -y > /dev/null \ && wget https://github.com/keycloak/keycloak/releases/download/23.0.3/keycloak-23.0.3.zip --quiet -O /Temp/keycloak.zip > /dev/null \ && apt install unzip -y > /dev/null \ && cd /Temp \ && unzip keycloak.zip -d /Keycloak > /dev/null \ && rm -rf keycloak.zip \ && cd /Keycloak > /dev/null \ && mv keycloak-23.0.3/** . > /dev/null \ && rm -rf keycloak-23.0.3 > /dev/null \ && ls -lah \ && wget https://dlcdn.apache.org/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.zip --quiet -O /Temp/maven.zip > /dev/null \ && cd /Temp \ && unzip maven.zip -d /usr/share > /dev/null \ && rm -rf maven.zip \ && ln -s /usr/share/apache-maven-3.9.5/bin/mvn /usr/bin/mvn \ && echo 'M2_HOME=/usr/share/apache-maven-3.9.5' >> /etc/bash.bashrc WORKDIR /Keycloak
执行docker build -t java-keycloak .构建镜像后,用以下docker-compose.yml运行容器:
version: "3.9" services: accounts: image: java-keycloak working_dir: /Keycloak environment: - KEYCLOAK_FRONTEND_URL=https://dev.accounts.local/ - PROXY_ADDRESS_FORWARDING=true - KC_HOSTNAME=dev.accounts.local - KEYCLOAK_ADMIN=adminuser - KEYCLOAK_ADMIN_PASSWORD=adminpass - KC_PROXY=edge - KC_HTTP_ENABLED=true - KC_HOSTNAME_STRICT=false ports: - 8080:8080 command: > bash -c " tail -f /dev/null " volumes: - /Temp/keycloak:/KeycloakSource
已将Keycloak源码克隆到本地/Temp/keycloak并挂载到容器内,进入容器后执行cd /KeycloakSource/examples/providers/authenticator,运行mvn clean install wildfly:deploy时出现错误:
[INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 25.384 s [INFO] Finished at: 2023-12-26T15:09:13Z [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal on project authenticator-required-action-example: Could not resolve dependencies for project org.keycloak:authenticator-required-action-example:jar:999.0.0-SNAPSHOT: The following artifacts could not be resolved: org.keycloak:keycloak-core:jar:999.0.0-SNAPSHOT (absent), org.keycloak:keycloak-server-spi:jar:999.0.0-SNAPSHOT (absent), org.keycloak:keycloak-server-spi-private:jar:999.0.0-SNAPSHOT (absent), org.keycloak:keycloak-services:jar:999.0.0-SNAPSHOT (absent): Could not find artifact org.keycloak:keycloak-core:jar:999.0.0-SNAPSHOT -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
需要解决如何在Docker容器中成功构建该Keycloak示例的问题。
1. 先构建Keycloak源码到本地Maven仓库
错误核心是Maven找不到999.0.0-SNAPSHOT版本的Keycloak依赖包,这些包是Keycloak源码编译后的产物,未发布到公共Maven仓库。需要先在容器内编译Keycloak源码并安装到本地Maven仓库:
进入容器后执行:
cd /KeycloakSource mvn clean install -DskipTests
这个命令会编译Keycloak所有模块,并将生成的SNAPSHOT包安装到容器内的Maven本地仓库,这样示例项目就能找到依赖。
2. 确保源码版本与示例匹配
如果你克隆的是Keycloak的master分支,版本是999.0.0-SNAPSHOT,这和示例依赖一致;如果要对应你下载的23.0.3版本,需要切换源码到对应tag:
进入容器内的源码目录执行:
cd /KeycloakSource git checkout 23.0.3
切换版本后,再执行步骤1的编译命令,此时示例项目的依赖版本也会对应23.0.3,避免版本不匹配问题。
3. 调整示例项目的构建命令
构建示例时,先只执行编译安装,不需要直接部署到Wildfly(除非你已经启动了Keycloak服务器并配置了Wildfly插件):
cd /KeycloakSource/examples/providers/authenticator mvn clean install
构建成功后,生成的jar包会在target目录下,之后可以手动部署到Keycloak服务器的providers目录。
4. 优化Dockerfile(可选)
你的Dockerfile中下载的是Keycloak运行包,而实际用的是挂载的源码,这部分可以去掉,简化Dockerfile:
FROM amd64/debian:bookworm-slim RUN apt update -qq > /dev/null \ && apt upgrade -qq > /dev/null \ && apt install openjdk-17-jdk wget unzip -qq -y > /dev/null \ && java -version \ && echo 'export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))' >> /etc/bash.bashrc \ && echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/bash.bashrc \ && mkdir -p /Temp > /dev/null \ && chmod 777 --preserve-root /Temp > /dev/null \ && wget https://dlcdn.apache.org/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.zip --quiet -O /Temp/maven.zip > /dev/null \ && cd /Temp \ && unzip maven.zip -d /usr/share > /dev/null \ && rm -rf maven.zip \ && ln -s /usr/share/apache-maven-3.9.5/bin/mvn /usr/bin/mvn \ && echo 'M2_HOME=/usr/share/apache-maven-3.9.5' >> /etc/bash.bashrc WORKDIR /KeycloakSource
同时修改docker-compose.yml的working_dir为/KeycloakSource,更贴合实际使用场景。
内容的提问来源于stack exchange,提问作者Json Dimas

