From b10e0c507290d875375687240ddeb00db5ebceab Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 5 Sep 2014 09:30:28 +0400 Subject: [PATCH] IDEA-81929: Support java -jar run configurations --- .../application/ApplicationConfiguration.java | 46 +--- .../BaseJavaApplicationCommandLineState.java | 70 ++++++ .../jar/JarApplicationCommandLineState.java | 43 ++++ .../jar/JarApplicationConfigurable.form | 39 ++++ .../jar/JarApplicationConfigurable.java | 86 ++++++++ .../jar/JarApplicationConfiguration.java | 201 ++++++++++++++++++ .../jar/JarApplicationConfigurationType.java | 48 +++++ .../jar/JarApplicationDebuggerRunner.java | 37 ++++ .../runners/ProcessProxyFactoryImpl.java | 7 +- .../execution/util/JavaParametersUtil.java | 3 +- .../configurations/CommandLineBuilder.java | 2 +- .../configurations/SimpleJavaParameters.java | 10 +- .../openapi/projectRoots/JdkUtil.java | 12 +- .../src/messages/ExecutionBundle.properties | 5 +- resources/src/META-INF/IdeaPlugin.xml | 2 + 15 files changed, 562 insertions(+), 49 deletions(-) create mode 100644 java/execution/impl/src/com/intellij/execution/application/BaseJavaApplicationCommandLineState.java create mode 100644 java/execution/impl/src/com/intellij/execution/jar/JarApplicationCommandLineState.java create mode 100644 java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurable.form create mode 100644 java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurable.java create mode 100644 java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfiguration.java create mode 100644 java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurationType.java create mode 100644 java/execution/impl/src/com/intellij/execution/jar/JarApplicationDebuggerRunner.java diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java index 578d5fbba6ea..b736d9f0b127 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java @@ -21,20 +21,16 @@ import com.intellij.execution.configuration.EnvironmentVariablesComponent; import com.intellij.execution.configurations.*; import com.intellij.execution.filters.TextConsoleBuilderFactory; import com.intellij.execution.junit.RefactoringListeners; -import com.intellij.execution.process.KillableColoredProcessHandler; -import com.intellij.execution.process.OSProcessHandler; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.util.JavaParametersUtil; import com.intellij.execution.util.ProgramParametersUtil; import com.intellij.openapi.components.PathMacroManager; -import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.options.SettingsEditorGroup; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.DefaultJDOMExternalizer; import com.intellij.openapi.util.InvalidDataException; -import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -81,7 +77,7 @@ public class ApplicationConfiguration extends ModuleBasedConfiguration(this, env); JavaRunConfigurationModule module = getConfigurationModule(); state.setConsoleBuilder(TextConsoleBuilderFactory.getInstance().createBuilder(getProject(), module.getSearchScope())); return state; @@ -253,14 +249,9 @@ public class ApplicationConfiguration extends ModuleBasedConfiguration extends BaseJavaApplicationCommandLineState { + public JavaApplicationCommandLineState(@NotNull final T configuration, final ExecutionEnvironment environment) { + super(environment, configuration); } @Override @@ -269,37 +260,14 @@ public class ApplicationConfiguration extends ModuleBasedConfiguration extends JavaCommandLineState { + protected final T myConfiguration; + + public BaseJavaApplicationCommandLineState(ExecutionEnvironment environment, @NotNull final T configuration) { + super(environment); + myConfiguration = configuration; + } + + protected void setupJavaParameters(JavaParameters params) throws ExecutionException { + JavaParametersUtil.configureConfiguration(params, myConfiguration); + + for(RunConfigurationExtension ext: Extensions.getExtensions(RunConfigurationExtension.EP_NAME)) { + ext.updateJavaParameters(getConfiguration(), params, getRunnerSettings()); + } + } + + @NotNull + @Override + protected OSProcessHandler startProcess() throws ExecutionException { + OSProcessHandler handler = SystemInfo.isWindows ? super.startProcess() : KillableColoredProcessHandler.create(createCommandLine()); + RunnerSettings runnerSettings = getRunnerSettings(); + JavaRunConfigurationExtensionManager.getInstance().attachExtensionsToProcess(getConfiguration(), handler, runnerSettings); + return handler; + } + + @Override + protected boolean ansiColoringEnabled() { + return true; + } + + protected T getConfiguration() { + return myConfiguration; + } +} diff --git a/java/execution/impl/src/com/intellij/execution/jar/JarApplicationCommandLineState.java b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationCommandLineState.java new file mode 100644 index 000000000000..c93ab85d4cec --- /dev/null +++ b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationCommandLineState.java @@ -0,0 +1,43 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.execution.jar; + +import com.intellij.execution.ExecutionException; +import com.intellij.execution.application.BaseJavaApplicationCommandLineState; +import com.intellij.execution.configurations.JavaParameters; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.util.JavaParametersUtil; +import com.intellij.openapi.util.io.FileUtil; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public class JarApplicationCommandLineState extends BaseJavaApplicationCommandLineState { + public JarApplicationCommandLineState(@NotNull final JarApplicationConfiguration configuration, final ExecutionEnvironment environment) { + super(environment, configuration); + } + + @Override + protected JavaParameters createJavaParameters() throws ExecutionException { + final JavaParameters params = new JavaParameters(); + final String jreHome = myConfiguration.isAlternativeJrePathEnabled() ? myConfiguration.getAlternativeJrePath() : null; + params.setJdk(JavaParametersUtil.createProjectJdk(myConfiguration.getProject(), jreHome)); + setupJavaParameters(params); + params.setJarPath(FileUtil.toSystemDependentName(myConfiguration.getJarPath())); + return params; + } +} diff --git a/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurable.form b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurable.form new file mode 100644 index 000000000000..b6012a096c95 --- /dev/null +++ b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurable.form @@ -0,0 +1,39 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurable.java b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurable.java new file mode 100644 index 000000000000..071f348a79a4 --- /dev/null +++ b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurable.java @@ -0,0 +1,86 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.execution.jar; + +import com.intellij.execution.ui.AlternativeJREPanel; +import com.intellij.execution.ui.CommonJavaParametersPanel; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.SettingsEditor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.LabeledComponent; +import com.intellij.openapi.ui.TextFieldWithBrowseButton; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.ui.PanelWithAnchor; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +public class JarApplicationConfigurable extends SettingsEditor implements PanelWithAnchor { + private CommonJavaParametersPanel myCommonProgramParameters; + private LabeledComponent myJarPathComponent; + private JPanel myWholePanel; + + private AlternativeJREPanel myAlternativeJREPanel; + private final Project myProject; + private JComponent myAnchor; + + public JarApplicationConfigurable(final Project project) { + myProject = project; + myAnchor = UIUtil.mergeComponentsWithAnchor(myJarPathComponent, myCommonProgramParameters, myAlternativeJREPanel); + } + + public void applyEditorTo(final JarApplicationConfiguration configuration) throws ConfigurationException { + myCommonProgramParameters.applyTo(configuration); + configuration.setAlternativeJrePath(myAlternativeJREPanel.getPath()); + configuration.setAlternativeJrePathEnabled(myAlternativeJREPanel.isPathEnabled()); + configuration.setJarPath(FileUtil.toSystemIndependentName(myJarPathComponent.getComponent().getText())); + } + + public void resetEditorFrom(final JarApplicationConfiguration configuration) { + myCommonProgramParameters.reset(configuration); + myJarPathComponent.getComponent().setText(FileUtil.toSystemDependentName(configuration.getJarPath())); + myAlternativeJREPanel.init(configuration.getAlternativeJrePath(), configuration.isAlternativeJrePathEnabled()); + } + + @NotNull + public JComponent createEditor() { + return myWholePanel; + } + + private void createUIComponents() { + myJarPathComponent = new LabeledComponent(); + TextFieldWithBrowseButton textFieldWithBrowseButton = new TextFieldWithBrowseButton(); + textFieldWithBrowseButton.addBrowseFolderListener("Choose Jar File", null, myProject, + new FileChooserDescriptor(false, false, true, true, false, false)); + myJarPathComponent.setComponent(textFieldWithBrowseButton); + } + + @Override + public JComponent getAnchor() { + return myAnchor; + } + + @Override + public void setAnchor(@Nullable JComponent anchor) { + myAnchor = anchor; + myCommonProgramParameters.setAnchor(anchor); + myAlternativeJREPanel.setAnchor(anchor); + myJarPathComponent.setAnchor(anchor); + } +} diff --git a/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfiguration.java b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfiguration.java new file mode 100644 index 000000000000..5aaa0a3b0bd6 --- /dev/null +++ b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfiguration.java @@ -0,0 +1,201 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.execution.jar; + +import com.intellij.diagnostic.logging.LogConfigurationPanel; +import com.intellij.execution.*; +import com.intellij.execution.configuration.EnvironmentVariablesComponent; +import com.intellij.execution.configurations.*; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.util.JavaParametersUtil; +import com.intellij.execution.util.ProgramParametersUtil; +import com.intellij.openapi.components.PathMacroManager; +import com.intellij.openapi.options.SettingsEditor; +import com.intellij.openapi.options.SettingsEditorGroup; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.WriteExternalException; +import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters; +import com.intellij.util.xmlb.XmlSerializer; +import org.jdom.Element; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author nik + */ +public class JarApplicationConfiguration extends RunConfigurationBase implements CommonJavaRunConfigurationParameters { + private static final SkipDefaultValuesSerializationFilters SERIALIZATION_FILTERS = new SkipDefaultValuesSerializationFilters(); + private JarApplicationConfigurationBean myBean = new JarApplicationConfigurationBean(); + private Map myEnvs = new LinkedHashMap(); + + public JarApplicationConfiguration(Project project, ConfigurationFactory factory, String name) { + super(project, factory, name); + } + + @NotNull + @Override + public SettingsEditor getConfigurationEditor() { + SettingsEditorGroup group = new SettingsEditorGroup(); + group.addEditor(ExecutionBundle.message("run.configuration.configuration.tab.title"), new JarApplicationConfigurable(getProject())); + JavaRunConfigurationExtensionManager.getInstance().appendEditors(this, group); + group.addEditor(ExecutionBundle.message("logs.tab.title"), new LogConfigurationPanel()); + return group; + } + + @Override + public void readExternal(Element element) throws InvalidDataException { + PathMacroManager.getInstance(getProject()).expandPaths(element); + super.readExternal(element); + JavaRunConfigurationExtensionManager.getInstance().readExternal(this, element); + XmlSerializer.deserializeInto(myBean, element); + EnvironmentVariablesComponent.readExternal(element, getEnvs()); + } + + @Override + public void writeExternal(Element element) throws WriteExternalException { + super.writeExternal(element); + JavaRunConfigurationExtensionManager.getInstance().writeExternal(this, element); + XmlSerializer.serializeInto(myBean, element, SERIALIZATION_FILTERS); + EnvironmentVariablesComponent.writeExternal(element, getEnvs()); + PathMacroManager.getInstance(getProject()).collapsePathsRecursively(element); + } + + @Override + public void checkConfiguration() throws RuntimeConfigurationException { + JavaParametersUtil.checkAlternativeJRE(this); + ProgramParametersUtil.checkWorkingDirectoryExist(this, getProject(), null); + File jarFile = new File(getJarPath()); + if (!jarFile.exists()) { + throw new RuntimeConfigurationWarning("Jar file '" + jarFile.getAbsolutePath() + "' doesn't exist"); + } + JavaRunConfigurationExtensionManager.checkConfigurationIsValid(this); + } + + @Nullable + @Override + public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment environment) throws ExecutionException { + return new JarApplicationCommandLineState(this, environment); + } + + public String getJarPath() { + return myBean.JAR_PATH; + } + + public void setJarPath(String jarPath) { + myBean.JAR_PATH = jarPath; + } + + @Override + public void setVMParameters(String value) { + myBean.VM_PARAMETERS = value; + } + + @Override + public String getVMParameters() { + return myBean.VM_PARAMETERS; + } + + @Override + public boolean isAlternativeJrePathEnabled() { + return myBean.ALTERNATIVE_JRE_PATH_ENABLED; + } + + @Override + public void setAlternativeJrePathEnabled(boolean enabled) { + myBean.ALTERNATIVE_JRE_PATH_ENABLED = enabled; + } + + @Override + public String getAlternativeJrePath() { + return myBean.ALTERNATIVE_JRE_PATH; + } + + @Override + public void setAlternativeJrePath(String path) { + myBean.ALTERNATIVE_JRE_PATH = path; + } + + @Nullable + @Override + public String getRunClass() { + return null; + } + + @Nullable + @Override + public String getPackage() { + return null; + } + + @Override + public void setProgramParameters(@Nullable String value) { + myBean.PROGRAM_PARAMETERS = value; + } + + @Nullable + @Override + public String getProgramParameters() { + return myBean.PROGRAM_PARAMETERS; + } + + @Override + public void setWorkingDirectory(@Nullable String value) { + myBean.WORKING_DIRECTORY = value; + } + + @Nullable + @Override + public String getWorkingDirectory() { + return myBean.WORKING_DIRECTORY; + } + + @Override + public void setEnvs(@NotNull Map envs) { + myEnvs.clear(); + myEnvs.putAll(envs); + } + + @NotNull + @Override + public Map getEnvs() { + return myEnvs; + } + + @Override + public void setPassParentEnvs(boolean passParentEnvs) { + myBean.PASS_PARENT_ENVS = passParentEnvs; + } + + @Override + public boolean isPassParentEnvs() { + return myBean.PASS_PARENT_ENVS; + } + + private static class JarApplicationConfigurationBean { + public String JAR_PATH = ""; + public String VM_PARAMETERS = ""; + public String PROGRAM_PARAMETERS = ""; + public String WORKING_DIRECTORY = ""; + public boolean ALTERNATIVE_JRE_PATH_ENABLED; + public String ALTERNATIVE_JRE_PATH = ""; + public boolean PASS_PARENT_ENVS = true; + } +} diff --git a/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurationType.java b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurationType.java new file mode 100644 index 000000000000..05fb3aaa0972 --- /dev/null +++ b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationConfigurationType.java @@ -0,0 +1,48 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.execution.jar; + +import com.intellij.execution.ExecutionBundle; +import com.intellij.execution.configuration.ConfigurationFactoryEx; +import com.intellij.execution.configurations.ConfigurationType; +import com.intellij.execution.configurations.ConfigurationTypeBase; +import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.icons.AllIcons; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; +import org.jetbrains.annotations.NotNull; + +public class JarApplicationConfigurationType extends ConfigurationTypeBase implements ConfigurationType { + public JarApplicationConfigurationType() { + super("JarApplication", ExecutionBundle.message("jar.application.configuration.name"), + ExecutionBundle.message("jar.application.configuration.description"), AllIcons.FileTypes.Archive); + addFactory(new ConfigurationFactoryEx(this) { + @Override + public void onNewConfigurationCreated(@NotNull RunConfiguration configuration) { + JarApplicationConfiguration jarApplicationConfiguration = (JarApplicationConfiguration)configuration; + if (StringUtil.isEmpty(jarApplicationConfiguration.getWorkingDirectory())) { + String baseDir = FileUtil.toSystemIndependentName(StringUtil.notNullize(configuration.getProject().getBasePath())); + jarApplicationConfiguration.setWorkingDirectory(baseDir); + } + } + + public RunConfiguration createTemplateConfiguration(Project project) { + return new JarApplicationConfiguration(project, this, ""); + } + }); + } +} diff --git a/java/execution/impl/src/com/intellij/execution/jar/JarApplicationDebuggerRunner.java b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationDebuggerRunner.java new file mode 100644 index 000000000000..dc5bfbfb6129 --- /dev/null +++ b/java/execution/impl/src/com/intellij/execution/jar/JarApplicationDebuggerRunner.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.execution.jar; + +import com.intellij.debugger.impl.GenericDebuggerRunner; +import com.intellij.execution.configurations.RunProfile; +import com.intellij.execution.executors.DefaultDebugExecutor; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public class JarApplicationDebuggerRunner extends GenericDebuggerRunner { + @Override + public boolean canRun(@NotNull String executorId, @NotNull RunProfile profile) { + return DefaultDebugExecutor.EXECUTOR_ID.equals(executorId) && profile instanceof JarApplicationConfiguration; + } + + @NotNull + @Override + public String getRunnerId() { + return "JarDebug"; + } +} diff --git a/java/execution/impl/src/com/intellij/execution/runners/ProcessProxyFactoryImpl.java b/java/execution/impl/src/com/intellij/execution/runners/ProcessProxyFactoryImpl.java index 6af48770e78d..4b20e2189202 100644 --- a/java/execution/impl/src/com/intellij/execution/runners/ProcessProxyFactoryImpl.java +++ b/java/execution/impl/src/com/intellij/execution/runners/ProcessProxyFactoryImpl.java @@ -30,15 +30,16 @@ import java.io.File; public class ProcessProxyFactoryImpl extends ProcessProxyFactory { public ProcessProxy createCommandLineProxy(final JavaCommandLine javaCmdLine) throws ExecutionException { ProcessProxyImpl proxy = null; - if (ProcessProxyImpl.useLauncher()) { + final JavaParameters javaParameters = javaCmdLine.getJavaParameters(); + String mainClass = javaParameters.getMainClass(); + if (ProcessProxyImpl.useLauncher() && mainClass != null) { try { proxy = new ProcessProxyImpl(); - final JavaParameters javaParameters = javaCmdLine.getJavaParameters(); JavaSdkUtil.addRtJar(javaParameters.getClassPath()); final ParametersList vmParametersList = javaParameters.getVMParametersList(); vmParametersList.defineProperty(ProcessProxyImpl.PROPERTY_PORT_NUMBER, String.valueOf(proxy.getPortNumber())); vmParametersList.defineProperty(ProcessProxyImpl.PROPERTY_BINPATH, PathManager.getBinPath()); - javaParameters.getProgramParametersList().prepend(javaParameters.getMainClass()); + javaParameters.getProgramParametersList().prepend(mainClass); javaParameters.setMainClass(ProcessProxyImpl.LAUNCH_MAIN_CLASS); } catch (ProcessProxyImpl.NoMoreSocketsException e) { diff --git a/java/execution/impl/src/com/intellij/execution/util/JavaParametersUtil.java b/java/execution/impl/src/com/intellij/execution/util/JavaParametersUtil.java index 18aead7fe7f1..4d948dae8a2d 100644 --- a/java/execution/impl/src/com/intellij/execution/util/JavaParametersUtil.java +++ b/java/execution/impl/src/com/intellij/execution/util/JavaParametersUtil.java @@ -27,7 +27,6 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdk; -import com.intellij.openapi.projectRoots.JavaSdkType; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.ex.PathUtilEx; @@ -118,7 +117,7 @@ public class JavaParametersUtil { return jreHome == null ? JavaParameters.getModuleJdk(module) : createAlternativeJdk(jreHome); } - private static Sdk createProjectJdk(final Project project, final String jreHome) throws CantRunException { + public static Sdk createProjectJdk(final Project project, final String jreHome) throws CantRunException { return jreHome == null ? createProjectJdk(project) : createAlternativeJdk(jreHome); } diff --git a/java/execution/openapi/src/com/intellij/execution/configurations/CommandLineBuilder.java b/java/execution/openapi/src/com/intellij/execution/configurations/CommandLineBuilder.java index ac081d04b5c7..8ae0d9bae3e3 100644 --- a/java/execution/openapi/src/com/intellij/execution/configurations/CommandLineBuilder.java +++ b/java/execution/openapi/src/com/intellij/execution/configurations/CommandLineBuilder.java @@ -79,7 +79,7 @@ public class CommandLineBuilder { if (exePath == null) { throw new CantRunException(ExecutionBundle.message("run.configuration.cannot.find.vm.executable")); } - if (javaParameters.getMainClass() == null) { + if (javaParameters.getMainClass() == null && javaParameters.getJarPath() == null) { throw new CantRunException(ExecutionBundle.message("main.class.is.not.specified.error.message")); } diff --git a/platform/lang-api/src/com/intellij/execution/configurations/SimpleJavaParameters.java b/platform/lang-api/src/com/intellij/execution/configurations/SimpleJavaParameters.java index 7b3c45d5c7de..59fe6c2f1be2 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/SimpleJavaParameters.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/SimpleJavaParameters.java @@ -40,11 +40,16 @@ public class SimpleJavaParameters extends SimpleProgramParameters { private Charset myCharset = CharsetToolkit.getDefaultSystemCharset(); private boolean myUseDynamicClasspath; private boolean myUseDynamicVMOptions; - + private String myJarPath; + public String getMainClass() { return myMainClass; } + public String getJarPath() { + return myJarPath; + } + /** * @return jdk used to launch the application. * If the instance of the JavaParameters is used to configure app server startup script, @@ -62,6 +67,9 @@ public class SimpleJavaParameters extends SimpleProgramParameters { public void setMainClass(@NonNls final String mainClass) { myMainClass = mainClass; } + public void setJarPath(@NonNls final String jarPath) { + myJarPath = jarPath; + } public PathsList getClassPath() { return myClassPath; diff --git a/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java b/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java index 4291e9b401bf..337909b318e5 100644 --- a/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java +++ b/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java @@ -247,7 +247,15 @@ public class JdkUtil { } final String mainClass = javaParameters.getMainClass(); - commandLine.addParameter(mainClass); + String jarPath = javaParameters.getJarPath(); + if (mainClass != null) { + commandLine.addParameter(mainClass); + } + else if (jarPath != null) { + commandLine.addParameter("-jar"); + commandLine.addParameter(jarPath); + } + commandLine.addParameters(javaParameters.getProgramParametersList().getList()); commandLine.setWorkDirectory(javaParameters.getWorkingDirectory()); @@ -260,7 +268,7 @@ public class JdkUtil { ParametersList parametersList) { commandLine.addParameters(parametersList.getList()); appendEncoding(javaParameters, commandLine, parametersList); - if (!parametersList.hasParameter("-classpath") && !parametersList.hasParameter("-cp")){ + if (!parametersList.hasParameter("-classpath") && !parametersList.hasParameter("-cp") && !javaParameters.getClassPath().getPathList().isEmpty()){ commandLine.addParameter("-classpath"); commandLine.addParameter(javaParameters.getClassPath().getPathsString()); } diff --git a/platform/platform-resources-en/src/messages/ExecutionBundle.properties b/platform/platform-resources-en/src/messages/ExecutionBundle.properties index 183dda3d52b8..a49bcced6f50 100644 --- a/platform/platform-resources-en/src/messages/ExecutionBundle.properties +++ b/platform/platform-resources-en/src/messages/ExecutionBundle.properties @@ -40,9 +40,12 @@ jre.not.valid.error.message=''{0}'' is not valid JRE home applet.configuration.description=Applet configuration applet.configuration.name=Applet -application.configuration.description=Application configuration +application.configuration.description=Java application configuration application.configuration.name=Application +jar.application.configuration.description=Configuration to run a JAR file using 'java -jar' command +jar.application.configuration.name=JAR Application + run.configuration.norunner.selected.label=No runner selected run.configuration.configuration.tab.title=Configuration run.configuration.startup.connection.rab.title=Startup/Connection diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index ec30ca2614dc..6e3ca97edb51 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1224,6 +1224,7 @@ + @@ -1452,6 +1453,7 @@ +