Ошибка Ktor: не указан ни порт, ни sslPort

Итак, я прочитал множество ответов о том, как устранить эту ошибку, но, похоже, к моей ситуации это не относится.

Это приложение 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>

Любая помощь будет оценена по достоинству.

Можете ли вы поделиться кодом основной функции?

Aleksei Tirman 10.05.2024 21:32

@AlekseiTirman Это было бы fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

StackCanary 10.05.2024 21:36

Я предлагаю еще раз проверить, нет ли у вас файла application.conf. Кроме того, вы можете войти в строку (github.com/ktorio/ktor/blob/…) с помощью отладчика, чтобы увидеть, какая конфигурация на самом деле загружается.

Aleksei Tirman 10.05.2024 21:46

Извините, эта строчка — github.com/ktorio/ktor/blob/…

Aleksei Tirman 10.05.2024 21:47

@AlekseiTirman По крайней мере, при работе в Intellij до этой линии не доходит; CONFIG_PATH пуст, поэтому итераций этого цикла нет. В моем проекте также нет файла application.conf, хотя я вижу custom.config.conf, который не является моим действием, когда я открываю jar (однако он определяет порт, поэтому я предполагаю, что он не используется на основе сообщение об ошибке).

StackCanary 10.05.2024 21:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 официально, но я видел ваши ответы и в нескольких других постах, так что спасибо за помощь стольким людям здесь.

StackCanary 13.05.2024 14:07

Я вижу точно такую ​​же проблему, и, к сожалению, это предложение не решило ее.

Maksym Bykovskyy 03.07.2024 16:36

Чтобы добавить к моему комментарию выше, я вижу следующие записи в файле jar: io/ktor/server/config/HoconConfigLoader.class, META-INF/services/io.ktor.server.config.ConfigLoader, io/ktor/server/config/yaml/YamlConfigLoader.class.

Maksym Bykovskyy 04.07.2024 15:22

Другие вопросы по теме