Micronaut: Graalvm: собственный агент трассировки изображений не работает

Я разрабатываю MS в Micronaut, которую я хочу запустить как собственный образ Graalvm на AWS Lambda. У меня есть несколько зависимостей, таких как Jackson ObjectMapper, Apache POI и т. д., в проекте, который использует структуру отражения. Но Graalvm не поддерживает структуру отражения из коробки. Итак, нам нужно предоставить конфигурацию для классов, которые используют структуру отражения. Чтобы сгенерировать такую ​​конфигурацию, я пытаюсь использовать агент трассировки Graalvm, но, похоже, он не работает.

  • Он успешно генерирует файлы конфигурации JSON.
  • Но эти файлы конфигурации JSON не содержат классов из сторонних библиотек, которые добавлены в build.gradle.
  • У меня есть параметр ниже в файле gradle.properties:
    • org.gradle.jvmargs=-agentlib:native-image-agent=config-output-dir=<path to dir>
  • Затем я запускаю проект, используя задачу gradle run из IntelliJ, и выполняю все методы, которые фактически используют эти библиотеки (таким образом, выполняется весь код этих библиотек).
  • Как только выполнение остановлено, я нахожу несколько файлов конфигурации, сгенерированных по указанному пути каталога, но эти файлы содержат только классы, связанные с Gradle, Jetbrains и некоторыми другими. Я не могу найти какие-либо классы, связанные со сторонними библиотеками, которые я использую и которые упомянуты в build.gradle.

Каким должен быть правильный способ создания JSON-файла конфигурации отражения для собственного образа Micronaut Graalvm?

build.gradle:

plugins {
    id("com.github.johnrengelman.shadow") version "7.1.2"
    id("io.micronaut.application") version "3.5.1"
}

version = "0.1"
group = "com.base.package"

repositories {
    mavenCentral()
}

ext {
    orgJsonVersion = "20220320"
    poiVersion = "3.9"
    apacheCommons = "3.12.0"
    googleGson = "2.9.1"
    springValidation = "2.7.3"
    eclipseLink = "3.0.3"
    servletApi = "2.5"
    velocity = "1.7"
    velocityTools = "2.0"
    kafkaClient = "2.1.1"
    googleGuava = "27.0-jre"
}

dependencies {
    annotationProcessor('io.micronaut:micronaut-inject-java')
    annotationProcessor("io.micronaut.data:micronaut-data-processor")
    annotationProcessor("io.micronaut:micronaut-http-validation")
    implementation("io.micronaut:micronaut-http-client")
    implementation("io.micronaut:micronaut-jackson-databind")
    implementation("jakarta.annotation:jakarta.annotation-api")
    runtimeOnly("ch.qos.logback:logback-classic")
//    runtimeOnly('org.slf4j:log4j-over-slf4j:2.0.2')
    implementation("io.micronaut:micronaut-validation")
    implementation("io.micronaut.data:micronaut-data-hibernate-jpa")
    implementation("io.micronaut.sql:micronaut-jdbc-hikari")
    compileOnly("io.micronaut.sql:micronaut-hibernate-jpa")
    runtimeOnly("mysql:mysql-connector-java")
    compileOnly("org.graalvm.nativeimage:svm")

    // compileOnly group: 'io.micronaut', name: 'micronaut-http-server-netty'

    implementation("io.micronaut.aws:micronaut-function-aws")

    implementation("io.micronaut.aws:micronaut-function-aws-custom-runtime")
    implementation group: 'org.json', name: 'json', version: "${orgJsonVersion}"

    implementation group: 'org.apache.poi', name: 'poi', version: "${poiVersion}"
    implementation group: 'org.apache.poi', name: 'poi-ooxml', version: "${poiVersion}"
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: "${apacheCommons}"
    implementation group: 'com.google.code.gson', name: 'gson', version: "${googleGson}"
//    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version: "${springValidation}"
    implementation group: 'org.eclipse.persistence', name: 'eclipselink', version: "${eclipseLink}"
//    compileOnly group: 'javax.servlet', name: 'servlet-api', version: "${servletApi}"
    implementation("org.apache.velocity:velocity:${velocity}") {
        exclude group: 'log4j', module: 'log4j'
    }
    implementation("org.apache.velocity:velocity-tools:${velocityTools}") {
        exclude group: 'log4j', module: 'log4j'
    }
    implementation group: 'org.apache.kafka', name: 'kafka-clients', version: "${kafkaClient}"
    implementation group: 'com.google.guava', name: 'guava', version: "${googleGuava}"
//    implementation group: 'org.hibernate', name: 'hibernate-core', version: '5.6.9.Final'
    implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-hibernate5', version: '2.8.3'
    implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.8.3'

}


