Ktor Maven项目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目录下的文件,不会出现覆盖问题:
- 移除pom.xml中原有的
maven-assembly-plugin配置 - 添加以下
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>
- 执行
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

