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

生产环境下如何通过Spring Boot Maven插件为Ubuntu Noble运行镜像添加FreeType

生产环境下为Ubuntu Noble运行镜像添加FreeType的可行方案(Spring Boot 3.5)

问题概述

Spring Boot 3.5默认使用paketobuildpacks/builder-noble-java-tiny构建镜像,配套的paketobuildpacks/ubuntu-noble-run运行镜像缺少libfreetype.so.6库,导致生成Excel时抛出java.lang.UnsatisfiedLinkError错误。官方推荐的Apt Buildpack为实验性工具,不适用于生产环境,因此需要可靠的替代方案。

可行方案

方案一:自定义非实验性Buildpack安装FreeType

构建极简自定义Buildpack,在镜像构建阶段为运行镜像安装FreeType库,规避实验性工具依赖。

  1. 编写自定义Buildpack
    创建如下结构的Buildpack目录:
custom-freetype-buildpack/
├── buildpack.toml
└── bin/
    └── build
  • buildpack.toml内容:

    api = "0.10"
    id = "com.yourorg.freetype"
    name = "Custom FreeType Buildpack"
    version = "1.0.0"
    stacks = ["io.buildpacks.stacks.noble"]
    
  • bin/build脚本(执行chmod +x bin/build赋予可执行权限):

    #!/usr/bin/env bash
    set -eo pipefail
    
    # 创建layers目录
    mkdir -p "$LAYERS_DIR/freetype"
    
    # 在build阶段安装freetype并复制到layer
    apt-get update && apt-get install -y --no-install-recommends libfreetype6
    cp /usr/lib/x86_64-linux-gnu/libfreetype.so.6 "$LAYERS_DIR/freetype/"
    
    # 配置layer在launch阶段生效
    cat > "$LAYERS_DIR/freetype/launch.toml" << EOL
    [processes]
    type = "web"
    command = ""
    env = { "LD_LIBRARY_PATH" = "\$LD_LIBRARY_PATH:$LAYERS_DIR/freetype" }
    EOL
    
    # 标记layer为缓存和可启动
    touch "$LAYERS_DIR/freetype/cache.toml"
    touch "$LAYERS_DIR/freetype/launch.toml"
    
  1. 在Spring Boot Maven插件中配置使用自定义Buildpack
    修改pom.xml中的spring-boot-maven-plugin配置,添加自定义Buildpack路径:
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <image>
            <builder>paketobuildpacks/builder-noble-java-tiny</builder>
            <runImage>paketobuildpacks/ubuntu-noble-run</runImage>
            <buildpacks>
                <buildpack>file:///${project.basedir}/custom-freetype-buildpack</buildpack>
                <buildpack>paketo-buildpacks/java</buildpack>
            </buildpacks>
        </image>
    </configuration>
</plugin>

执行构建命令:

mvn spring-boot:build-image

方案二:将FreeType库打包到应用资源并指定加载路径

若不想编写自定义Buildpack,可将FreeType库打包到应用中,启动时指定库加载路径。

  1. 获取Ubuntu Noble版本的FreeType库
    从Ubuntu Noble仓库下载libfreetype6库文件(libfreetype.so.6),放置到项目的src/main/resources/lib目录下。

  2. 配置Spring Boot启动参数
    在pom.xml的spring-boot-maven-plugin中添加JVM启动参数:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <image>
            <builder>paketobuildpacks/builder-noble-java-tiny</builder>
            <runImage>paketobuildpacks/ubuntu-noble-run</runImage>
        </image>
        <jvmArguments>-Djava.library.path=/workspace/resources/lib</jvmArguments>
    </configuration>
</plugin>

或在Docker启动时通过环境变量指定:

docker run -e JAVA_OPTS="-Djava.library.path=/workspace/resources/lib" your-app-image

方案对比

  • 方案一:符合Buildpack生态,镜像构建过程标准化,适合长期维护的生产环境。
  • 方案二:实现简单,无需额外Buildpack开发,但需手动维护库文件版本,适合快速临时解决问题。

内容的提问来源于stack exchange,提问作者dur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:22:32