application {
    mainClass.set("com.base.package.MainApplication")
}

shadowJar {
    mergeServiceFiles()
}

java {
    sourceCompatibility = JavaVersion.toVersion("11")
    targetCompatibility = JavaVersion.toVersion("11")
}

graalvmNative.toolchainDetection = false
micronaut {
    runtime("lambda_provided")
    testRuntime("junit5")
    processing {
        incremental(true)
        annotations("com.base.package.*")
    }
}


tasks.named("dockerfileNative") {
    args(
        "-XX:MaximumHeapSizePercent=80",
        "-Dio.netty.allocator.numDirectArenas=0",
        "-Dio.netty.noPreferDirect=true"
    )
}

graalvmNative.binaries.all {
    buildArgs.add("--no-server -J-Xmx12g -J-Xms4g -O0")
}

Вы не хотите запускать агент на виртуальной машине сборки, вы хотите запустить его на шаге запуска. org.gradle.jvmargs для аргументов ВМ для среды сборки

Johannes Kuhn 02.11.2022 08:01

Спасибо за ответ @JohannesKuhn. Как мы можем запустить его на шаге выполнения?

Jignesh M. Khatri 02.11.2022 08:05

Без понятия. Я использую мавен.

Johannes Kuhn 02.11.2022 08:49

Можете ли вы предоставить свой build.gradle файл? Это помогло бы воспроизвести настройку

saw303 02.11.2022 09:21

Добавлено build.gradle

Jignesh M. Khatri 02.11.2022 13:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
153
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Поскольку это то, что вы редко делаете, я обычно запускаю команду непосредственно против толстой банки.

Вот как я это делаю.

  1. Беги ./gradlew build. Это создает толстую банку в builds/libs
  2. Гото build/libs
  3. Беги java -jar -agentlib:native-image-agent=config-output-dir=META-INF/native-image <your jar name>-all.jar

Пробовал, но когда я запускаю команду java -jar, приложение закрывается после No embedded container found. Running as CLI application (без ошибок).

Jignesh M. Khatri 02.11.2022 08:43

Нужно ли нам добавлять какую-либо конкретную зависимость в build.gradle для запуска приложения Micronaut из Jar? В настоящее время я настроил это приложение для работы на AWS Lambda как функцию с использованием собственного образа Graalvm.

Jignesh M. Khatri 02.11.2022 08:59

Добавил build.gradle в вопрос.

Jignesh M. Khatri 02.11.2022 13:10

Спасибо @saw303, я только что добавил среду выполнения netty, а затем смог запустить банку локально и сгенерировать конфигурации, связанные с отражением.

Jignesh M. Khatri 14.11.2022 06:14

знаете ли вы, как мы можем сгенерировать все конфигурации отражения, не запуская все возможные пути выполнения в коде. Потому что я разрабатываю проект, в котором много сторонних библиотек, и выполнение каждого пути будет невозможно, потому что может быть много невидимых случаев.

Jignesh M. Khatri 17.11.2022 13:08

В настоящее время я конкретно говорю о библиотеке Apache POI, в которой есть множество классов и библиотек с отражением. Как я могу получить все конфигурации отражения для Apache POI lib? Таких библиотек в моем проекте может быть еще много.

Jignesh M. Khatri 17.11.2022 13:09

Apache POI в настоящее время вызывает много проблем github.com/oracle/graal/issues/2187 Я еще не смог запустить его как собственный образ

saw303 17.11.2022 19:56

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