diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index 01495be33406..9f0aaed83d1c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -53,6 +53,10 @@ import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.ProjectJdkTable; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; @@ -86,7 +90,6 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; import java.io.IOException; import java.net.UnknownHostException; import java.util.*; @@ -605,11 +608,34 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb private void checkVirtualMachineVersion(VirtualMachine vm) { final String version = vm.version(); if ("1.4.0".equals(version)) { - SwingUtilities.invokeLater(() -> Messages.showMessageDialog( - getProject(), + DebuggerInvocationUtil.swingInvokeLater(myProject, () -> Messages.showMessageDialog( + myProject, DebuggerBundle.message("warning.jdk140.unstable"), DebuggerBundle.message("title.jdk140.unstable"), Messages.getWarningIcon() )); } + Sdk projectSdk = ProjectRootManager.getInstance(myProject).getProjectSdk(); + if (getSession().getAlternativeJre() == null && !versionMatch(projectSdk, version)) { + for (Sdk sdk : ProjectJdkTable.getInstance().getAllJdks()) { + if (versionMatch(sdk, version)) { + XDebugSessionImpl.NOTIFICATION_GROUP.createNotification( + DebuggerBundle.message("message.remote.jre.version.mismatch", + version, + projectSdk != null ? projectSdk.getVersionString() : "unknown", + sdk.getName()) + , MessageType.INFO).notify(myProject); + getSession().setAlternativeJre(sdk); + break; + } + } + } + } + + private static boolean versionMatch(@Nullable Sdk sdk, String version) { + if (sdk != null) { + String versionString = sdk.getVersionString(); + return versionString != null && versionString.contains(version); + } + return false; } /*Event dispatching*/ diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java index 005fdd6bf59c..75768d7182f9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java @@ -41,6 +41,7 @@ import com.intellij.notification.NotificationType; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.ui.Messages; @@ -50,6 +51,7 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.registry.Registry; import com.intellij.psi.PsiCompiledElement; import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElementFinder; import com.intellij.psi.PsiFile; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.unscramble.ThreadState; @@ -92,7 +94,7 @@ public class DebuggerSession implements AbstractDebuggerSession { private final String mySessionName; private final DebugProcessImpl myDebugProcess; private final GlobalSearchScope mySearchScope; - private final Sdk myAlternativeJre; + private Sdk myAlternativeJre; private final DebuggerContextImpl SESSION_EMPTY_CONTEXT; //Thread, user is currently stepping through @@ -123,6 +125,11 @@ public class DebuggerSession implements AbstractDebuggerSession { return myAlternativeJre; } + public void setAlternativeJre(Sdk sdk) { + myAlternativeJre = sdk; + Extensions.findExtension(PsiElementFinder.EP_NAME, getProject(), AlternativeJreClassFinder.class).clearCache(); + } + public boolean isModifiedClassesScanRequired() { return myModifiedClassesScanRequired; } diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index 8b1f58410bdb..9d7f3abf4aef 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -76,6 +76,7 @@ error.no.shmem.address=Shared memory address unspecified debugger.jdi.bootstrap.error={0}. Check your JDK installation. warning.jdk140.unstable=The debuggee VM version is "1.4.0".\nJ2SDK 1.4.0 documented bugs may cause unstable debugger behavior.\nWe recommend using J2SDK 1.4.0_01 or higher. title.jdk140.unstable=VM Version Warning +message.remote.jre.version.mismatch=Remote jre version ({0})\ndo not match project jdk version ({1}), \nwill use sources from sdk: {2} error.invalid.argument={0,choice, 1#Invalid argument|2#Invalid arguments} error.vm.disconnected=VM disconnected. Target virtual machine closed connection error.unknown.host=Cannot connect to remote process, host is unknown