Создайте native-образ с помощью graalvm изнутри gradle после того, как jar собран путем запуска задачи Exec
Я использую Micronaut и использовал его cli для создания java-cli-приложения. У него нет лишнего кода, и он работает нормально, запустив метод main. Когда выполняется сборка./gradlew, она также создает jar со всеми зависимостями.
Я также могу создать собственный образ, используя GraalVM 19.1.1 и 19.2.0, и он также работает нормально.
Когда я создаю собственный образ, вручную запустив задачу, как
./gradlew buildNativeExecutable
это также работает нормально,
что бы сделать, чтобы он запускался автоматически при создании банки.
Что я уже пробовал,
task taskX << {
println 'taskX'
}
task taskY << {
println 'taskY'
}
task taskZ << {
println 'taskZ'
}
taskX.dependsOn taskY
taskZ.shouldRunAfter taskY
Это не сработало (я знаю, что это старый, я просто использовал / пробовал разные варианты shouldRunAfter jar / сборки)
buildNativeExecutable.shouldRunAfter jar
или же
shadowJar.doLast {
task buildNativeExecutable(type:Exec) {
workingDir "${buildDir}/libs"
commandLine "native-image", "-J-Drx.unsafe-disable=true", "-jar", "test-0.1-all.jar", "-H:FallbackThreshold=0", "-H:+ReportExceptionStackTraces", "-H:+PrintAnalysisCallTree", "-H:-AddAllCharsets", "-H:EnableURLProtocols=http,https", "--enable-all-security-services", "-H:-SpawnIsolates", "-H:+JNI", "--no-server", "-H:-UseServiceLoaderFeature", "-H:+StackTrace"
}
}
или же
shadowJar {
mergeServiceFiles()
doLast { task ->
buildNativeExecutable(task)
}
}
или же
build.doLast {
task buildNativeExecutable(type:Exec) {
workingDir "${buildDir}/libs"
commandLine "native-image", "-J-Drx.unsafe-disable=true", "-jar", "test-0.1-all.jar", "-H:FallbackThreshold=0", "-H:+ReportExceptionStackTraces", "-H:+PrintAnalysisCallTree", "-H:-AddAllCharsets", "-H:EnableURLProtocols=http,https", "--enable-all-security-services", "-H:-SpawnIsolates", "-H:+JNI", "--no-server", "-H:-UseServiceLoaderFeature", "-H:+StackTrace"
}
}
мой файл build.gradle
plugins {
id "net.ltgt.apt-eclipse" version "0.21"
id "com.github.johnrengelman.shadow" version "5.0.0"
id "application"
}
version "0.1"
group "test"
repositories {
mavenCentral()
maven { url "https://jcenter.bintray.com" }
}
configurations {
// for dependencies that are needed for development only
developmentOnly
generateConfig
}
dependencies {
annotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion")
annotationProcessor "io.micronaut.configuration:micronaut-picocli"
annotationProcessor "io.micronaut:micronaut-inject-java"
annotationProcessor "io.micronaut:micronaut-validation"
generateConfig 'info.picocli:picocli-codegen:4.0.2'
implementation platform("io.micronaut:micronaut-bom:$micronautVersion")
implementation "io.micronaut:micronaut-runtime"
implementation "info.picocli:picocli"
implementation "io.micronaut.configuration:micronaut-picocli"
implementation "io.micronaut:micronaut-inject"
implementation "io.micronaut:micronaut-validation"
runtimeOnly "ch.qos.logback:logback-classic:1.2.3"
testAnnotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion")
testAnnotationProcessor "io.micronaut:micronaut-inject-java"
testImplementation "org.junit.jupiter:junit-jupiter-api"
testImplementation "io.micronaut.test:micronaut-test-junit5"
testImplementation "io.micronaut:micronaut-inject-java"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine"
}
test.classpath += configurations.developmentOnly
mainClassName = "test.testCommand"
jar {
manifest {
attributes 'Main-Class': mainClassName
}
}
// use JUnit 5 platform
test {
useJUnitPlatform()
}
tasks.withType(JavaCompile){
options.encoding = "UTF-8"
options.compilerArgs.add('-parameters')
}
task(generateGraalReflectionConfig, dependsOn: 'classes', type: JavaExec) {
main = 'picocli.codegen.aot.graalvm.ReflectionConfigGenerator'
classpath = configurations.generateConfig + sourceSets.main.runtimeClasspath
def outputFile = "${buildDir}/resources/main/META-INF/native-image/${project.group}/${project.name}/reflect-config.json"
args = ["--output=$outputFile", mainClassName]
}
assemble.dependsOn generateGraalReflectionConfig
task buildNativeExecutable(type:Exec) {
workingDir "${buildDir}/libs"
commandLine "${System.env.GRAALVM_HOME}/bin/native-image", "-J-Drx.unsafe-disable=true", "-jar", "test-0.1-all.jar", "-H:FallbackThreshold=0", "-H:+ReportExceptionStackTraces", "-H:+PrintAnalysisCallTree", "-H:-AddAllCharsets", "-H:EnableURLProtocols=http,https", "--enable-all-security-services", "-H:-SpawnIsolates", "-H:+JNI", "--no-server", "-H:-UseServiceLoaderFeature", "-H:+StackTrace"
// commandLine "ls", "-l"
}
shadowJar {
mergeServiceFiles()
}
run.classpath += configurations.developmentOnly
run.jvmArgs('-noverify', '-XX:TieredStopAtLevel=1', '-Dcom.sun.management.jmxremote')
Когда я запускаю конкретную задачу, она работает отлично!
$ ./gradlew buildNativeExecutable
> Task :buildNativeExecutable
[test-0.1-all:19292] classlist: 4,886.05 ms
[test-0.1-all:19292] (cap): 1,800.38 ms
[test-0.1-all:19292] setup: 3,589.77 ms
[test-0.1-all:19292] (typeflow): 14,079.22 ms
[test-0.1-all:19292] (objects): 12,647.95 ms
[test-0.1-all:19292] (features): 780.98 ms
[test-0.1-all:19292] analysis: 28,336.62 ms
Printing call tree to /home/someuser/test/build/libs/reports/call_tree_test-0.1-all_20190821_183418.txt
Printing list of used classes to /home/someuser/test/build/libs/reports/used_classes_test-0.1-all_20190821_183421.txt
Printing list of used packages to /home/someuser/test/build/libs/reports/used_packages_test-0.1-all_20190821_183421.txt
[test-0.1-all:19292] (clinit): 572.67 ms
[test-0.1-all:19292] universe: 1,361.53 ms
[test-0.1-all:19292] (parse): 2,219.23 ms
[test-0.1-all:19292] (inline): 3,373.54 ms
[test-0.1-all:19292] (compile): 43,182.08 ms
[test-0.1-all:19292] compile: 50,397.77 ms
[test-0.1-all:19292] image: 4,215.91 ms
[test-0.1-all:19292] write: 2,583.69 ms
[test-0.1-all:19292] [total]: 107,083.26 ms
BUILD SUCCESSFUL in 1m 50s
1 actionable task: 1 executed
$ cd /home/someuser/test/build/libs
$ ls -ltrh
-rw-rw-r-- 1 abcd abcd 1,8K Aug 21 15:42 test-0.1.jar
-rw-rw-r-- 1 abcd abcd 8,9M Aug 21 15:42 test-0.1-all.jar
-rwxrwxr-x 1 abcd abcd 36M Aug 21 15:44 test-0.1-all
Однако я не могу сделать этот запуск после создания банки:(
./gradlew build
BUILD SUCCESSFUL in 11s
13 actionable tasks: 11 executed, 2 up-to-date
Что я должен изменить / добавить в build.gradle выше, чтобы он работал после создания jar?
0 ответов
Ты в основном хочешь buildNativeExecutable
бежать за shadowJar
. Если это так, то просто добавив следующее, вы должны получить желаемый результат:
buildNativeExecutable.dependsOn(shadowJar)