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

在GraalVM原生可执行文件中用Ktor提供静态资源的问题

问题解决:GraalVM原生可执行文件提供Ktor静态资源

完全可以在GraalVM原生可执行文件中正常提供静态资源,你遇到的404问题主要来自两个方面:路由配置的路径映射不匹配,以及GraalVM构建时未正确包含静态资源文件。

1. 修正路由路径映射

你的当前路由中,static("/") { resources("img") }的作用是将根路径/下的请求映射到resources/img目录下的文件。比如访问http://0.0.0.0:8080/test.png才会对应resources/img/test.png,但你实际访问的是/img/test.png,路径不匹配导致404。

如果想通过/img/test.png访问resources/img/test.png,请调整路由为:

routing {
    get("/") {
        call.respondText("Hello GraalVM!")
        call.application.environment.log.info("Call made to /")
    }

    static("/img") {
        resources(".") // 将/img路径直接映射到resources/img目录
    }
}

2. 配置GraalVM原生镜像包含静态资源

GraalVM默认不会自动打包resources目录下的所有文件,必须显式指定要包含的资源路径,否则原生可执行文件中会缺失这些静态资源。

Gradle配置示例

在build.gradle.kts的graalvmNative块中添加资源包含规则:

graalvmNative {
    binaries {
        named("main") {
            resources {
                includes.add("img/**") // 包含img目录下所有文件及子目录
            }
        }
    }
}

Maven配置示例

在pom.xml的native-maven-plugin中添加资源包含配置:

<plugin>
    <groupId>org.graalvm.buildtools</groupId>
    <artifactId>native-maven-plugin</artifactId>
    <version>0.9.28</version>
    <executions>
        <execution>
            <id>build-native</id>
            <goals>
                <goal>build</goal>
            </goals>
            <phase>package</phase>
        </execution>
    </executions>
    <configuration>
        <resourcesIncludes>
            <resourceInclude>img/**</resourceInclude>
        </resourcesIncludes>
    </configuration>
</plugin>

直接使用native-image命令

如果手动执行native-image命令,需添加资源包含参数:

native-image -H:IncludeResources="img/**" -jar your-app.jar

3. 验证与测试

完成上述配置后,重新构建JAR包,再生成原生可执行文件。此时访问http://0.0.0.0:8080/img/test.png应该就能正常返回静态资源了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:35:28