дзеркало
https://github.com/l0ng-ai/openidea.git
синхронізовано 2026-11-09 03:05:40 +02:00
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.
Цей коміт міститься в:
1 джерело
fdb07e580c
коміт
b43d9bf7fb
13 files changed
+256
-30
No files matched your search
@@ -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("");
|
||||
|
||||
@@ -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("");
|
||||
});
|
||||
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in new issue
Заблокувати користувача