Итак, я прочитал множество ответов о том, как устранить эту ошибку, но, похоже, к моей ситуации это не относится.
Это приложение KTOR, созданное с помощью Maven.
Я получаю сообщение об ошибке: Exception in thread "main" java.lang.IllegalArgumentException: Neither port nor sslPort specified. Use command line options -port/-sslPort or configure connectors in application.conf
Прежде всего, мое приложение отлично работает в IntelliJ Ultimate, но терпит неудачу, когда я пытаюсь запустить fatjar в командной строке следующим образом: java -jar target/myApp-jar-with-dependencies.jar
Суть вопроса, похоже, в том, что моя конфигурация хранится в файле application.yaml.
Я включил эту зависимость:
<dependency>
<groupId>io.ktor</groupId>
<artifactId>ktor-server-config-yaml-jvm</artifactId>
<version>${ktor_version}</version>
</dependency>
Структура моего приложения выглядит следующим образом:
Когда я создаю application.conf в той же папке, он работает нормально, что указывает на то, что он просто не ожидает файла конфигурации yaml, даже когда я включил зависимость ktor yaml.
Наконец, мой сегмент сборки maven выглядит так:
<build>
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin_version}</version>
<configuration>
<jvmTarget>17</jvmTarget>
<compilerPlugins>
<plugin>kotlinx-serialization</plugin>
</compilerPlugins>
</configuration>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-serialization</artifactId>
<version>${kotlin_version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>${main.class}</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>${main.class}</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Любая помощь будет оценена по достоинству.
@AlekseiTirman Это было бы fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
Я предлагаю еще раз проверить, нет ли у вас файла application.conf. Кроме того, вы можете войти в строку (github.com/ktorio/ktor/blob/…) с помощью отладчика, чтобы увидеть, какая конфигурация на самом деле загружается.
Извините, эта строчка — github.com/ktorio/ktor/blob/…
@AlekseiTirman По крайней мере, при работе в Intellij до этой линии не доходит; CONFIG_PATH пуст, поэтому итераций этого цикла нет. В моем проекте также нет файла application.conf, хотя я вижу custom.config.conf, который не является моим действием, когда я открываю jar (однако он определяет порт, поэтому я предполагаю, что он не используется на основе сообщение об ошибке).





Ktor использует ServiceLoader для загрузки всех доступных загрузчиков конфигурации, а затем пытается загрузить конфигурацию по умолчанию для каждого из них. HoconConfigLoader определен в модуле ktor-server-core-jvm, а YamlConfigLoader определен в модуле ktor-server-config-yaml-jvm. Насколько я понимаю, плагин assembly Maven берет файл META-INF/services/io.ktor.server.config.ConfigLoader первого пакета, содержащего этот файл, и упаковывает его в результирующий JAR.
Поскольку модуль ktor-server-core-jvm идет первым в блоке dependencies в pom.xml, плагин упаковывает только определение HoconConfigLoader и игнорирует определение для YAML. В результате приложение пытается загрузить только несуществующий файл application.conf.
Чтобы решить проблему, измените порядок зависимостей в файле pom.xml:
<dependencies>
<dependency> <!-- To be able to use yaml as server configuration -->
<groupId>io.ktor</groupId>
<artifactId>ktor-server-config-yaml-jvm</artifactId>
<version>${ktor_version}</version>
</dependency>
<!-- Ktor -->
<dependency>
<groupId>io.ktor</groupId>
<artifactId>ktor-server-core-jvm</artifactId>
<version>${ktor_version}</version>
</dependency>
<!-- ... -->
<dependencies>
Это сработало! И за объяснение тоже спасибо. На самом деле я пытался переместить зависимость дальше, но не думал о том, чтобы переместить ее выше зависимости от серверного кода. Я не знаю, работаете ли вы с ktor официально, но я видел ваши ответы и в нескольких других постах, так что спасибо за помощь стольким людям здесь.
Я вижу точно такую же проблему, и, к сожалению, это предложение не решило ее.
Чтобы добавить к моему комментарию выше, я вижу следующие записи в файле jar: io/ktor/server/config/HoconConfigLoader.class, META-INF/services/io.ktor.server.config.ConfigLoader, io/ktor/server/config/yaml/YamlConfigLoader.class.
Можете ли вы поделиться кодом основной функции?