当前位置: 首页 > 知识库问答 >
问题:

运行Exec任务构建jar后,从gradle内部使用graalvm构建本机映像

邵劲
2023-03-14

我正在使用Micronaut,并使用它的cli创建一个java-cli-app。它没有额外的代码,通过运行main方法运行良好。当执行./gradlew构建时,它还创建了一个包含所有依赖项的jar。

我也可以使用GraalVM 19.1.1和19.2.0构建本地映像,而且运行良好。

当我通过手动运行以下任务来构建本机映像时

./gradlew buildNativeExecutable

它也运行良好,

当创建jar时,它会自动运行。

我已经试过了,

task taskX << {
    println 'taskX'
}
task taskY << {
    println 'taskY'
}
task taskZ << {
    println 'taskZ'
}
taskX.dependsOn taskY
taskZ.shouldRunAfter taskY

这不起作用(我知道这是旧的,我只是用/尝试不同的变体应该运行后罐/组装)

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"
    }
}

我的身材。格雷德尔锉刀

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

但是,在创建jar后,我无法运行此操作:(

./gradlew build

BUILD SUCCESSFUL in 11s
13 actionable tasks: 11 executed, 2 up-to-date

我应该更改/添加什么来构建。让它在jar创建后运行?

共有1个答案

楚望
2023-03-14

您基本上希望build dNativeExecable阴影Jar之后运行。如果是这样的话,那么只需添加以下内容就可以得到所需的结果:

buildNativeExecutable。dependsOn(shadowJar)

 类似资料:
  • 我在这里将Micronaut应用程序作为Graalvm本地映像进行试用。

  • 我检查了直到Stage-2,本机映像运行得非常好。我包含了Stage-3来运行我的本机映像,结果出现了以下错误 需要帮助如何运行我的本机映像

  • 主要内容:执行多个任务,排除任务,发生故障时继续构建,选择执行哪些构建,获取构建信息Gradle提供了一个命令行来执行构建脚本。 它可以一次执行多个任务。在这里将介绍如何使用不同的选项来执行多个任务。 执行多个任务 可以从单个构建文件执行多个任务。使用命令处理构建文件。此命令将按列出的顺序编译每个任务,并使用不同的选项执行每个任务以及依赖关系。 示例 - 假设有四个任务 - ,,和。和取决于和。 看看下面的图表。 在上面的四个任务是相互依赖的,用一个箭头符号表示。 看看下面的代码

  • 我正在使用GraalVm 21.0.0.2的native-image-maven-plugin为JavaFX应用程序创建一个本机映像。当我尝试在构建成功结束后执行它时,我得到以下错误: 我很感激你能给我的任何帮助。

  • 我正在尝试用Dockers创建一个GraalVM本地映像。我已经创建了一个Micronaut项目,并成功创建了jar应用程序,并在docker中运行;此外,我已经用这个jar文件创建了一个GraalVM本机映像,现在可以运行这个应用程序,但我需要在docker中运行一个GraalVM本机映像,在论坛中寻找答案。我发现有必要在docker中构建本机映像。因此我尝试了这个docker文件: 它不会抛出

  • 我们是 Graalvm 的新手,正在构建一个简单的 Java 命令行应用程序。罐子在jvm模式下运行良好( 没有任何错误。 但是,当我们将本机映像文件复制到主机并使用<code>运行它时/appj它会产生一个错误: 所以我的问题是,我们能从graalvm docker容器内部创建本机映像,复制它并在任何地方运行它吗?或者我们必须在我们的主机上安装Graalvm才能执行本机映像?因为我认为graal