在'fat jar'中指定java代理?

Nik*_*der 6 java jar jetty javaagents alpn

我正在使用jetty-alpn-agent来向项目添加ALPN支持,但我能找到的是关于如何从.m2文件夹运行它的说明,这使我需要部署两个jar:s而不是仅部署一个uber-jar,从而减少了便携式的。

是否可以在jar中指定-javaagent开关的位置?

我正在寻找类似的东西java -javaagent:my.jar!/javaagents/jetty-alpn-agent-2.0.0.jar -jar myjar.jar,但这似乎不起作用。

Ren*_*ink 2

根据java.lang.instrumentation文档,这可能是可能的。

如果实现允许,它jetty-alpn-agent.jar必须是系统类路径的一部分。my.jar因此,您必须像任何其他应用程序库一样将其包含在您的应用程序库中。

VM 启动后启动代理

实现可以提供一种在 VM 启动后某个时间启动代理的机制。有关如何启动的详细信息是特定于实现的,但通常应用程序已经启动并且其主要方法已经被调用。如果实现支持在 VM 启动后启动代理,则适用以下情况:

代理 JAR 的清单必须包含属性 Agent-Class。该属性的值是代理类的名称。

代理类必须实现公共静态 agentmain 方法。

系统类加载器 (ClassLoader.getSystemClassLoader) 必须支持将代理 JAR 文件添加到系统类路径的机制。

代理JAR 附加到系统类路径。这是通常加载包含应用程序 main 方法的类的类加载器。代理类已加载,JVM 尝试调用 agentmain 方法。JVM 首先尝试在代理类上调用以下方法:

public static void agentmain(String agentArgs, Instrumentation inst);
Run Code Online (Sandbox Code Playgroud)

如果代理类没有实现此方法,那么 JVM 将尝试调用:

public static void agentmain(String agentArgs);
Run Code Online (Sandbox Code Playgroud)

代理类还可以有一个 premain 方法,供使用命令行选项启动代理时使用。当 VM 启动后启动代理时,不会调用 premain 方法。

代理通过 agentArgs 参数传递其代理选项。代理选项作为单个字符串传递,任何额外的解析都应由代理本身执行。

agentmain 方法应该执行启动代理所需的任何必要的初始化。启动完成后该方法应该返回。如果代理无法启动(例如,因为代理类无法加载,或者因为代理类没有符合要求的 agentmain 方法),JVM 将不会中止。如果 agentmain 方法抛出未捕获的异常,它将被忽略。

PS:我从来没有尝试过这个。请告诉我它是否有效。