【问题标题】:Sbt / javaAgents / force jar-with-dependenciesSbt / javaAgents / force jar-with-dependencies
【发布时间】:2020-08-02 19:04:37
【问题描述】:

我想将"org.kohsuke" % "file-leak-detector" % "1.13" java 代理添加到我的 sbt 配置中。

//plugins.sbt
addSbtPlugin("com.lightbend.sbt" % "sbt-javaagent" % "0.1.5")

//build.sbt
enablePlugins(SbtWeb, PlayScala, DebianPlugin, JavaAgent)
javaAgents += "org.kohsuke" % "file-leak-detector" % "1.13"

但这在运行时失败了。

Failed to find Premain-Class manifest attribute in /usr/share/someApp/bin/../file-leak-detector/file-leak-detector-1.13.jar
Error occurred during initialization of VM
agent library failed to init: instrument

我发现我需要带有依赖项的 jar 才能将它作为 javaAgent 运行,但如果理论上我可以从 https://repo1.maven.org/maven2/org/kohsuke/file-leak-detector/1.13/ 下载它的话 我不知道如何将它与sbt-javaagent 插件一起使用。

我也试过了:

javaAgents += ("org.kohsuke" % "file-leak-detector" % "1.13") from "https://repo1.maven.org/maven2/org/kohsuke/file-leak-detector/1.13/file-leak-detector-1.13-jar-with-dependencies.jar"

但没有运气。任何想法如何强制 sbt-javaagent 插件使用file-leak-detector-1.13-jar-with-dependencies.jar 而不是file-leak-detector-1.13-jar

【问题讨论】:

    标签: scala sbt javaagents sbt-native-packager resource-leak


    【解决方案1】:

    我认为您使用from 提供明确的 URL 是正确的

    如果您的项目需要一个不存在于 存储库,其 jar 的直接 URL 可以指定如下:

    libraryDependencies += "slinky" % "slinky" % "2.1" from "https://slinky2.googlecode.com/svn/artifacts/2.1/slinky.jar" 
    

    当我像这样提供明确的scope 时,它似乎在我的机器上工作

    javaAgents += JavaAgent(
      "org.kohsuke" % "file-leak-detector-1.13-jar-with-dependencies" % "1.13" % Runtime from "https://repo1.maven.org/maven2/org/kohsuke/file-leak-detector/1.13/file-leak-detector-1.13-jar-with-dependencies.jar",
      arguments = "help"
    )
    

    注意% Runtime。我认为它有效,因为arguments = "help" 很荣幸并且sbt run 输出

    sbt:sbt-javaagents-leka> run
    [info] running (fork) example.Hello
    [error] File leak detector arguments (to specify multiple values, separate them by ',':
    [error]   help          - show the help screen.
    [error]   trace         - log every open/close operation to stderr.
    [error]   trace=FILE    - log every open/close operation to the given file.
    [error]   error=FILE    - if 'too many open files' error is detected, send the dump here.
    [error]                   by default it goes to stderr.
    [error]   threshold=N   - instead of waiting until 'too many open files', dump once
    [error]                   we have N descriptors open.
    [error]   http=PORT     - Run a mini HTTP server that you can access to get stats on demand
    [error]                   Specify 0 to choose random available port, -1 to disable, which is default.
    [error]   strong        - Don't let GC auto-close leaking file descriptors
    [error]   listener=S    - Specify the fully qualified name of ActivityListener class to activate from beginning
    [error]   dumpatshutdown- Dump open file handles at shutdown
    [error]   excludes=FILE - Ignore files opened directly/indirectly in specific methods.
    [error]                   File lists 'some.pkg.ClassName.methodName' patterns.
    

    另外,如果我设置 arguments = "threshold=1" 它输出

    [info] running (fork) example.Hello
    [error] File leak detector installed
    [error] 2 descriptors are open
    [error] #1 /private/var/folders/y7/33z7gnqn1nl2vwzn26j59xy9rwcgwx/T/sbt_412c7765/target/edca7f33/f7a642d3/scala-library-2.13.1.jar by thread:main on Mon Apr 20 11:51:20 BST 2020
    ...
    

    【讨论】:

      猜你喜欢
      • 2012-01-31
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      相关资源
      最近更新 更多