дзеркало
https://github.com/l0ng-ai/openidea.git
синхронізовано 2026-11-08 19:02:17 +02:00
fix(java): use the project host classpath separator (#492)
Цей коміт міститься в:
1 джерело
f9a7c68897
коміт
4a620122e8
9 files changed
+119
-12
No files matched your search
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
},
|
||||
);
|
||||
});
|
||||
@@ -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,
|
||||
|
||||
Reference in new issue
Заблокувати користувача