diff --git a/pom.xml b/pom.xml
index 98177ad..f4350bf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,8 @@
https://travis-ci.org/jiaqi/jmxterm
- 2.8.3
+ 1.14.11
+ 2.12.0
1.7.25
@@ -96,6 +97,12 @@
${slf4j.version}
runtime
+
+ net.bytebuddy
+ byte-buddy
+ ${byte-buddy.version}
+ test
+
org.jmock
jmock
@@ -104,7 +111,7 @@
org.jmock
- jmock-legacy
+ jmock-imposters
${jmock.version}
test
diff --git a/src/main/java/org/cyclopsgroup/jmxterm/cc/JPMFactory.java b/src/main/java/org/cyclopsgroup/jmxterm/cc/JPMFactory.java
index e955d71..7a0dd66 100644
--- a/src/main/java/org/cyclopsgroup/jmxterm/cc/JPMFactory.java
+++ b/src/main/java/org/cyclopsgroup/jmxterm/cc/JPMFactory.java
@@ -5,6 +5,7 @@
import org.cyclopsgroup.jmxterm.JavaProcessManager;
import org.cyclopsgroup.jmxterm.jdk5.Jdk5JavaProcessManager;
import org.cyclopsgroup.jmxterm.jdk6.Jdk6JavaProcessManager;
+import org.cyclopsgroup.jmxterm.jdk9.Jdk9JavaProcessManager;
import org.cyclopsgroup.jmxterm.pm.JConsoleClassLoaderFactory;
import org.cyclopsgroup.jmxterm.pm.UnsupportedJavaProcessManager;
@@ -27,16 +28,18 @@ public JPMFactory() {
JavaProcessManager j;
try {
ClassLoader cl = JConsoleClassLoaderFactory.getClassLoader();
- if (SystemUtils.IS_JAVA_1_5) {
- j = new Jdk5JavaProcessManager(cl);
- } else {
+ if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_9)) {
+ j = new Jdk9JavaProcessManager(cl);
+ } else if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_6)) {
j = new Jdk6JavaProcessManager(cl);
+ } else {
+ j = new Jdk5JavaProcessManager(cl);
}
} catch (ClassNotFoundException e) {
j =
new UnsupportedJavaProcessManager(
e.getMessage()
- + ", operation on this JDK("
+ + ", operation on this JDK ("
+ SystemUtils.JAVA_RUNTIME_VERSION
+ ") isn't fully supported",
e);
diff --git a/src/main/java/org/cyclopsgroup/jmxterm/jdk5/package-info.java b/src/main/java/org/cyclopsgroup/jmxterm/jdk5/package-info.java
index 93a46dc..5653243 100644
--- a/src/main/java/org/cyclopsgroup/jmxterm/jdk5/package-info.java
+++ b/src/main/java/org/cyclopsgroup/jmxterm/jdk5/package-info.java
@@ -1,2 +1,2 @@
-/** Classes to implement {@link org.cyclopsgroup.jmxterm.JavaProcessManager} in JDK5 specifi way */
+/** Classes to implement {@link org.cyclopsgroup.jmxterm.JavaProcessManager} in JDK5 specific way */
package org.cyclopsgroup.jmxterm.jdk5;
diff --git a/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcess.java b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcess.java
new file mode 100644
index 0000000..a621982
--- /dev/null
+++ b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcess.java
@@ -0,0 +1,63 @@
+package org.cyclopsgroup.jmxterm.jdk9;
+
+import java.io.IOException;
+import org.apache.commons.lang3.Validate;
+import org.cyclopsgroup.jmxterm.JavaProcess;
+import org.cyclopsgroup.jmxterm.utils.WeakCastUtils;
+
+/**
+ * JDK9 specific implementation of {@link JavaProcess}
+ *
+ * @author nyg
+ */
+public class Jdk9JavaProcess implements JavaProcess {
+
+ private final StaticVirtualMachine staticVirtualMachine;
+ private final VirtualMachineDescriptor vmd;
+ private final String address;
+
+ /**
+ * @param staticVm Static VirtualMachine proxy
+ * @param vmd Local VM
+ * @param address Connector address, if any
+ */
+ Jdk9JavaProcess(StaticVirtualMachine staticVm, VirtualMachineDescriptor vmd, String address) {
+ Validate.notNull(vmd, "StaticVirtualMachine can't be NULL");
+ Validate.notNull(vmd, "VirtualMachineDescriptor can't be NULL");
+ this.staticVirtualMachine = staticVm;
+ this.vmd = vmd;
+ this.address = address;
+ }
+
+ @Override
+ public String getDisplayName() {
+ return vmd.displayName();
+ }
+
+ @Override
+ public int getProcessId() {
+ return Integer.parseInt(vmd.id());
+ }
+
+ @Override
+ public boolean isManageable() {
+ return address != null;
+ }
+
+ @Override
+ public void startManagementAgent() throws IOException {
+ Object vm = staticVirtualMachine.attach(vmd.id());
+ try {
+ Class> originalVirtualMachine = Class.forName(VirtualMachine.ORIGINAL_CLASS_NAME);
+ VirtualMachine vmProxy = WeakCastUtils.cast(originalVirtualMachine, VirtualMachine.class);
+ vmProxy.startLocalManagementAgent();
+ } catch (ClassNotFoundException | SecurityException | NoSuchMethodException e) {
+ throw new RuntimeException("Can't cast " + vm + " to VirtualMachineDescriptor", e);
+ }
+ }
+
+ @Override
+ public String toUrl() {
+ return address;
+ }
+}
diff --git a/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManager.java b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManager.java
new file mode 100644
index 0000000..2f61353
--- /dev/null
+++ b/src/main/java/org/cyclopsgroup/jmxterm/jdk9/Jdk9JavaProcessManager.java
@@ -0,0 +1,63 @@
+package org.cyclopsgroup.jmxterm.jdk9;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import org.apache.commons.lang3.Validate;
+import org.cyclopsgroup.jmxterm.JavaProcess;
+import org.cyclopsgroup.jmxterm.JavaProcessManager;
+import org.cyclopsgroup.jmxterm.utils.WeakCastUtils;
+
+/**
+ * JDK9 specific java process manager
+ *
+ * @author nyg
+ */
+public class Jdk9JavaProcessManager extends JavaProcessManager {
+ private final StaticVirtualMachine staticVirtualMachine;
+ private final Class> originalVirtualMachine;
+
+ public Jdk9JavaProcessManager(ClassLoader classLoader)
+ throws SecurityException, NoSuchMethodException, ClassNotFoundException {
+ Validate.notNull(classLoader, "ClassLoader can't be NULL");
+ originalVirtualMachine = classLoader.loadClass(VirtualMachine.ORIGINAL_CLASS_NAME);
+ staticVirtualMachine =
+ WeakCastUtils.staticCast(originalVirtualMachine, StaticVirtualMachine.class);
+ }
+
+ @Override
+ public JavaProcess get(int pid) {
+ return list().stream().filter(process -> process.getProcessId() == pid).findAny().orElse(null);
+ }
+
+ @Override
+ public List list() {
+ List