Skip to content

将 "Add Java" 的行为更改为选择一个目录后, 在目录中递归搜索并添加所有 Java - #3494

Closed
ri-fumo wants to merge 16 commits into
HMCL-dev:mainfrom
ri-fumo:add-java-by-search
Closed

将 "Add Java" 的行为更改为选择一个目录后, 在目录中递归搜索并添加所有 Java#3494
ri-fumo wants to merge 16 commits into
HMCL-dev:mainfrom
ri-fumo:add-java-by-search

Conversation

@ri-fumo

@ri-fumo ri-fumo commented Dec 13, 2024

Copy link
Copy Markdown

#3492
如果选择的是某个 Java Home 或 bin 目录, 则认为选择了单个 Java

目录搜索递归层数限制为3层
由于增加按钮会导致过于拥挤, 所以直接更改了 "Add Java" 的行为

另外, i18n 中俄语 西班牙语 日语的翻译可能有误, 需要校正

@burningtnt

Copy link
Copy Markdown
Member

新的代码请尽量使用 java.nio.Path 替换 java.io.File。

@Glavo

Glavo commented Dec 28, 2024

Copy link
Copy Markdown
Member

我不是特别喜欢递归搜索,感觉改成支持多选就可以了

@burningtnt

Copy link
Copy Markdown
Member

递归搜索可以让玩家一次添加多个 Java / 不需要准确选中 java 可执行文件

@ri-fumo

ri-fumo commented Feb 28, 2025

Copy link
Copy Markdown
Author

我刚刚发现 idea 添加 sdk 页面也是单个添加,但是选中的是 JavaHome 目录。

我参考的是我之前用的 eclipse,其中的 jre 是可以递归搜索来添加的,也可以选中单个 JavaHome 来添加。

@Glavo Glavo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

实现的太奇怪了……

return new Task<List<JavaRuntime>>() {

private final Path dir = directory;
{ setName("Search Java"); }

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

要用 taskDialog 显示出来的 Task 请在 TaskListPane 中对名称实现本地化,而不是这样 setName

setResult(searchJava());
}

private List<JavaRuntime> searchJava() throws IOException, InterruptedException {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么不用 Files.walkFileTree 来遍历,或者直接递归实现?

if (dir == null) return;

var file = dir.resolve(OperatingSystem.CURRENT_OS.getJavaExecutable());
file = Files.exists(file) ? file

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不要这样用三元表达式,看的头疼。这里老老实实用 if 就行了。


private void onSearchAndAddJavaBinary(Path directory) {
Controllers.taskDialog(
JavaManager.getSearchAndAddJavaTask(directory).thenAcceptAsync(Schedulers.javafx(), javaRuntimes -> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请用 whenComplete(Executor, FinalizedCallbackWithResult<T>) 来处理结果。

而且你这个 getSearchAndAddJavaTask 设计的过于诡异了。

“任务失败,但还是执行了有副作用的操作”这种事是需要避免的。如果一个任务可以部分成功部分失败,那么请将这种信息写到返回值里,而不是抛异常来解决。

}).whenComplete(Schedulers.javafx(), exception -> {
if (exception instanceof UnsupportedPlatformException) {
LOG.warning("Failed to add java", exception);
Controllers.dialog(i18n("java.add.failed.some"), i18n("message.error"), MessageDialogPane.MessageType.ERROR);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 任务部分失败应当是 warning,而不是 error;
  2. 这样汇报错误过于粗糙,没有区分任务究竟是部分失败还是全部失败,也没有给出哪些 Java 添加失败了这样的信息。
  3. 我觉得只有在全部失败的情况下才有必要弹窗汇报给用户,部分成功的情况下不弹窗提示也是可以的。像这样弹一个非常粗糙的报错完全没有必要。

@Glavo

Glavo commented Mar 29, 2026

Copy link
Copy Markdown
Member

我先关闭了吧。

@Glavo Glavo closed this Mar 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants