【问题标题】:Sbt task for picocli graalvm reflection generation?用于 picocli graalvm 反射生成的 Sbt 任务?
【发布时间】:2023-04-02 01:40:01
【问题描述】:

在 picocli 中,他们在 how 上提供了示例,以在构建 Maven 和 Gradle 期间生成 GraalVM 反射配置。

Gradle 示例

configurations {
    generateConfig
}
dependencies {
    compile 'info.picocli:picocli:3.9.3'
    generateConfig 'info.picocli:picocli-codegen:3.9.3'
}

任务

task(generateGraalReflectionConfig, dependsOn: 'classes', type: JavaExec) {
    main = 'picocli.codegen.aot.graalvm.ReflectionConfigGenerator'
    classpath = configurations.generateConfig + sourceSets.main.runtimeClasspath
    def outputFile = new File(project.buildDir, 'cli-reflect.json')
    args = ["--output=$outputFile", 'com.your.package.YourCommand1', 'com.your.package.YourCommand2']
}
assemble.dependsOn generateGraalReflectionConfig

我怎样才能为 sbt 写一些等效的东西?

这是我到目前为止所得到的,但我不知道我是否朝着正确的方向前进。

import Dependencies._

ThisBuild / scalaVersion := "2.12.8"
ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / organization := "com.example"
ThisBuild / organizationName := "example"

lazy val root = (project in file("."))
  .settings(
    name := "poc-cli",
    libraryDependencies += scalaTest % Test,
    libraryDependencies += "info.picocli" % "picocli" % "3.9.3",
    libraryDependencies += "info.picocli" % "picocli-codegen" % "3.9.3",
  )

lazy val graalConfig = inputKey[Unit]("gen-graal-config") 

graalConfig:= {
    val conf = (runMain in Compile).fullInput(" picocli.codegen.aot.graalvm.ReflectionConfigGenerator --output=cli-reflect.json example.Hello").evaluated
}

enablePlugins(GraalVMNativeImagePlugin)

编辑

在我最初的问题中,我有下面的代码,用我当前的代码问题解决了

lazy val graalConfig = taskKey[Unit]("graal-config") := {
    Process("java" :: "-jar" :: "picocli.codegen.aot.graalvm.ReflectionConfigGenerator" :: "--output" :: "cli-reflect.json" :: "???" :: Nil,
        baseDirectory.value / "lib").!
}

【问题讨论】:

    标签: scala sbt graalvm picocli


    【解决方案1】:

    解决办法是

    import Dependencies._
    
    
    ThisBuild / scalaVersion := "2.12.8"
    ThisBuild / version := "0.1.0-SNAPSHOT"
    ThisBuild / organization := "com.example"
    ThisBuild / organizationName := "example"
    
    lazy val root = (project in file("."))
      .settings(
        name := "poc-cli",
        libraryDependencies += scalaTest % Test,
        libraryDependencies += "info.picocli" % "picocli" % "3.9.3",
        libraryDependencies += "info.picocli" % "picocli-codegen" % "3.9.3",
      )
    
    lazy val graalConfig = inputKey[Unit]("gen-graal-config")
    
    graalVMNativeImageOptions += "-H:ReflectionConfigurationFiles=../cli-reflect.json"
    
    graalConfig:= {
        (runMain in Compile).fullInput(" picocli.codegen.aot.graalvm.ReflectionConfigGenerator -o=target/cli-reflect.json example.Hello").evaluated
    }
    
    enablePlugins(GraalVMNativeImagePlugin)
    

    那我可以跑了:

    $ sbt graalConfig
    $ sbt graalvm-native-image:packageBin 
    

    【讨论】:

      【解决方案2】:

      picocli-codegen 修复了 picocli 项目反射。

      Graal Reflection Configuration Generator 会自动为我生成 reflection.json 并将其附加到生成的 jar 中,只需将其作为 AnnotationProcessor 添加到我的依赖项中并注释类,还支持包扫描

      这样,您可以在需要时轻松生成反射配置。如何配置和使用它的片段示例。

      build.gradle

      dependencies {
        compileOnly("com.mageddo.nativeimage:reflection-config-generator:2.1.1")
        annotationProcessor("com.mageddo.nativeimage:reflection-config-generator:2.1.1")
      }
      

      Config.java

      @Reflection(declaredConstructors = true, scanPackage = "com.github.vo")
      public class Config {}
      

      Maven 和 vanilla java 也受支持,更多详情请查看GRCG docs,也请查看this article 谈论此工具

      【讨论】:

      • 没有登录就无法访问article 的链接...
      • @RemkoPopma 感谢您的警告,它现在正在工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2012-12-14
      相关资源
      最近更新 更多