feat(maven): choose the JRE Maven runs with (#2020)

Closes #1976. Settings › Build Tools › Maven gets a JRE field (per project or global): empty uses the Project JDK, else the chosen JDK runs Maven sync, builds, goals and tests (JAVA_HOME). One resolver (ide_sdk::apply::maven_jdk / maven_build_env) now serves the build model, compile steps, Maven run configurations and the mvnd Java 17 check; an explicit JAVA_HOME in a run configuration still wins.
Цей коміт міститься в:
l0ng-ai authored and GitHub committed 2026-11-07 23:56:04 +08:00
1 джерело fdb07e580c
коміт b43d9bf7fb
13 files changed
+256 -30

No files matched your search

+15 -1
Переглянути файл
@@ -27,7 +27,13 @@ describe("languages settings", () => {
jdtlsVmArgs: " -Xmx2g ",
jdk: 21,
jdtlsJdk: " /opt/jdk-25 ",
maven: { home: " /opt/maven ", daemon: "yes", mvndHome: " /opt/mvnd ", threads: " 2C " },
maven: {
runnerJre: " /opt/jdk-21 ",
home: " /opt/maven ",
daemon: "yes",
mvndHome: " /opt/mvnd ",
threads: " 2C ",
},
},
});
expect(v.python).toEqual({ interpreter: "/usr/bin/python3", activateVirtualenv: true });
@@ -39,6 +45,7 @@ describe("languages settings", () => {
expect(v.java.jdk).toBe("");
expect(v.java.jdtlsJdk).toBe("/opt/jdk-25");
expect(v.java.maven).toEqual({
runnerJre: "/opt/jdk-21",
home: "/opt/maven",
userSettings: "",
localRepository: "",
@@ -52,6 +59,13 @@ describe("languages settings", () => {
expect(validateLanguages({ java: { maven: { threads: 4 } } }).java.maven.threads).toBe("");
});
it("defaults the Maven runner JRE to the project JDK and preserves a chosen JDK", () => {
expect(validateSettings({}).languages.java.maven.runnerJre).toBe("");
expect(validateLanguages({ java: { maven: { runnerJre: 21 } } }).java.maven.runnerJre).toBe("");
const settings = validateSettings({ languages: { java: { maven: { runnerJre: " ./jdks/21 " } } } });
expect(validateSettings(settings).languages.java.maven.runnerJre).toBe("./jdks/21");
});
it("keeps the Ruby interpreter through settings normalization and defaults to Auto", () => {
expect(validateSettings({}).languages.ruby.interpreter).toBe("");
expect(validateLanguages({ ruby: { interpreter: 42 } }).ruby.interpreter).toBe("");
+45
Переглянути файл
@@ -0,0 +1,45 @@
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
import { afterEach, beforeEach, expect, it } from "vitest";
import { PageContext } from "../components/context";
import { MavenPage } from "../languages/LanguagePages";
import { useSdks } from "../languages/api";
import { DEFAULT_SETTINGS } from "../model/schema";
import { stagedValue, useSettingsDialog } from "../model/staging";
import { EXECUTION_PAGES } from "../pages/execution";
beforeEach(() => {
useSettingsDialog.setState({
base: structuredClone(DEFAULT_SETTINGS),
globalBase: structuredClone(DEFAULT_SETTINGS),
staged: {},
query: "",
});
useSdks.setState({
byKind: {
jdk: [{ path: "/jdks/21", home: "/jdks/21", name: "JDK 21", version: "21", source: "system", extra: null }],
maven: [],
},
loading: {},
});
});
afterEach(cleanup);
it("chooses an installed Maven runner JRE in project scope and returns to Project JDK", () => {
const page = EXECUTION_PAGES.find((p) => p.id === "build.maven")!;
expect(page.projectScope).toBe(true);
expect(page.defaultScope).toBe("project");
expect(page.keywords).toEqual(expect.arrayContaining(["JRE", "runner", "JDK", "JAVA_HOME"]));
render(
<PageContext.Provider value={{ pageId: page.id, scope: page.defaultScope! }}>
<MavenPage />
</PageContext.Provider>,
);
expect(screen.getByRole("button", { name: "JRE" })).toHaveTextContent("Use Project JDK");
fireEvent.click(screen.getByRole("button", { name: "JRE" }));
fireEvent.click(screen.getByRole("option", { name: /JDK 21/ }));
expect(stagedValue(useSettingsDialog.getState(), "project", "languages.java.maven.runnerJre")).toBe("/jdks/21");
expect(stagedValue(useSettingsDialog.getState(), "global", "languages.java.maven.runnerJre")).toBe("");
fireEvent.click(screen.getByRole("button", { name: "JRE" }));
fireEvent.click(screen.getByRole("option", { name: "Use Project JDK" }));
expect(stagedValue(useSettingsDialog.getState(), "project", "languages.java.maven.runnerJre")).toBe("");
});
+10
Переглянути файл
@@ -498,6 +498,16 @@ export function MavenPage() {
return (
<div className={styles.page}>
<Section>
<SdkRow
k="languages.java.maven.runnerJre"
label="JRE"
kind="jdk"
emptyLabel="Use Project JDK"
directory
browseTitle="Select JDK Home Directory"
aria-label="JRE"
hint="JDK used for Maven sync, builds, goals and tests. An explicit JAVA_HOME in a run configuration takes precedence."
/>
<SdkRow
k="languages.java.maven.home"
label="Maven home path"
+4
Переглянути файл
@@ -145,6 +145,10 @@ export const EXECUTION_PAGES: PageSpec[] = [
// IntelliJ IDEA: Build Tools › Maven, before Console / Debugger.
order: 359,
keywords: [
"JRE",
"runner",
"JDK",
"JAVA_HOME",
"maven home",
"mvn",
"mvnw",