diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerPanel.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerPanel.java index 92137bbc01b5..68a1ac2aaa6a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerPanel.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerPanel.java @@ -1,4 +1,7 @@ // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// +// Modified by Egor Prokopov at 2026 as part of the OpenIDE project(https://openide.ru). +// Any modifications are available on the same license terms as the original source code. package org.jetbrains.idea.maven.execution; import com.intellij.execution.target.LanguageRuntimeConfiguration; @@ -70,6 +73,8 @@ public class MavenRunnerPanel { ui.envVariablesComponent.setEnvs(data.getEnvironmentProperties()); ui.envVariablesComponent.setPassParentEnvs(data.isPassParentEnv()); + + ui.scriptDirField.setText(data.getScriptDirectory()); } @@ -86,6 +91,7 @@ public class MavenRunnerPanel { data.setMavenProperties(ui.propertiesPanel.getDataAsMap()); data.setEnvironmentProperties(ui.envVariablesComponent.getEnvs()); data.setPassParentEnv(ui.envVariablesComponent.isPassParentEnvs()); + data.setScriptDirectory(ui.scriptDirField.getText().trim()); } public Project getProject() { 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 73c9506c3a94..96a818e4d8e1 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 @@ -1,4 +1,7 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// +// Modified by Egor Prokopov at 2026 as part of the OpenIDE project(https://openide.ru). +// Any modifications are available on the same license terms as the original source code. package org.jetbrains.idea.maven.execution; import com.intellij.openapi.Disposable; @@ -30,6 +33,8 @@ public class MavenRunnerSettings implements Cloneable { private Map environmentProperties = new HashMap<>(); private boolean passParentEnv = true; + private @NotNull String scriptDirectory = ""; + private DisposableWrapperList myListeners = new DisposableWrapperList<>(); public boolean isDelegateBuildToMaven() { @@ -98,6 +103,14 @@ public class MavenRunnerSettings implements Cloneable { this.passParentEnv = passParentEnv; } + public @NotNull @NlsSafe String getScriptDirectory() { + return scriptDirectory; + } + + public void setScriptDirectory(@Nullable String scriptDirectory) { + this.scriptDirectory = Objects.requireNonNullElse(scriptDirectory, ""); + } + public void addListener(@NotNull Listener l, @NotNull Disposable disposable) { myListeners.add(l, disposable); } @@ -130,6 +143,7 @@ public class MavenRunnerSettings implements Cloneable { if (!vmOptions.equals(that.vmOptions)) return false; if (!environmentProperties.equals(that.environmentProperties)) return false; if (passParentEnv != that.passParentEnv) return false; + if (!scriptDirectory.equals(that.scriptDirectory)) return false; return true; } @@ -143,6 +157,7 @@ public class MavenRunnerSettings implements Cloneable { result = 31 * result + (skipTests ? 1 : 0); result = 31 * result + environmentProperties.hashCode(); result = 31 * result + (mavenProperties != null ? mavenProperties.hashCode() : 0); + result = 31 * result + scriptDirectory.hashCode(); return result; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerUi.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerUi.kt index fbe8935c900b..2de20d536c26 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerUi.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerUi.kt @@ -1,13 +1,20 @@ // Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// +// Modified by Egor Prokopov at 2026 as part of the OpenIDE project(https://openide.ru). +// Any modifications are available on the same license terms as the original source code. package org.jetbrains.idea.maven.execution import com.intellij.execution.configuration.EnvironmentVariablesComponent +import com.intellij.openapi.application.PathManager import com.intellij.openapi.externalSystem.service.ui.ExternalSystemJdkComboBox +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory import com.intellij.openapi.project.Project import com.intellij.openapi.ui.ComboBox +import com.intellij.openapi.ui.TextFieldWithBrowseButton import com.intellij.ui.ClientProperty import com.intellij.ui.RawCommandLineEditor import com.intellij.ui.UserActivityWatcher +import com.intellij.ui.components.JBTextField import com.intellij.ui.dsl.builder.Align import com.intellij.ui.dsl.builder.AlignX import com.intellij.ui.dsl.builder.Row @@ -35,6 +42,8 @@ internal class MavenRunnerUi(project: Project, runConfigurationMode: Boolean, pr @JvmField val propertiesPanel = MavenPropertiesPanel(properties) + lateinit var scriptDirField: TextFieldWithBrowseButton + private lateinit var jdkRow: Row private lateinit var targetJdkRow: Row @@ -73,6 +82,20 @@ internal class MavenRunnerUi(project: Project, runConfigurationMode: Boolean, pr } } + row(MavenConfigurableBundle.message("maven.settings.runner.script.dir")) { + val fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor() + .withTitle(MavenConfigurableBundle.message("maven.settings.runner.script.dir.title")) + scriptDirField = textFieldWithBrowseButton(fileChooserDescriptor, project) + .align(AlignX.FILL) + .applyToComponent { + val scriptDirTooltip = MavenConfigurableBundle.message("maven.settings.runner.script.dir.tooltip") + toolTipText = scriptDirTooltip + textField.toolTipText = scriptDirTooltip + (textField as JBTextField).emptyText.text = PathManager.getTempPath() + } + .component + } + group(MavenConfigurableBundle.message("maven.settings.runner.properties"), indent = false) { row { skipTestsCheckBox = checkBox(MavenConfigurableBundle.message("maven.settings.runner.skip.tests")) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/run/MavenShCommandLineState.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/run/MavenShCommandLineState.kt index ea5845179d0b..59321ef208c6 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/run/MavenShCommandLineState.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/run/MavenShCommandLineState.kt @@ -1,5 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. - +// +// Modified by Egor Prokopov at 2026 as part of the OpenIDE project(https://openide.ru). +// Any modifications are available on the same license terms as the original source code. package org.jetbrains.idea.maven.execution.run import com.intellij.build.BuildDescriptor @@ -33,12 +35,12 @@ import com.intellij.execution.ui.ConsoleView import com.intellij.execution.util.ProgramParametersUtil import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.DefaultActionGroup +import com.intellij.openapi.application.PathManager import com.intellij.openapi.application.readAction import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunConfigurationViewManager import com.intellij.openapi.util.io.FileUtil -import com.intellij.openapi.util.io.FileUtilRt import com.intellij.openapi.util.registry.Registry import com.intellij.platform.eel.EelApi import com.intellij.platform.eel.EelOsFamily @@ -225,7 +227,8 @@ class MavenShCommandLineState(val environment: ExecutionEnvironment, private val tmpData.append(commandPrefix).append(batParams.list.joinToString(" ") { CommandLineUtil.escapeParameterOnWindows(it, true) }) - val tempDirectory = FileUtilRt.getTempDirectory() + val runnerSettings = myConfiguration.runnerSettings ?: MavenRunner.getInstance(myConfiguration.project).state + val tempDirectory = runnerSettings.scriptDirectory.takeIf { it.isNotBlank() } ?: PathManager.getTempDir().toString() val tmpBat = FileUtil.createTempFile(java.io.File(tempDirectory), "mvn-idea-exec", ".bat", false, true) diff --git a/plugins/maven/src/main/resources/messages/MavenConfigurableBundle.properties b/plugins/maven/src/main/resources/messages/MavenConfigurableBundle.properties index 3451f231a92f..3c65ad649c7c 100644 --- a/plugins/maven/src/main/resources/messages/MavenConfigurableBundle.properties +++ b/plugins/maven/src/main/resources/messages/MavenConfigurableBundle.properties @@ -2,6 +2,9 @@ # # Modified by Nikita Iarychenko at 2025 as part of the OpenIDE project(https://openide.ru). # Any modifications are available on the same license terms as the original source code. +# +# Modified by Egor Prokopov at 2026 as part of the OpenIDE project(https://openide.ru). +# Any modifications are available on the same license terms as the original source code. maven.settings.override=Override maven.settings.environment.home.directory=Maven &home path maven.settings.on.targets.environment.home.directory=Maven &home path on {0} @@ -106,6 +109,9 @@ maven.settings.runner.vm.options=&VM Options: maven.settings.runner.jre=&JRE: maven.settings.runner.properties=Properties: maven.settings.runner.skip.tests=Skip &Tests +maven.settings.runner.script.dir=Maven &script directory: +maven.settings.runner.script.dir.title=Select Maven Script Directory +maven.settings.runner.script.dir.tooltip=Directory for the temporary Maven launcher script (mvn-idea-exec.bat).
Leave empty to use the IDE temp dir. Override when AppLocker or Group Policy
forbids script execution from system or %LOCALAPPDATA% temp folders. maven.settings.runner.properties.not.defined=No properties defined maven.settings.archetype.add.repository=Repository (optional) maven.settings.archetype.add.groupid=GroupId