我正在使用jetty-alpn-agent
为我的项目添加ALPN支持,但我能找到的是如何从.m2
文件夹运行它的说明,这使我需要部署两个jar:而不只是我的一个超级罐,使其不那么便携。
是否可以在jar中指定-javaagent开关的位置?
我正在寻找像java -javaagent:my.jar!/javaagents/jetty-alpn-agent-2.0.0.jar -jar myjar.jar
这样的东西,但这似乎不起作用。
答案 0 :(得分:1)
根据java.lang.instrumentation文档可能有可能。
如果实现允许,jetty-alpn-agent.jar
必须是系统类路径的一部分。因此,您必须像任何其他应用程序库一样将其包含在my.jar
中。
PS:我从未尝试过这个。如果有效,请告诉我。VM启动后启动代理
实施可以提供在VM启动后的某个时间启动代理的机制。有关如何启动的详细信息是特定于实现,但通常应用程序已经启动并且其主方法已被调用。如果实现支持在VM启动后启动代理,则适用以下条件:
代理JAR的清单必须包含属性Agent-Class。此属性的值是代理类的名称。
代理类必须实现公共静态agentmain方法。
系统类加载器(ClassLoader.getSystemClassLoader)必须支持将代理JAR文件添加到系统类路径的机制。
代理JAR附加到系统类路径。这是通常加载包含应用程序主方法的类的类加载器。加载代理程序类,JVM尝试调用agentmain方法。 JVM首先尝试在代理类上调用以下方法:
public static void agentmain(String agentArgs, Instrumentation inst);
如果代理类没有实现此方法,那么JVM将尝试调用:
public static void agentmain(String agentArgs);
当使用命令行选项启动代理时,代理类还可以使用premain方法。在VM启动后启动代理程序时,不会调用premain方法。
代理通过agentArgs参数传递其代理选项。代理选项作为单个字符串传递,任何其他解析应由代理本身执行。
agentmain方法应该执行启动代理所需的任何必要初始化。启动完成后,该方法应返回。如果无法启动代理(例如,因为无法加载代理类,或者因为代理类没有符合的agentmain方法),JVM将不会中止。如果agentmain方法抛出未捕获的异常,则会被忽略。
答案 1 :(得分:0)
您可以通过将premain类写入fat jar的清单来模拟前一个代理。然后,只需通过 javaagent 和 jar 参数添加你的胖罐。
无法避免这种情况,因为检测API非常强大,并且允许避免安全管理器为攻击提供入口点。但是,您可以在JDK或Java 9 VM上进行自我连接。 byte-buddy-agent 库为此提供了现成的依赖关系。这样,您可以在获取检测实例后手动调用premain方法。