Compare commits

...
Author SHA1 Message Date
l0ng-ai 21a61b7cc5 fix(run): run JAR Applications on the project JDK by default
A JAR Application without a chosen JRE ran `java` from PATH even with a
Project JDK set. Its default JRE is now the project JDK, applied with the
other toolchains and left out when saving so it follows later changes.
2026-11-13 10:05:25 +08:00
5 changed files with 38 additions and 3 deletions

No files matched your search

+11
View File
@@ -1620,6 +1620,17 @@ pub fn apply_to_run_configs_in(configs: &mut [RunConfig], root: &Path, fallback:
path_dirs.push(bin);
}
}
// JAR Application's default JRE is the project JDK; a chosen JRE is an absolute `java`.
"jar-application" => {
if let Some(jdk) = &jdk
&& c.command == "java"
{
let java = crate::java::java_executable(&jdk.home);
if java.is_file() {
c.command = java.to_string_lossy().into_owned();
}
}
}
"tomcat" => {
if let Some(jdk) = &jdk {
c.env.entry("JAVA_HOME".into()).or_insert_with(|| jdk.home.to_string_lossy().into_owned());
+24
View File
@@ -383,6 +383,30 @@ fn fake_jdk(dir: &Path) {
std::fs::write(dir.join("bin").join(crate::exe("javac")), "").unwrap();
}
#[test]
fn jar_application_runs_on_the_project_jdk_unless_a_jre_is_chosen() {
let tmp = tempfile::tempdir().unwrap();
let jdk = tmp.path().join("jbr");
fake_jdk(&jdk);
let mut s = Settings::default();
let mut configs = vec![run("jar-application", "java", &["-jar", "app.jar"])];
apply_to_run_configs(&mut configs, tmp.path(), &s);
assert_eq!(configs[0].command, "java", "java on PATH without a project JDK");
s.languages.java.jdk = jdk.to_string_lossy().into_owned();
let chosen = tmp.path().join("other/bin/java").to_string_lossy().into_owned();
let mut configs = vec![
run("jar-application", "java", &["-jar", "app.jar"]),
run("jar-application", &chosen, &["-jar", "app.jar"]),
];
apply_to_run_configs(&mut configs, tmp.path(), &s);
let java = crate::java::java_executable(&project_jdk(tmp.path(), &s).unwrap().home).to_string_lossy().into_owned();
assert_eq!(configs[0].command, java);
assert_eq!(configs[1].command, chosen, "an explicit JRE stays");
// Saved as the default, so it follows a later Project JDK change.
assert_eq!(without_derived(&configs[0], tmp.path(), &s).command, "java");
}
#[test]
fn project_jdk_and_maven_settings() {
if cfg!(windows) {
+1 -1
View File
@@ -188,7 +188,7 @@ export const jarApplicationType: RunConfigTypeContribution = {
{ key: "jarPath", label: "Path to JAR", mono: true, required: true, browse: "file" },
vmOptionsField(),
{ key: "programArgs", label: "Program arguments", mono: true },
{ ...jreField, options: [{ value: "", label: "Default (java on PATH)" }] },
{ ...jreField, options: [{ value: "", label: "Default (the project's JDK)" }] },
],
commandLine(p) {
return {
+1 -1
View File
@@ -215,7 +215,7 @@
"JAR Application": "JAR Application",
"Run an executable JAR": "Run an executable JAR",
"Path to JAR": "Path to JAR",
"Default (java on PATH)": "Default (java on PATH)",
"Default (the project's JDK)": "Default (the project's JDK)",
"Stream Sample TUI": "Stream Sample TUI",
"Arduino tool '{configured}' was not found. Set its path in Settings > Languages & Frameworks > Language Servers, or in settings.toml under languages.arduino.": "Arduino tool '{configured}' was not found. Set its path in Settings > Languages & Frameworks > Language Servers, or in settings.toml under languages.arduino.",
"Arduino tool '{name}' was not found on PATH or in Arduino IDE. Install Arduino IDE 2, or set its path in Settings > Languages & Frameworks > Language Servers or settings.toml under languages.arduino.": "Arduino tool '{name}' was not found on PATH or in Arduino IDE. Install Arduino IDE 2, or set its path in Settings > Languages & Frameworks > Language Servers or settings.toml under languages.arduino.",
+1 -1
View File
@@ -214,7 +214,7 @@
"JAR Application": "JAR 应用程序",
"Run an executable JAR": "运行可执行 JAR",
"Path to JAR": "JAR 路径",
"Default (java on PATH)": "默认(PATH 中的 java)",
"Default (the project's JDK)": "默认(项目 JDK)",
"Arduino tool '{configured}' was not found. Set its path in Settings > Languages & Frameworks > Language Servers, or in settings.toml under languages.arduino.": "未找到 Arduino 工具“{configured}”。请在设置 > 语言和框架 > 语言服务器中配置其路径,或在 settings.toml 的 languages.arduino 下配置。",
"Arduino tool '{name}' was not found on PATH or in Arduino IDE. Install Arduino IDE 2, or set its path in Settings > Languages & Frameworks > Language Servers or settings.toml under languages.arduino.": "在 PATH 或 Arduino IDE 中未找到 Arduino 工具“{name}”。请安装 Arduino IDE 2,或在设置 > 语言和框架 > 语言服务器中配置其路径,也可在 settings.toml 的 languages.arduino 下配置。",
"Install Arduino IDE 2 (includes Arduino Language Server, Arduino CLI and clangd) and the board's core. Configure the server command and arguments in Settings > Languages & Frameworks > Language Servers, or set languages.arduino.cli, languages.arduino.clangd, languages.arduino.languageServer and languages.arduino.cliConfig in settings.toml. Set the board FQBN in sketch.yaml or languages.arduino.fqbn in settings.toml.": "请安装 Arduino IDE 2(包含 Arduino Language Server、Arduino CLI 和 clangd)及开发板核心。在设置 > 语言和框架 > 语言服务器中配置服务器命令和参数,或在 settings.toml 中设置 languages.arduino.cli、languages.arduino.clangd、languages.arduino.languageServer 和 languages.arduino.cliConfig。在 sketch.yaml 或 settings.toml 的 languages.arduino.fqbn 中设置开发板 FQBN。",