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

Ktor Maven项目FatJar运行报错:无法识别application.yaml配置

解决Ktor FatJar无法识别application.yaml配置的问题

问题场景

用Maven构建Ktor应用,IntelliJ Ultimate中运行正常,但执行java -jar target/myApp-jar-with-dependencies.jar运行FatJar时,抛出错误:

Exception in thread "main" java.lang.IllegalArgumentException: Neither port nor sslPort specified. Use command line options -port/-sslPort or configure connectors in application.conf

已引入ktor-server-config-yaml-jvm依赖,但程序无法识别application.yaml配置文件,换成application.conf则可正常运行。

原因分析

问题根源在于maven-assembly-plugin的打包逻辑:打包FatJar时,多个依赖中的META-INF/services/io.ktor.server.config.ConfigLoader文件会被覆盖。ktor-server-core自带的ConfigLoader默认仅识别application.conf,而ktor-server-config-yaml提供的ConfigLoader负责加载YAML文件,打包时后者被前者覆盖,导致程序无法识别YAML配置。

解决方案

方案一:改用maven-shade-plugin打包(推荐)

maven-shade-plugin支持合并META-INF/services目录下的文件,不会出现覆盖问题:

  1. 移除pom.xml中原有的maven-assembly-plugin配置
  2. 添加以下maven-shade-plugin配置:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.4.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <!-- 合并META-INF/services下的配置文件,保留所有ConfigLoader实现 -->
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    <!-- 指定应用主类 -->
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>${main.class}</mainClass>
                    </transformer>
                </transformers>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <shadedClassifierName>jar-with-dependencies</shadedClassifierName>
            </configuration>
        </execution>
    </executions>
</plugin>
  1. 执行mvn clean package重新打包,再运行java -jar target/myApp-jar-with-dependencies.jar即可正常加载YAML配置。

方案二:启动时显式指定配置文件

如果不想更换打包插件,可在启动命令中手动指定YAML配置文件路径:

# 配置文件与jar同目录时
java -jar target/myApp-jar-with-dependencies.jar -config=application.yaml

# 配置文件在其他路径时,使用绝对路径
java -jar target/myApp-jar-with-dependencies.jar -config=/path/to/your/application.yaml

额外检查

确保application.yaml的配置格式正确,示例:

ktor:
  deployment:
    port: 8080

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:23:12