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

2019年3月31日 36点热度 0条评论

我正在使用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的东西,但这似乎不起作用。

解决方案如下:

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

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

Starting Agents After VM Startup

An implementation may provide a mechanism to start agents sometime after the the VM has started. The details as to how this is initiated are implementation specific but typically the application has already started and its main method has already been invoked. In cases where an implementation supports the starting of agents after the VM has started the following applies:

The manifest of the agent JAR must contain the attribute Agent-Class. The value of this attribute is the name of the agent class.

The agent class must implement a public static agentmain method.

The system class loader ( ClassLoader.getSystemClassLoader) must support a mechanism to add an agent JAR file to the system class path.

The agent JAR is appended to the system class path. This is the class loader that typically loads the class containing the application main method. The agent class is loaded and the JVM attempts to invoke the agentmain method. The JVM first attempts to invoke the following method on the agent class:

public static void agentmain(String agentArgs, Instrumentation inst);

If the agent class does not implement this method then the JVM will attempt to invoke:

public static void agentmain(String agentArgs);

The agent class may also have an premain method for use when the agent is started using a command-line option. When the agent is started after VM startup the premain method is not invoked.

The agent is passed its agent options via the agentArgs parameter. The agent options are passed as a single string, any additional parsing should be performed by the agent itself.

The agentmain method should do any necessary initialization required to start the agent. When startup is complete the method should return. If the agent cannot be started (for example, because the agent class cannot be loaded, or because the agent class does not have a conformant agentmain method), the JVM will not abort. If the agentmain method throws an uncaught exception it will be ignored.

PS:我从来没有尝试过。请让我知道它是否有效。