From 2ef6037d34ded6a41a3ea19c72e51cc65710d87a Mon Sep 17 00:00:00 2001 From: wenytang-ms Date: Tue, 28 Apr 2026 13:57:55 +0800 Subject: [PATCH 1/4] perf: use incremental build by default --- package.nls.json | 4 ++-- package.nls.zh-cn.json | 6 +++--- package.nls.zh-tw.json | 8 ++++---- src/tasks/build/buildTaskProvider.ts | 5 ++++- src/views/dependencyDataProvider.ts | 6 +++--- test/suite/buildTask.test.ts | 1 + 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/package.nls.json b/package.nls.json index a163a415..ee44119b 100644 --- a/package.nls.json +++ b/package.nls.json @@ -6,9 +6,9 @@ "contributes.commands.java.project.addLibraryFolders": "Add Library Folders to Project Classpath...", "contributes.commands.java.project.removeLibrary": "Remove from Project Classpath", "contributes.commands.java.view.package.refresh": "Refresh", - "contributes.commands.java.project.build.workspace": "Rebuild All", + "contributes.commands.java.project.build.workspace": "Build All", "contributes.commands.java.project.clean.workspace": "Clean Workspace", - "contributes.commands.java.project.rebuild": "Rebuild Project", + "contributes.commands.java.project.rebuild": "Build Project", "contributes.commands.java.project.update": "Reload Project", "contributes.commands.java.project.reloadProjectFromActiveFile": "Reload Java Project", "contributes.commands.java.view.package.revealInProjectExplorer": "Reveal in Java Project Explorer", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index c962108c..2118aa49 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -6,9 +6,9 @@ "contributes.commands.java.project.addLibraryFolders": "添加文件夹至项目 Classpath...", "contributes.commands.java.project.removeLibrary": "从项目 Classpath 中移除", "contributes.commands.java.view.package.refresh": "刷新", - "contributes.commands.java.project.build.workspace": "重新构建所有项目", + "contributes.commands.java.project.build.workspace": "构建所有项目", "contributes.commands.java.project.clean.workspace": "清理工作空间", - "contributes.commands.java.project.rebuild": "重新构建项目", + "contributes.commands.java.project.rebuild": "构建项目", "contributes.commands.java.project.update": "重新加载项目", "contributes.commands.java.project.reloadProjectFromActiveFile": "重新加载 Java 项目", "contributes.commands.java.view.package.revealInProjectExplorer": "在 Java 项目视图中显示", @@ -56,7 +56,7 @@ "taskDefinitions.java.project.build.path": "被构建项目的根目录路径。绝对路径或者相对于工作空间目录的相对路径都可以使用。", "taskDefinitions.java.project.build.path.workspace": "工作空间中的所有项目。", "taskDefinitions.java.project.build.path.exclude": "'!' 后的路径将会从待构建项目路径中移除。", - "taskDefinitions.java.project.build.isFullBuild": "是否要重新构建项目。", + "taskDefinitions.java.project.build.isFullBuild": "是否要执行清理构建。", "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:_java.project.create.from.fileexplorer.welcome)", "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:_java.project.create.from.javaprojectexplorer.welcome)", "viewsWelcome.workbench.importFailed": "加载 Java 项目时出现错误,请通过以下方式查看错误相关信息:\n[打开问题视图](command:workbench.panel.markers.view.focus)", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index e5de9002..f47382a3 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -6,9 +6,9 @@ "contributes.commands.java.project.addLibraryFolders": "新增資料夾至專案 Classpath...", "contributes.commands.java.project.removeLibrary": "從專案 Classpath 中移除", "contributes.commands.java.view.package.refresh": "重新整理", - "contributes.commands.java.project.build.workspace": "重新建置所有專案", + "contributes.commands.java.project.build.workspace": "建置所有專案", "contributes.commands.java.project.clean.workspace": "清理工作區", - "contributes.commands.java.project.rebuild": "重新建置專案", + "contributes.commands.java.project.rebuild": "建置專案", "contributes.commands.java.project.update": "重新載入專案", "contributes.commands.java.project.reloadProjectFromActiveFile": "重新載入 Java 專案", "contributes.commands.java.view.package.revealInProjectExplorer": "在 Java 專案視圖中顯示", @@ -48,10 +48,10 @@ "taskDefinitions.java.project.build.path": "被建置專案的根目錄路徑。絕對路徑或者相對於工作區目錄的相對路徑都可以使用。", "taskDefinitions.java.project.build.path.workspace": "工作區中的所有專案。", "taskDefinitions.java.project.build.path.exclude": "'!' 後的路徑將會從待建置專案路徑中移除。", - "taskDefinitions.java.project.build.isFullBuild": "是否要重新建置專案。", + "taskDefinitions.java.project.build.isFullBuild": "是否要執行清理建置。", "viewsWelcome.workbench.createNewJavaProject": "您也可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:_java.project.create.from.fileexplorer.welcome)", "viewsWelcome.workbench.noJavaProject": "當前工作區未發現 Java 專案,您可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:_java.project.create.from.javaprojectexplorer.welcome)", "viewsWelcome.workbench.importFailed": "加載 Java 專案時出現錯誤,請通過以下方式查看錯誤相關信息:\n[打開問題視圖](command:workbench.panel.markers.view.focus)", "viewsWelcome.workbench.inLightWeightMode": "若要檢視各專案,你可以將專案匯入到工作區中。\n[匯入專案](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", "viewsWelcome.workbench.installLanguageSupport": "Java 專案視圖需要安裝並啟用 [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) 以提供完整的功能。\n[安裝](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" -} \ No newline at end of file +} diff --git a/src/tasks/build/buildTaskProvider.ts b/src/tasks/build/buildTaskProvider.ts index 6844d68b..ef908fe0 100644 --- a/src/tasks/build/buildTaskProvider.ts +++ b/src/tasks/build/buildTaskProvider.ts @@ -28,7 +28,7 @@ export class BuildTaskProvider implements TaskProvider { const defaultTaskDefinition = { type: BuildTaskProvider.type, paths: [ BuildTaskProvider.workspace ], - isFullBuild: true, + isFullBuild: false, }; const defaultTask = new Task( defaultTaskDefinition, @@ -58,6 +58,9 @@ export class BuildTaskProvider implements TaskProvider { .filter(Boolean); task.definition = taskDefinition; } + if (taskDefinition.isFullBuild === undefined) { + taskDefinition.isFullBuild = false; + } task.execution = new CustomExecution(async (resolvedDefinition: IBuildTaskDefinition): Promise => { return new BuildTaskTerminal(resolvedDefinition, task.scope ?? TaskScope.Workspace); }); diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 0a1ec956..42584db2 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -60,7 +60,7 @@ export class DependencyDataProvider implements TreeDataProvider { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_OUTLINE, (uri, range) => window.showTextDocument(Uri.parse(uri), { selection: range }))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_BUILD_WORKSPACE, () => - commands.executeCommand(Commands.JAVA_BUILD_WORKSPACE, true /*fullCompile*/))); + commands.executeCommand(Commands.JAVA_BUILD_WORKSPACE, false /*fullCompile*/))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CLEAN_WORKSPACE, () => commands.executeCommand(Commands.JAVA_CLEAN_WORKSPACE))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_UPDATE, async (node: INodeData) => { @@ -78,10 +78,10 @@ export class DependencyDataProvider implements TreeDataProvider { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REBUILD, async (node: INodeData) => { if (!node.uri) { sendError(new Error("Uri not available when building project")); - window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Rebuild Projects' from Command Palette."); + window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Build Project' from Command Palette."); return; } - commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), true); + commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), false /*isFullBuild*/); })); this.setRefreshDebounceFunc(); diff --git a/test/suite/buildTask.test.ts b/test/suite/buildTask.test.ts index a861f73a..61dd2248 100644 --- a/test/suite/buildTask.test.ts +++ b/test/suite/buildTask.test.ts @@ -22,6 +22,7 @@ suite("Build Task Tests", () => { && t.source === BuildTaskProvider.type; }); assert.ok(exportJarTask !== undefined); + assert.strictEqual(exportJarTask.definition.isFullBuild, false); }); test("test categorizePaths()", async function() { From 389e4f13bbd57c95ffa5f7113341a49d1e26c471 Mon Sep 17 00:00:00 2001 From: wenytang-ms Date: Tue, 28 Apr 2026 14:10:06 +0800 Subject: [PATCH 2/4] chore: update --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 31225282..0880379d 100644 --- a/package.json +++ b/package.json @@ -1075,7 +1075,7 @@ }, "isFullBuild": { "type": "boolean", - "default": "true", + "default": false, "description": "%taskDefinitions.java.project.build.isFullBuild%" } } From b3423642f760532df89ac1e66b3e6554a72ac15a Mon Sep 17 00:00:00 2001 From: wenytang-ms Date: Tue, 28 Apr 2026 14:46:51 +0800 Subject: [PATCH 3/4] perf: add rebuild --- package.json | 16 +++++++++++++++- package.nls.json | 4 +++- package.nls.zh-cn.json | 4 +++- package.nls.zh-tw.json | 4 +++- src/commands.ts | 4 ++++ src/views/dependencyDataProvider.ts | 12 +++++++++++- 6 files changed, 39 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0880379d..41d9d0c9 100644 --- a/package.json +++ b/package.json @@ -162,6 +162,15 @@ "title": "%contributes.commands.java.project.build.workspace%", "icon": "$(tools)" }, + { + "command": "java.project.rebuild.workspace", + "title": "%contributes.commands.java.project.rebuild.workspace%", + "icon": "$(refresh)" + }, + { + "command": "java.project.build.project", + "title": "%contributes.commands.java.project.build.project%" + }, { "command": "java.project.clean.workspace", "title": "%contributes.commands.java.project.clean.workspace%" @@ -732,6 +741,11 @@ "when": "view == javaProjectExplorer && java:serverMode == Standard && config.java.project.explorer.showNonJavaResources", "group": "overflow_10@30" }, + { + "command": "java.project.rebuild.workspace", + "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects && !java:importFailed", + "group": "overflow_20@5" + }, { "command": "java.project.clean.workspace", "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", @@ -790,7 +804,7 @@ "group": "7_modification@20" }, { - "command": "java.project.build.workspace", + "command": "java.project.build.project", "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", "group": "8_execution@5" }, diff --git a/package.nls.json b/package.nls.json index ee44119b..ba8bf485 100644 --- a/package.nls.json +++ b/package.nls.json @@ -7,8 +7,10 @@ "contributes.commands.java.project.removeLibrary": "Remove from Project Classpath", "contributes.commands.java.view.package.refresh": "Refresh", "contributes.commands.java.project.build.workspace": "Build All", + "contributes.commands.java.project.rebuild.workspace": "Rebuild All", + "contributes.commands.java.project.build.project": "Build Project", "contributes.commands.java.project.clean.workspace": "Clean Workspace", - "contributes.commands.java.project.rebuild": "Build Project", + "contributes.commands.java.project.rebuild": "Rebuild Project", "contributes.commands.java.project.update": "Reload Project", "contributes.commands.java.project.reloadProjectFromActiveFile": "Reload Java Project", "contributes.commands.java.view.package.revealInProjectExplorer": "Reveal in Java Project Explorer", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 2118aa49..c7b0b8ab 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -7,8 +7,10 @@ "contributes.commands.java.project.removeLibrary": "从项目 Classpath 中移除", "contributes.commands.java.view.package.refresh": "刷新", "contributes.commands.java.project.build.workspace": "构建所有项目", + "contributes.commands.java.project.rebuild.workspace": "重新构建所有项目", + "contributes.commands.java.project.build.project": "构建项目", "contributes.commands.java.project.clean.workspace": "清理工作空间", - "contributes.commands.java.project.rebuild": "构建项目", + "contributes.commands.java.project.rebuild": "重新构建项目", "contributes.commands.java.project.update": "重新加载项目", "contributes.commands.java.project.reloadProjectFromActiveFile": "重新加载 Java 项目", "contributes.commands.java.view.package.revealInProjectExplorer": "在 Java 项目视图中显示", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index f47382a3..cfa7462d 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -7,8 +7,10 @@ "contributes.commands.java.project.removeLibrary": "從專案 Classpath 中移除", "contributes.commands.java.view.package.refresh": "重新整理", "contributes.commands.java.project.build.workspace": "建置所有專案", + "contributes.commands.java.project.rebuild.workspace": "重新建置所有專案", + "contributes.commands.java.project.build.project": "建置專案", "contributes.commands.java.project.clean.workspace": "清理工作區", - "contributes.commands.java.project.rebuild": "建置專案", + "contributes.commands.java.project.rebuild": "重新建置專案", "contributes.commands.java.project.update": "重新載入專案", "contributes.commands.java.project.reloadProjectFromActiveFile": "重新載入 Java 專案", "contributes.commands.java.view.package.revealInProjectExplorer": "在 Java 專案視圖中顯示", diff --git a/src/commands.ts b/src/commands.ts index 572a81c7..50ecc6a9 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -98,6 +98,10 @@ export namespace Commands { export const JAVA_PROJECT_BUILD_WORKSPACE = "java.project.build.workspace"; + export const JAVA_PROJECT_REBUILD_WORKSPACE = "java.project.rebuild.workspace"; + + export const JAVA_PROJECT_BUILD_PROJECT = "java.project.build.project"; + export const JAVA_PROJECT_CLEAN_WORKSPACE = "java.project.clean.workspace"; export const JAVA_PROJECT_UPDATE = "java.project.update"; diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 42584db2..6977a00c 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -61,6 +61,8 @@ export class DependencyDataProvider implements TreeDataProvider { window.showTextDocument(Uri.parse(uri), { selection: range }))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_BUILD_WORKSPACE, () => commands.executeCommand(Commands.JAVA_BUILD_WORKSPACE, false /*fullCompile*/))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REBUILD_WORKSPACE, () => + commands.executeCommand(Commands.JAVA_BUILD_WORKSPACE, true /*fullCompile*/))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CLEAN_WORKSPACE, () => commands.executeCommand(Commands.JAVA_CLEAN_WORKSPACE))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_UPDATE, async (node: INodeData) => { @@ -75,7 +77,7 @@ export class DependencyDataProvider implements TreeDataProvider { commands.executeCommand(Commands.JAVA_PROJECT_CONFIGURATION_UPDATE, uris[0]); } })); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REBUILD, async (node: INodeData) => { + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_BUILD_PROJECT, async (node: INodeData) => { if (!node.uri) { sendError(new Error("Uri not available when building project")); window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Build Project' from Command Palette."); @@ -83,6 +85,14 @@ export class DependencyDataProvider implements TreeDataProvider { } commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), false /*isFullBuild*/); })); + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REBUILD, async (node: INodeData) => { + if (!node.uri) { + sendError(new Error("Uri not available when rebuilding project")); + window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Rebuild Project' from Command Palette."); + return; + } + commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), true /*isFullBuild*/); + })); this.setRefreshDebounceFunc(); } From 83ce062c539d6c8f4e0eb2dfd4043520b8dc265e Mon Sep 17 00:00:00 2001 From: wenytang-ms Date: Tue, 28 Apr 2026 15:27:07 +0800 Subject: [PATCH 4/4] fix:comments --- package.json | 6 ++++-- src/views/dependencyDataProvider.ts | 4 ++-- test/suite/buildTask.test.ts | 12 ++++++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 41d9d0c9..aa3c84ce 100644 --- a/package.json +++ b/package.json @@ -169,7 +169,8 @@ }, { "command": "java.project.build.project", - "title": "%contributes.commands.java.project.build.project%" + "title": "%contributes.commands.java.project.build.project%", + "category": "Java" }, { "command": "java.project.clean.workspace", @@ -187,7 +188,8 @@ }, { "command": "java.project.rebuild", - "title": "%contributes.commands.java.project.rebuild%" + "title": "%contributes.commands.java.project.rebuild%", + "category": "Java" }, { "command": "java.view.package.revealInProjectExplorer", diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 6977a00c..626af103 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -83,7 +83,7 @@ export class DependencyDataProvider implements TreeDataProvider { window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Build Project' from Command Palette."); return; } - commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), false /*isFullBuild*/); + return commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), false /*isFullBuild*/); })); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REBUILD, async (node: INodeData) => { if (!node.uri) { @@ -91,7 +91,7 @@ export class DependencyDataProvider implements TreeDataProvider { window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Rebuild Project' from Command Palette."); return; } - commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), true /*isFullBuild*/); + return commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), true /*isFullBuild*/); })); this.setRefreshDebounceFunc(); diff --git a/test/suite/buildTask.test.ts b/test/suite/buildTask.test.ts index 61dd2248..d8596356 100644 --- a/test/suite/buildTask.test.ts +++ b/test/suite/buildTask.test.ts @@ -25,6 +25,18 @@ suite("Build Task Tests", () => { assert.strictEqual(exportJarTask.definition.isFullBuild, false); }); + test("test resolving build task defaults to incremental build", async function() { + const task: Task = new Task({ + type: BuildTaskProvider.type, + paths: [ BuildTaskProvider.workspace ], + }, TaskScope.Workspace, BuildTaskProvider.defaultTaskName, BuildTaskProvider.type); + + const resolvedTask: Task | undefined = await new BuildTaskProvider().resolveTask(task); + + assert.ok(resolvedTask !== undefined); + assert.strictEqual(resolvedTask.definition.isFullBuild, false); + }); + test("test categorizePaths()", async function() { const [includes, excludes, invalid] = categorizePaths([ BuildTaskProvider.workspace,