You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中用JDK+Maven构建Keycloak示例遇依赖解析失败求助

问题:Docker容器中构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:33:10