picocli graalvm 反射生成的 Sbt 任务?
Sbt task for picocli graalvm reflection generation?
在 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").!
}
解决方案是
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
picocli-codegen 修复了 picocli 项目反射。
Graal Reflection Configuration Generator 会自动为我生成 reflection.json
并将其附加到生成的 jar 中,只需将其作为 [= 添加到我的依赖项中即可27=]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, check also this article 讨论此工具
在 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").!
}
解决方案是
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
picocli-codegen 修复了 picocli 项目反射。
Graal Reflection Configuration Generator 会自动为我生成 reflection.json
并将其附加到生成的 jar 中,只需将其作为 [= 添加到我的依赖项中即可27=]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, check also this article 讨论此工具