diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java index b9e83740a..92fb578ab 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java @@ -256,7 +256,6 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent } private void shutdown() { -// this.liveHoverWatchdog.shutdown(); this.liveProcessTracker.stop(); this.liveChangeDetectionWatchdog.shutdown(); this.cuCache.dispose(); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java index aabb72311..28b0a7bfb 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java @@ -87,6 +87,20 @@ public class SpringProcessConnectorLocal { }); } + /** + * checks whether this class can operate normally or not - it is recommended to check this before calling out to this class + * (if the attach to VirtualMachine library is not around, this class cannot really do anything and will throw exceptions) + */ + public static boolean isAvailable() { + try { + Class vmClass = VirtualMachine.class; + return vmClass != null; + } + catch (NoClassDefFoundError e) { + return false; + } + } + public void searchForNewProcesses() { List currentVms = VirtualMachine.list(); Set currentVMKeys = new HashSet<>(); @@ -211,5 +225,5 @@ public class SpringProcessConnectorLocal { int firstSpace = rawName.indexOf(' '); return firstSpace < 0 ? rawName : rawName.substring(0, firstSpace); } - + } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessTracker.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessTracker.java index cd43f8c17..ac6770882 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessTracker.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessTracker.java @@ -27,6 +27,7 @@ public class SpringProcessTracker { private final long POLLING_INTERVAL_MILLISECONDS; private final SpringProcessConnectorLocal localProcessConnector; + private final boolean isConnectorAvailable; private boolean automaticTrackingEnabled; private ScheduledThreadPoolExecutor timer; @@ -35,16 +36,28 @@ public class SpringProcessTracker { this.localProcessConnector = localProcessConnector; this.POLLING_INTERVAL_MILLISECONDS = pollingInterval == null ? DEFAULT_INTERVAL.toMillis() : pollingInterval.toMillis(); this.automaticTrackingEnabled = true; + + this.isConnectorAvailable = SpringProcessConnectorLocal.isAvailable(); } public synchronized void setTrackingEnabled(boolean trackingEnabled) { if (automaticTrackingEnabled != trackingEnabled) { automaticTrackingEnabled = trackingEnabled; - refresh(); + + if (automaticTrackingEnabled) { + start(); + } else { + stop(); + } } } public synchronized void start() { + if (!isConnectorAvailable) { + log.error("virtual machine connector library not available, no automatic local process tracking possible"); + return; + } + if (automaticTrackingEnabled && timer == null) { log.info("Starting SpringProcessTracker"); this.timer = new ScheduledThreadPoolExecutor(1); @@ -70,12 +83,4 @@ public class SpringProcessTracker { } } - private void refresh() { - if (automaticTrackingEnabled) { - start(); - } else { - stop(); - } - } - }