From 9d730bec2b7efa4f92669013a2db48cc0e69f677 Mon Sep 17 00:00:00 2001 From: Ivan Senic Date: Wed, 11 Oct 2017 10:51:14 +0200 Subject: [PATCH] INSPECTIT-2544: updated agent to support java 9 --- dependencies.gradle | 9 +++++++-- .../agent/java/javaagent/JavaAgent.java | 19 ++++++++++++++++++- .../agent/java/util/ReflectionCacheTest.java | 8 +++++--- .../shared/all/util/UnderlyingSystemInfo.java | 7 +++++++ .../config/findbugs/findBugsExcludeFilter.xml | 5 +++++ 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 3a3a2fbd5..66b7fc619 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -175,14 +175,19 @@ dependencies { /** inspectit.agent.java */ agentJavaProd ( - 'org.ow2.asm:info.novatec.asm-all-shaded:5.0.4', + 'org.ow2.asm:info.novatec.asm-all-shaded:6.0', 'commons-codec:commons-codec:1.6', 'org.slf4j:jcl-over-slf4j:1.7.21', 'org.slf4j:log4j-over-slf4j:1.7.21', 'ch.qos.logback:logback-core:1.1.7', 'ch.qos.logback:logback-classic:1.1.7', 'piccolo:piccolo:1.0.3', - 'com.lmax:disruptor:3.3.6' + 'com.lmax:disruptor:3.3.6', + + // javax.annotation-api needed as we use them, but they are removed in java 9 from java.base module + // currently only to support starting agent with Java 9, but needed if we want to start + // any other component with Java 9 in future + 'javax.annotation:javax.annotation-api:1.2' ) /** inspectit.server */ diff --git a/inspectit.agent.java/src/main/java/rocks/inspectit/agent/java/javaagent/JavaAgent.java b/inspectit.agent.java/src/main/java/rocks/inspectit/agent/java/javaagent/JavaAgent.java index 90c004acb..fafc36efa 100644 --- a/inspectit.agent.java/src/main/java/rocks/inspectit/agent/java/javaagent/JavaAgent.java +++ b/inspectit.agent.java/src/main/java/rocks/inspectit/agent/java/javaagent/JavaAgent.java @@ -336,7 +336,7 @@ public static class InspectItClassLoader extends URLClassLoader { * the urls to search for the classes for. */ public InspectItClassLoader(URL[] urls) { - super(urls, null); + super(urls, getParentClassLoader()); try { File agentFile = getInspectItAgentJarFileLocation(); @@ -365,6 +365,23 @@ public InspectItClassLoader(URL[] urls) { ignoreClasses.add(InspectItClassLoader.class.getName()); } + /** + * @return Returns the platform class loader if we are on Java 9 as this one can load needed + * Java classes for us. + */ + private static ClassLoader getParentClassLoader() { + try { + String javaVersion = System.getProperty("java.version"); + if (javaVersion.charAt(0) == '9') { + return (ClassLoader) ClassLoader.class.getDeclaredMethod("getPlatformClassLoader", new Class[] {}).invoke(null); + } else { + return null; + } + } catch (Exception e) { + return null; + } + } + /** * Gets {@link #bootClassLoaderJarFiles}. * diff --git a/inspectit.agent.java/src/test/java/rocks/inspectit/agent/java/util/ReflectionCacheTest.java b/inspectit.agent.java/src/test/java/rocks/inspectit/agent/java/util/ReflectionCacheTest.java index ddff1244d..e3ea6c0b6 100644 --- a/inspectit.agent.java/src/test/java/rocks/inspectit/agent/java/util/ReflectionCacheTest.java +++ b/inspectit.agent.java/src/test/java/rocks/inspectit/agent/java/util/ReflectionCacheTest.java @@ -3,6 +3,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.sameInstance; import static org.hamcrest.Matchers.theInstance; import org.mockito.InjectMocks; @@ -169,11 +170,12 @@ public void normalUsage() { @Test public void normalUsageJavaClass() { - String testInstance = "test"; + Exception testCause = new Exception(); + Exception testInstance = new Exception(testCause); - char[] field = (char[]) cache.getField(String.class, "value", testInstance, null); + Exception cause = (Exception) cache.getField(testInstance.getClass(), "cause", testInstance, null); - assertThat(field, is(equalTo(testInstance.toCharArray()))); + assertThat(cause, is(sameInstance(testCause))); } @Test diff --git a/inspectit.shared.all/src/main/java/rocks/inspectit/shared/all/util/UnderlyingSystemInfo.java b/inspectit.shared.all/src/main/java/rocks/inspectit/shared/all/util/UnderlyingSystemInfo.java index ca365eebc..fdc297fa1 100644 --- a/inspectit.shared.all/src/main/java/rocks/inspectit/shared/all/util/UnderlyingSystemInfo.java +++ b/inspectit.shared.all/src/main/java/rocks/inspectit/shared/all/util/UnderlyingSystemInfo.java @@ -68,6 +68,11 @@ public enum JavaVersion { */ JAVA_1_8, + /** + * Denotes Java version 1.9. + */ + JAVA_1_9, + /** * Denotes unknown java version. */ @@ -197,6 +202,8 @@ private static JavaVersion getJavaVersion() { return JavaVersion.JAVA_1_7; } else if (getJavaVersionMatches("1.8")) { return JavaVersion.JAVA_1_8; + } else if (getJavaVersionMatches("9")) { + return JavaVersion.JAVA_1_9; } else { return JavaVersion.OTHER; } diff --git a/resources/config/findbugs/findBugsExcludeFilter.xml b/resources/config/findbugs/findBugsExcludeFilter.xml index eca8b76b4..29c755f1e 100644 --- a/resources/config/findbugs/findBugsExcludeFilter.xml +++ b/resources/config/findbugs/findBugsExcludeFilter.xml @@ -38,6 +38,11 @@ + + + + +