在 main Jar 中引用 Jar 作为 javaagent 传递给 JVM

Posted

技术标签:

【中文标题】在 main Jar 中引用 Jar 作为 javaagent 传递给 JVM【英文标题】:Reference Jar within main Jar to pass as javaagent to JVM 【发布时间】:2018-01-24 08:02:15 【问题描述】:

我需要在运行 jar1 时在我的 JVM args 中添加一个 -javaagent 参数,但引用 jar1 中包含的 jar2。我试过了:

-javaagent:BOOT-INF/lib/jetty-alpn-agent-2.0.0.jar"

没有成功。如何在运行时确定 JAR 在运行系统中的位置?

(这是为了将 jetty-alpn-agent-2.0.0.jar 作为 Java 代理运行,用于 HTTP/2 与 Pushy APN 一起使用)

【问题讨论】:

你找到解决这个问题的方法了吗? 【参考方案1】:

如果你知道类在类路径上,你通常可以这样做:

URL jar = MainClass.class.getProtectionDomain().getCodeSource().getLocation();

Javaagent 总是加载在类路径上,这就是为什么您应该能够引用常规应用程序的主类的原因。

【讨论】:

【参考方案2】:

@indusBull

对我有用的解决方案是在我的 gradle.properties 文件中定义一个名为 libDirectory 的属性,这是 JAR 在运行系统中的位置,然后从我的 Dockerfile 中引用该变量:

gradle.properties

libDirectory = /opt/meanwhileinhell/app/lib

Dockerfile

ENTRYPOINT  ["java",\
            ...
            ...
            "-javaagent:$libDirectory/jetty-alpn-agent.jar",\
            "-jar", "/app.jar"]

【讨论】:

以上是关于在 main Jar 中引用 Jar 作为 javaagent 传递给 JVM的主要内容,如果未能解决你的问题,请参考以下文章

构建工具——maven的补充

Java工程打成jar包(此工程引用的jar包也打进去),并指定main方法执行该怎么做?

Jmeter引用jar外部文件

BAT启动执行JAVA JAR文件中的MAIN方法的两种方式

Java打包jar和war文件(eclipse)

Freemarker 在 maven 生成的 jar 中加载模板的位置