我正在使用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的东西,但这似乎行不通。
发布于 2016-08-19 07:58:18
根据java.lang.instrumentation文档,这可能是可能的。
如果实现允许,则jetty-alpn-agent.jar必须是系统类路径的一部分。因此,您必须像任何其他应用程序库一样,将其包含在my.jar中。
VM启动后的启动代理 实现可能为提供一种机制,用于在VM启动后的某个时候启动代理。关于如何启动的详细信息是特定于实现的,但通常应用程序已经启动,其主要方法已经被调用。在实现支持VM启动后启动代理的情况下,应用如下: 代理JAR的清单必须包含属性Agent-Class。此属性的值是代理类的名称。 代理类必须实现公共静态agentmain方法。 系统类加载器( ClassLoader.getSystemClassLoader)必须支持将代理JAR文件添加到系统类路径的机制。 代理JAR被附加到系统类路径。这是类加载器,它通常加载包含应用程序主方法的类。代理类被加载,JVM试图调用agentmain方法。JVM首先尝试在代理类上调用以下方法: 公共静态空穴主体(字符串agentArgs,仪表在String); 如果代理类没有实现此方法,那么JVM将尝试调用: 公共静态空洞主体(String agentArgs); 在使用命令行选项启动代理时,代理类也可能有一个premain方法供使用。当代理在VM启动后启动时,不调用premain方法。 代理通过agentArgs参数传递其代理选项。代理选项作为单个字符串传递,任何附加的解析都应由代理本身执行。 agentmain方法应该执行启动代理所需的任何必要初始化。启动完成后,该方法应返回。如果代理无法启动(例如,由于无法加载代理类,或者代理类没有一致的agentmain方法),JVM将不会中止。如果agentmain方法抛出一个未指明的异常,它将被忽略。
PS:我从来没试过这个。请让我知道它是否有效。
发布于 2016-08-20 08:52:19
您可以通过将premain类写入胖jar的清单来模仿前面的代理。然后,只需通过javaagent和jar参数添加胖jar即可。
这是不可能避免的,因为插装API非常强大,并且允许避免安全管理器提供攻击的入口点。但是,您可以在JDK或Java9VM上自我附加。字节伙伴代理库为此提供了一个现成的依赖项。通过这种方式,您可以在获得检测实例之后手动调用premain方法。
https://stackoverflow.com/questions/39033599
复制相似问题