diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java
index 1000db73d50f..e6e0d2a7018c 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java
@@ -31,6 +31,8 @@ import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.openapi.vfs.encoding.EncodingProjectManager;
@@ -99,7 +101,7 @@ public class MavenExternalParameters {
params.setWorkingDirectory(parameters.getWorkingDirFile());
- params.setJdk(getJdk(runnerSettings, project != null && MavenRunner.getInstance(project).getState() == runnerSettings));
+ params.setJdk(getJdk(project, runnerSettings, project != null && MavenRunner.getInstance(project).getState() == runnerSettings));
final String mavenHome = resolveMavenHome(coreSettings, project, runConfiguration);
@@ -121,12 +123,29 @@ public class MavenExternalParameters {
}
@NotNull
- private static Sdk getJdk(MavenRunnerSettings runnerSettings, boolean isGlobalRunnerSettings) throws ExecutionException {
+ private static Sdk getJdk(@Nullable Project project, MavenRunnerSettings runnerSettings, boolean isGlobalRunnerSettings) throws ExecutionException {
String name = runnerSettings.getJreName();
if (name.equals(MavenRunnerSettings.USE_INTERNAL_JAVA)) {
return JavaAwareProjectJdkTableImpl.getInstanceEx().getInternalJdk();
}
+ if (name.equals(MavenRunnerSettings.USE_PROJECT_JDK)) {
+ if (project != null) {
+ Sdk res = ProjectRootManager.getInstance(project).getProjectSdk();
+ if (res != null) {
+ return res;
+ }
+ }
+
+ if (project == null) {
+ Sdk recent = ProjectJdkTable.getInstance().findMostRecentSdkOfType(JavaSdk.getInstance());
+ if (recent != null) return recent;
+ return JavaAwareProjectJdkTableImpl.getInstanceEx().getInternalJdk();
+ }
+
+ throw new ProjectJdkSettingsOpenerExecutionException("Project JDK is not specified. Configure", project);
+ }
+
if (name.equals(MavenRunnerSettings.USE_JAVA_HOME)) {
final String javaHome = System.getenv(JAVA_HOME);
if (StringUtil.isEmptyOrSpaces(javaHome)) {
@@ -355,6 +374,23 @@ public class MavenExternalParameters {
}
}
+ private static class ProjectJdkSettingsOpenerExecutionException extends ExecutionException implements HyperlinkListener {
+
+ private final Project myProject;
+
+ public ProjectJdkSettingsOpenerExecutionException(final String s, Project project) {
+ super(s);
+ myProject = project;
+ }
+
+ @Override
+ public void hyperlinkUpdate(HyperlinkEvent e) {
+ if (e.getEventType() != HyperlinkEvent.EventType.ACTIVATED) return;
+
+ ProjectSettingsService.getInstance(myProject).openProjectSettings();
+ }
+ }
+
private static class RunConfigurationOpenerExecutionException extends ExecutionException implements HyperlinkListener {
private final MavenRunConfiguration myRunConfiguration;
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerConfigurable.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerConfigurable.java
index aab2a8204a50..ec90fbee1d6d 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerConfigurable.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerConfigurable.java
@@ -21,6 +21,10 @@ import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.JavaSdk;
+import com.intellij.openapi.projectRoots.ProjectJdkTable;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.RawCommandLineEditor;
import org.jetbrains.annotations.Nls;
@@ -50,7 +54,7 @@ public abstract class MavenRunnerConfigurable implements SearchableConfigurable,
private Map myProperties;
- public MavenRunnerConfigurable(Project p, boolean isRunConfiguration) {
+ public MavenRunnerConfigurable(@NotNull Project p, boolean isRunConfiguration) {
myProject = p;
myRunConfigurationMode = isRunConfiguration;
}
@@ -189,7 +193,7 @@ public abstract class MavenRunnerConfigurable implements SearchableConfigurable,
myVMParametersEditor.setText(data.getVmOptions());
mySkipTestsCheckBox.setSelected(data.isSkipTests());
- Map jdkMap = data.collectJdkNamesAndDescriptions();
+ Map jdkMap = collectJdkNamesAndDescriptions();
if (!jdkMap.containsKey(data.getJreName())) {
jdkMap.put(data.getJreName(), data.getJreName());
}
@@ -204,6 +208,32 @@ public abstract class MavenRunnerConfigurable implements SearchableConfigurable,
myPropertiesPanel.setDataFromMap(data.getMavenProperties());
}
+ private Map collectJdkNamesAndDescriptions() {
+ Map result = new LinkedHashMap();
+
+ for (Sdk projectJdk : ProjectJdkTable.getInstance().getSdksOfType(JavaSdk.getInstance())) {
+ String name = projectJdk.getName();
+ result.put(name, name);
+ }
+
+ result.put(MavenRunnerSettings.USE_INTERNAL_JAVA, RunnerBundle.message("maven.java.internal"));
+
+ String projectJdkTitle;
+
+ String projectJdk = ProjectRootManager.getInstance(myProject).getProjectSdkName();
+ if (projectJdk == null) {
+ projectJdkTitle = "Use Project JDK (not defined yet)";
+ }
+ else {
+ projectJdkTitle = "Use Project JDK (" + projectJdk + ')';
+ }
+
+ result.put(MavenRunnerSettings.USE_PROJECT_JDK, projectJdkTitle);
+ result.put(MavenRunnerSettings.USE_JAVA_HOME, RunnerBundle.message("maven.java.home.env"));
+
+ return result;
+ }
+
void setData(MavenRunnerSettings data) {
data.setRunMavenInBackground(myRunInBackgroundCheckbox.isSelected());
data.setVmOptions(myVMParametersEditor.getText().trim());
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettings.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettings.java
index 4cf38fec00e4..f75a0299eba0 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettings.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettings.java
@@ -21,15 +21,12 @@ package org.jetbrains.idea.maven.execution;
import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
-import com.intellij.openapi.projectRoots.SdkType;
-import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -37,6 +34,7 @@ import java.util.Map;
public class MavenRunnerSettings implements Cloneable {
@NonNls public static final String USE_INTERNAL_JAVA = "#JAVA_INTERNAL";
+ @NonNls public static final String USE_PROJECT_JDK = "#USE_PROJECT_JDK";
@NonNls public static final String USE_JAVA_HOME = "#JAVA_HOME";
private boolean runMavenInBackground = true;
@@ -98,26 +96,8 @@ public class MavenRunnerSettings implements Cloneable {
this.mavenProperties = mavenProperties;
}
- public Map collectJdkNamesAndDescriptions() {
- Map result = new LinkedHashMap();
-
- for (Sdk projectJdk : ProjectJdkTable.getInstance().getSdksOfType(getSdkType())) {
- String name = projectJdk.getName();
- result.put(name, name);
- }
-
- result.put(USE_INTERNAL_JAVA, RunnerBundle.message("maven.java.internal"));
- result.put(USE_JAVA_HOME, RunnerBundle.message("maven.java.home.env"));
-
- return result;
- }
-
- private SdkType getSdkType() {
- return JavaSdk.getInstance();
- }
-
public String getDefaultJdkName() {
- Sdk recent = ProjectJdkTable.getInstance().findMostRecentSdkOfType(getSdkType());
+ Sdk recent = ProjectJdkTable.getInstance().findMostRecentSdkOfType(JavaSdk.getInstance());
if (recent == null) return USE_INTERNAL_JAVA;
return recent.getName();
}