Я разрабатываю MS в Micronaut, которую я хочу запустить как собственный образ Graalvm на AWS Lambda. У меня есть несколько зависимостей, таких как Jackson ObjectMapper, Apache POI и т. д., в проекте, который использует структуру отражения. Но Graalvm не поддерживает структуру отражения из коробки. Итак, нам нужно предоставить конфигурацию для классов, которые используют структуру отражения. Чтобы сгенерировать такую конфигурацию, я пытаюсь использовать агент трассировки Graalvm, но, похоже, он не работает.
build.gradle
.gradle.properties
:
org.gradle.jvmargs=-agentlib:native-image-agent=config-output-dir=<path to dir>
run
из IntelliJ, и выполняю все методы, которые фактически используют эти библиотеки (таким образом, выполняется весь код этих библиотек).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")
}
Спасибо за ответ @JohannesKuhn. Как мы можем запустить его на шаге выполнения?
Без понятия. Я использую мавен.
Можете ли вы предоставить свой build.gradle
файл? Это помогло бы воспроизвести настройку
Добавлено build.gradle
Поскольку это то, что вы редко делаете, я обычно запускаю команду непосредственно против толстой банки.
Вот как я это делаю.
./gradlew build
. Это создает толстую банку в builds/libs
build/libs
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
(без ошибок).
Нужно ли нам добавлять какую-либо конкретную зависимость в build.gradle
для запуска приложения Micronaut из Jar? В настоящее время я настроил это приложение для работы на AWS Lambda как функцию с использованием собственного образа Graalvm.
Добавил build.gradle
в вопрос.
Спасибо @saw303, я только что добавил среду выполнения netty, а затем смог запустить банку локально и сгенерировать конфигурации, связанные с отражением.
знаете ли вы, как мы можем сгенерировать все конфигурации отражения, не запуская все возможные пути выполнения в коде. Потому что я разрабатываю проект, в котором много сторонних библиотек, и выполнение каждого пути будет невозможно, потому что может быть много невидимых случаев.
В настоящее время я конкретно говорю о библиотеке Apache POI, в которой есть множество классов и библиотек с отражением. Как я могу получить все конфигурации отражения для Apache POI lib? Таких библиотек в моем проекте может быть еще много.
Apache POI в настоящее время вызывает много проблем github.com/oracle/graal/issues/2187 Я еще не смог запустить его как собственный образ
Вы не хотите запускать агент на виртуальной машине сборки, вы хотите запустить его на шаге запуска.
org.gradle.jvmargs
для аргументов ВМ для среды сборки