From f6f0adf63bc9c4e738482dc05053dbb239b686d6 Mon Sep 17 00:00:00 2001 From: Christian Dupuis Date: Mon, 11 Nov 2013 16:23:10 +0100 Subject: [PATCH] Allow instrumentation to be used with Attach API Update InstrumentationSavingAgent to allow it to be used with the Attach API Issue: SPR-11083 --- build.gradle | 2 ++ .../instrument/InstrumentationSavingAgent.java | 14 +++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 507dc13b0a..dbcc8b1b6e 100644 --- a/build.gradle +++ b/build.gradle @@ -327,6 +327,8 @@ project("spring-instrument") { jar { manifest.attributes["Premain-Class"] = "org.springframework.instrument.InstrumentationSavingAgent" + manifest.attributes["Agent-Class"] = + "org.springframework.instrument.InstrumentationSavingAgent" manifest.attributes["Can-Redefine-Classes"] = "true" manifest.attributes["Can-Retransform-Classes"] = "true" manifest.attributes["Can-Set-Native-Method-Prefix"] = "false" diff --git a/spring-instrument/src/main/java/org/springframework/instrument/InstrumentationSavingAgent.java b/spring-instrument/src/main/java/org/springframework/instrument/InstrumentationSavingAgent.java index d468e60a8e..18e6c33ebe 100644 --- a/spring-instrument/src/main/java/org/springframework/instrument/InstrumentationSavingAgent.java +++ b/spring-instrument/src/main/java/org/springframework/instrument/InstrumentationSavingAgent.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,6 +39,13 @@ public class InstrumentationSavingAgent { instrumentation = inst; } + /** + * Save the {@link Instrumentation} interface exposed by the JVM. + * This method is required to dynamically load this Agent with the Attach API. + */ + public static void agentmain(String agentArgs, Instrumentation inst) { + instrumentation = inst; + } /** * Return the {@link Instrumentation} interface exposed by the JVM. @@ -48,8 +55,9 @@ public class InstrumentationSavingAgent { * {@link org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver#getInstrumentation()} * instead - which will work without the agent class in the classpath as well. * @return the {@code Instrumentation} instance previously saved when - * the {@link #premain} method was called by the JVM; will be {@code null} - * if this class was not used as Java agent when this JVM was started. + * the {@link #premain} or {@link #agentmain} methods was called by the JVM; + * will be {@code null} if this class was not used as Java agent when this + * JVM was started or it wasn't installed as agent using the Attach API. * @see org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver#getInstrumentation() */ public static Instrumentation getInstrumentation() {