Локальный запуск micronaut без сервера

Я пытаюсь создать функцию AWS Lambda с помощью micronaut, используя функции, т.е. я создал свой проект poc с помощью:

      mn create-function-app --build=maven --jdk=11 micronaut-test

Я могу очень легко собрать и развернуть его на AWS, но мне интересно, есть ли способ запустить его локально, чтобы я мог быстро протестировать изменения так же, как вы можете запустить обычное приложение Micronaut с

      mvn mn:run

Прямо сейчас это всего лишь образец приложения, переформулирующий мой вопрос; Могу ли я запустить метод execute в BookRequestHandler, не загружая его в AWS?

Заранее спасибо.

2 ответа

Я хотел добиться того же результата, используя проект Micronaut с Gradle и Kotlin, и после долгих поисков это было единственное решение, которое я нашел. Теперь я хотел бы поделиться своим решением с другими, кто может столкнуться с той же проблемой при работе с Gradle.

Определите новую конфигурацию в файле build.gradle:

      configurations {
    create("localRuntime")
}

Добавьте зависимость времени выполнения Micronaut Netty в блок зависимостей:

      dependencies {
    ...
    localRuntime("io.micronaut:micronaut-http-server-netty:$micronautVersion")
}

Обязательно замените $micronautVersion соответствующей версией Micronaut. Создайте новую задачу Gradle для локального запуска проекта:

      tasks.register('runLocal', JavaExec) {
    print(configurations.getByName("localRuntime"))
    classpath = configurations.getByName("localRuntime") + sourceSets.main.runtimeClasspath
    mainClass = "com.example.ApplicationKt"
    args("--micronaut.runtime=netty")
}

Запустите проект локально, используяrunLocalзадача:

      gradle runLocal

МойApplication.kt:

      package com.example

import io.micronaut.runtime.Micronaut.run


fun main(args: Array<String>) {
    run(*args)
}

Контроллер:

      package com.example

import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get

@Controller
class ExampleController {

    @Get("/hello")
    fun helloWorld() = mapOf("message" to "Hello World")
}

Профили Maven можно использовать для выбора среды выполнения (в этом примере используется netty) и основного класса:

          <profiles>
        <profile>
            <id>local</id>
            <properties>
                <exec.mainClass>micronaut.Application</exec.mainClass>
                <micronaut.runtime>netty</micronaut.runtime>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>io.micronaut</groupId>
                    <artifactId>micronaut-http-server-netty</artifactId>
                    <scope>compile</scope>
                </dependency>
            </dependencies>
        </profile>
    </profiles>

Создайте основной класс с контроллером с методом Post, который вызывает функцию

      package micronaut;

import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Post;
import io.micronaut.runtime.Micronaut;
import micronaut.test.Book;
import micronaut.test.BookRequestHandler;
import micronaut.test.BookSaved;

public class Application {

    public static void main(String[] args) {
        Micronaut.run(Application.class, args);
    }

    @Controller()
    public static class LambdaController {

        private static final BookRequestHandler handler = new BookRequestHandler();

        @Post
        public BookSaved execute(@Body Book book) {
            return handler.execute(book);
        }
    }
}

и беги с

      mvnw mn:run -Plocal

Теперь вы можете использовать

      curl --location --request POST 'http://localhost:8080/' \
--header 'Content-Type: application/json' \
--data-raw '{"name": "Test"}'

возвращение

      {
    "name": "Test",
    "isbn": "2a163c3d-4bd6-444d-914d-58daf3e649b8"
}

Это немного взломано, чтобы проверить свою функцию, вы можете просмотреть класс micronaut-test / src / test / java / micronaut / test / BookRequestHandlerTest.java или просмотреть официальные документы Testing Lambda Handlers .

Примечание. Для приложений, созданных с помощью mn create-app -f aws-lambda ... не требуется <exec.mainClass> в pom.xml, и создается Application.java.

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