From bed74dc66c8339adea51eaef42667fae79a0b54f Mon Sep 17 00:00:00 2001 From: Glavo Date: Fri, 30 Dec 2022 17:00:10 +0800 Subject: [PATCH] fix find HMCL directory (#1953) --- .../java/org/jackhuang/hmcl/Launcher.java | 2 +- .../java/org/jackhuang/hmcl/Metadata.java | 22 +++++++++++++++++- .../jackhuang/hmcl/setting/ConfigHolder.java | 23 ------------------- .../hmcl/util/platform/OperatingSystem.java | 14 ++++------- README.md | 23 ++++++++++--------- README_cn.md | 23 ++++++++++--------- 6 files changed, 50 insertions(+), 57 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index e5aecd613..03b1f60a7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -118,7 +118,7 @@ public final class Launcher extends Application { return; } - if (Metadata.HMCL_DIRECTORY.toAbsolutePath().toString().indexOf('=') >= 0) { + if (Metadata.HMCL_DIRECTORY.toString().indexOf('=') >= 0) { Main.showWarningAndContinue(i18n("fatal.illegal_char")); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Metadata.java b/HMCL/src/main/java/org/jackhuang/hmcl/Metadata.java index f24a2d476..d047cf1d4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Metadata.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Metadata.java @@ -17,10 +17,12 @@ */ package org.jackhuang.hmcl; +import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.io.JarUtils; import org.jackhuang.hmcl.util.platform.OperatingSystem; import java.nio.file.Path; +import java.nio.file.Paths; /** * Stores metadata about this application. @@ -45,7 +47,25 @@ public final class Metadata { public static final String BUILD_CHANNEL = JarUtils.getManifestAttribute("Build-Channel", "nightly"); public static final Path MINECRAFT_DIRECTORY = OperatingSystem.getWorkingDirectory("minecraft"); - public static final Path HMCL_DIRECTORY = OperatingSystem.getWorkingDirectory("hmcl"); + public static final Path HMCL_DIRECTORY; + + static { + String hmclHome = System.getProperty("hmcl.home"); + if (hmclHome == null) { + if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { + String xdgData = System.getenv("XDG_DATA_HOME"); + if (StringUtils.isNotBlank(xdgData)) { + HMCL_DIRECTORY = Paths.get(xdgData, "hmcl").toAbsolutePath(); + } else { + HMCL_DIRECTORY = Paths.get(System.getProperty("user.home", "."), ".local", "share", "hmcl").toAbsolutePath(); + } + } else { + HMCL_DIRECTORY = OperatingSystem.getWorkingDirectory("hmcl"); + } + } else { + HMCL_DIRECTORY = Paths.get(hmclHome).toAbsolutePath().normalize(); + } + } public static boolean isStable() { return "stable".equals(BUILD_CHANNEL); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java index 17342bcd7..f39bf3cca 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java @@ -22,7 +22,6 @@ import com.google.gson.JsonParseException; import org.jackhuang.hmcl.Metadata; import org.jackhuang.hmcl.util.InvocationDispatcher; import org.jackhuang.hmcl.util.Lang; -import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.platform.OperatingSystem; @@ -208,28 +207,6 @@ public final class ConfigHolder { // Global Config private static GlobalConfig loadGlobalConfig() throws IOException { - // Migrate from old directory - if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX && Files.notExists(GLOBAL_CONFIG_PATH)) { - Path oldHome; - String xdgCache = System.getenv("XDG_CACHE_HOME"); - if (StringUtils.isNotBlank(xdgCache)) { - oldHome = Paths.get(xdgCache, "hmcl"); - } else { - oldHome = Paths.get(System.getProperty("user.home", "."), ".cache", "hmcl"); - } - - if (Files.exists(oldHome)) { - Path oldConfigPath = oldHome.resolve("config.json"); - if (Files.isRegularFile(oldConfigPath)) { - try { - Files.copy(oldConfigPath, GLOBAL_CONFIG_PATH); - } catch (IOException e) { - LOG.log(Level.WARNING, "Failed to migrate global config", e); - } - } - } - } - if (Files.exists(GLOBAL_CONFIG_PATH)) { try { String content = FileUtils.readText(GLOBAL_CONFIG_PATH); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/OperatingSystem.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/OperatingSystem.java index 1fe9021eb..724a7bce5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/OperatingSystem.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/OperatingSystem.java @@ -17,8 +17,6 @@ */ package org.jackhuang.hmcl.util.platform; -import org.jackhuang.hmcl.util.StringUtils; - import java.io.BufferedReader; import java.io.File; import java.io.IOException; @@ -276,18 +274,14 @@ public enum OperatingSystem { String home = System.getProperty("user.home", "."); switch (OperatingSystem.CURRENT_OS) { case LINUX: - String xdgData = System.getenv("XDG_DATA_HOME"); - if (StringUtils.isNotBlank(xdgData)) { - return Paths.get(xdgData, folder); - } - return Paths.get(home, ".local", "share", folder); + return Paths.get(home, "." + folder).toAbsolutePath(); case WINDOWS: String appdata = System.getenv("APPDATA"); - return Paths.get(appdata == null ? home : appdata, "." + folder); + return Paths.get(appdata == null ? home : appdata, "." + folder).toAbsolutePath(); case OSX: - return Paths.get(home, "Library", "Application Support", folder); + return Paths.get(home, "Library", "Application Support", folder).toAbsolutePath(); default: - return Paths.get(home, folder); + return Paths.get(home, folder).toAbsolutePath(); } } diff --git a/README.md b/README.md index 0aff0bd91..0c7d63fc8 100644 --- a/README.md +++ b/README.md @@ -50,15 +50,16 @@ Simply execute the following command in project root directory: Make sure you have Java installed with JavaFX 8 at least. Liberica Full JDK 8 or later is recommended. ## JVM Options (for debugging) -| Parameter | Description | -| -------------------------------------------- | ------------------------------------------------------------ | -| `-Dhmcl.self_integrity_check.disable=true` | Bypass the self integrity check when checking for update. | +| Parameter | Description | +|----------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| +| `-Dhmcl.home=` | Override HMCL directory. | +| `-Dhmcl.self_integrity_check.disable=true` | Bypass the self integrity check when checking for update. | | `-Dhmcl.bmclapi.override=` | Override API Root of BMCLAPI download provider, defaults to `https://bmclapi2.bangbang93.com`. e.g. `https://download.mcbbs.net`. | -| `-Dhmcl.font.override=` | Override font family. | -| `-Dhmcl.version.override=` | Override the version number. | -| `-Dhmcl.update_source.override=` | Override the update source. | -| `-Dhmcl.authlibinjector.location=` | Use specified authlib-injector (instead of downloading one). | -| `-Dhmcl.openjfx.repo=` | Add custom Maven repository for download OpenJFX. | -| `-Dhmcl.native.encoding=` | Override the native encoding. | -| `-Dhmcl.microsoft.auth.id=` | Override Microsoft OAuth App ID. | -| `-Dhmcl.microsoft.auth.secret=` | Override Microsoft OAuth App secret. | +| `-Dhmcl.font.override=` | Override font family. | +| `-Dhmcl.version.override=` | Override the version number. | +| `-Dhmcl.update_source.override=` | Override the update source. | +| `-Dhmcl.authlibinjector.location=` | Use specified authlib-injector (instead of downloading one). | +| `-Dhmcl.openjfx.repo=` | Add custom Maven repository for download OpenJFX. | +| `-Dhmcl.native.encoding=` | Override the native encoding. | +| `-Dhmcl.microsoft.auth.id=` | Override Microsoft OAuth App ID. | +| `-Dhmcl.microsoft.auth.secret=` | Override Microsoft OAuth App secret. | diff --git a/README_cn.md b/README_cn.md index f6ab0a907..c7762e147 100644 --- a/README_cn.md +++ b/README_cn.md @@ -48,15 +48,16 @@ HMCL 有着强大的跨平台能力。它不仅支持 Windows、Linux、macOS 请确保您至少安装了含有 JavaFX 8 的 Java. 建议使用 Liberica Full JDK 8 或更高版本. ## JVM 选项 (用于调试) -| 参数 | 简介 | -| -------------------------------------------- | ------------------------------------------- | -| `-Dhmcl.self_integrity_check.disable=true` | 检查更新时绕过本体完整性检查. | +| 参数 | 简介 | +|----------------------------------------------|-------------------------------------------------------------------------------------------------| +| `-Dhmcl.home=` | 覆盖 HMCL 数据文件夹. | +| `-Dhmcl.self_integrity_check.disable=true` | 检查更新时绕过本体完整性检查. | | `-Dhmcl.bmclapi.override=` | 覆盖 BMCLAPI 的 API Root, 默认值为 `https://bmclapi2.bangbang93.com`. 例如 `https://download.mcbbs.net`. | -| `-Dhmcl.font.override=` | 覆盖字族. | -| `-Dhmcl.version.override=` | 覆盖版本号. | -| `-Dhmcl.update_source.override=` | 覆盖更新源. | -| `-Dhmcl.authlibinjector.location=` | 使用指定的 authlib-injector (而非下载一个). | -| `-Dhmcl.openjfx.repo=` | 添加用于下载 OpenJFX 的自定义 Maven 仓库 | -| `-Dhmcl.native.encoding=` | 覆盖原生编码. | -| `-Dhmcl.microsoft.auth.id=` | 覆盖 Microsoft OAuth App ID. | -| `-Dhmcl.microsoft.auth.secret=` | 覆盖 Microsoft OAuth App 密钥. | +| `-Dhmcl.font.override=` | 覆盖字族. | +| `-Dhmcl.version.override=` | 覆盖版本号. | +| `-Dhmcl.update_source.override=` | 覆盖更新源. | +| `-Dhmcl.authlibinjector.location=` | 使用指定的 authlib-injector (而非下载一个). | +| `-Dhmcl.openjfx.repo=` | 添加用于下载 OpenJFX 的自定义 Maven 仓库 | +| `-Dhmcl.native.encoding=` | 覆盖原生编码. | +| `-Dhmcl.microsoft.auth.id=` | 覆盖 Microsoft OAuth App ID. | +| `-Dhmcl.microsoft.auth.secret=` | 覆盖 Microsoft OAuth App 密钥. |