【问题标题】:sbt autoplugin: add javaagent for tasksbt autoplugin:为任务添加 javaagent
【发布时间】:2017-06-02 17:23:13
【问题描述】:

我有一个 sbt 自动插件,当用户运行一个任务时,我想用 -javaagent 分叉一个新的 JVM。该任务应使用jamm 测量内存。

object SbtMemory extends AutoPlugin {
    object autoImport {
        val agentTest = inputKey[Unit]("Run task with javaagent")
    }
    def makeAgentOptions(classpath: Classpath) : String = {
            val jammJar = classpath.map(_.data).filter(_.toString.contains("jamm")).head
            s"-javaagent:$jammJar"
        }
    override lazy val projectSettings =
            Seq(
                agentTest := agentTask.value,
                fork in agentTest := true,
                javaOptions in agentTest += (dependencyClasspath in Test).map(makeAgentOptions).value
            )

    lazy val agentTask = Def.task {
        val o = new Array[Byte](1024*1024)
        val mm = new MemoryMeter()
        println("Size of new Array[Byte](1024*1024): " + mm.measureDeep(o))
    }
}

当我从命令行运行sbt perf 时,出现以下异常:

 java.lang.IllegalStateException: Instrumentation is not set; Jamm must be set as -javaagent

我还尝试打印 javaOptions,但未设置 -javaagent 选项。

如何在插件中添加-javaagent javaOption 以使用 jamm 运行任务?

谢谢!

【问题讨论】:

    标签: scala jvm sbt


    【解决方案1】:

    显然,fork 仅适用于 runtest 任务。我添加了自己的分叉代码并将度量代码移动到单独的类MemoryMeasure

    val mainClass: String = "MemoryMeasure"
    val forkOptions = ForkOptions(
        bootJars = (fullClasspath in Test).value.files,
        runJVMOptions = Seq(
            (dependencyClasspath in Test).map(makeAgentOptions).value
        )
    )
    val process = Fork.java.fork(forkOptions, mainClass +: arguments)
    def cancel() = {
        process.destroy()
        1
    }
    val exitCode = try process.exitValue() catch { case e: InterruptedException => cancel() }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 2014-10-15
      • 2019-04-02
      • 2014-10-07
      • 2014-08-21
      • 1970-01-01
      • 2018-04-09
      • 2011-11-12
      相关资源
      最近更新 更多