fix(java): use the project host classpath separator (#492)

Цей коміт міститься в:
l0ng-ai authored and GitHub committed 2026-10-31 10:00:01 +08:00
1 джерело f9a7c68897
коміт 4a620122e8
9 files changed
+119 -12

No files matched your search

+1
Переглянути файл
@@ -32,6 +32,7 @@ vi.mock("@/platform/ipc", async (orig) => {
projectRoot: "/p",
classPaths: ["/p/target/classes", "/m2/a.jar"],
modulePaths: [],
pathListSeparator: ":",
javaHome: "/jdk21",
javaExec: "/jdk21/bin/java",
shortenCommandLine,
+73
Переглянути файл
@@ -0,0 +1,73 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import type { JavaLaunchInfo, RunConfig } from "@/platform/ipc";
import { resolveJavaCommand } from "@/platform/javaLaunch";
const ipc = vi.hoisted(() => ({
javaResolveLaunch: vi.fn(),
javaDebugServer: vi.fn(async () => ({ status: "ok", data: 5005 })),
fsReadDir: vi.fn(async () => ({ status: "ok", data: [] })),
}));
vi.mock("@/platform/ipc", async (importOriginal) => ({
...(await importOriginal<typeof import("@/platform/ipc")>()),
commands: ipc,
}));
import { javaLaunchConfig } from "../java";
const config: RunConfig = {
id: "main",
name: "Main",
kind: "application",
command: "java",
args: ["-cp", "${classpath}", "Main"],
cwd: null,
env: {},
detected: false,
isTest: false,
debugAdapter: null,
};
afterEach(() => vi.restoreAllMocks());
const hosts = [
{ client: "Win32", host: "Linux", separator: ":", paths: ["/p/classes", "/lib/a;b.jar"] },
{ client: "MacIntel", host: "Windows", separator: ";", paths: ["C:\\p\\classes", "D:\\lib\\a.jar"] },
{ client: "MacIntel", host: "Mac", separator: ":", paths: ["/p/classes", "/lib/a.jar"] },
{ client: "Win32", host: "Windows", separator: ";", paths: ["C:\\p\\classes", "D:\\lib\\a.jar"] },
{ client: "Linux x86_64", host: "Linux", separator: ":", paths: ["/p/classes", "/lib/a.jar"] },
];
describe.each(hosts)("Java launch on $host from $client", ({ client, separator, paths }) => {
const info: JavaLaunchInfo = {
build: "succeeded",
projectRoot: null,
classPaths: paths,
modulePaths: paths,
pathListSeparator: separator,
javaHome: null,
javaExec: "java",
shortenCommandLine: null,
errors: [],
errorCount: 0,
hints: [],
};
it.each(["${classpath}", "${testClasspath}"])("joins %s and module paths using the host separator", (placeholder) => {
vi.spyOn(navigator, "platform", "get").mockReturnValue(client);
const result = resolveJavaCommand({ ...config, args: ["-cp", placeholder, "Main"] }, info);
expect(result.args).toEqual(["--module-path", paths.join(separator), "-cp", paths.join(separator), "Main"]);
});
it.each(["java-debug", "kotlin-debug-adapter"])(
"splits explicit classpaths for %s without damaging paths",
async (adapter) => {
vi.spyOn(navigator, "platform", "get").mockReturnValue(client);
ipc.javaResolveLaunch.mockResolvedValue({ status: "ok", data: info });
const result = await javaLaunchConfig(
{ ...config, debugAdapter: adapter, args: ["-cp", paths.join(separator), "Main"] },
"/p",
);
expect(JSON.parse(result.extraJson!).classPaths).toEqual(paths);
},
);
});
+3 -1
Переглянути файл
@@ -107,7 +107,9 @@ export async function javaLaunchConfig(
const resolved = resolveJavaCommand(rc, info);
const kotlin = rc.debugAdapter === KOTLIN_ADAPTER || (await moduleHasKotlinSources(join(root, module)));
preparation?.signal.throwIfAborted();
const classPaths = parsed.explicitClasspath ? parsed.explicitClasspath.split(/[:;]/) : info.classPaths;
const classPaths = parsed.explicitClasspath
? parsed.explicitClasspath.split(info.pathListSeparator)
: info.classPaths;
if (kotlin) {
return {
name: rc.name,