From 898f2352b9f31c074f8a87c717912ad3c950c266 Mon Sep 17 00:00:00 2001 From: ayuayue <1401262639@qq.com> Date: Sun, 15 Mar 2026 23:08:52 +0800 Subject: [PATCH] issue-248: XDG dirs and agent path fixes Fixes #248 --- debug-tools-attach/pom.xml | 8 +- .../debug/tools/base/config/AgentConfig.java | 6 +- .../base/constants/ProjectConstants.java | 2 +- .../tools/base/utils/DebugToolsFileUtils.java | 7 +- .../tools/base/utils/DebugToolsLibUtils.java | 9 +- .../tools/base/utils/DebugToolsPathUtils.java | 122 ++++++++++++++++++ 6 files changed, 140 insertions(+), 14 deletions(-) create mode 100644 debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsPathUtils.java diff --git a/debug-tools-attach/pom.xml b/debug-tools-attach/pom.xml index dcf966de..ed44584d 100644 --- a/debug-tools-attach/pom.xml +++ b/debug-tools-attach/pom.xml @@ -213,7 +213,7 @@ - + @@ -227,9 +227,9 @@ - + @@ -248,4 +248,4 @@ - \ No newline at end of file + diff --git a/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/config/AgentConfig.java b/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/config/AgentConfig.java index d08daa34..28d85978 100644 --- a/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/config/AgentConfig.java +++ b/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/config/AgentConfig.java @@ -21,6 +21,7 @@ import io.github.future0923.debug.tools.base.logging.Logger; import io.github.future0923.debug.tools.base.utils.DebugToolsFileUtils; import io.github.future0923.debug.tools.base.utils.DebugToolsLibUtils; +import io.github.future0923.debug.tools.base.utils.DebugToolsPathUtils; import io.github.future0923.debug.tools.base.utils.DebugToolsStringUtils; import java.io.File; @@ -62,8 +63,8 @@ public class AgentConfig { private boolean isUpgrade; private AgentConfig() { - String homeDir = System.getProperty("user.home"); - propertiesFile = new File(homeDir + File.separator + ProjectConstants.NAME + File.separator + FILE_NAME); + File cacheDir = DebugToolsPathUtils.getCacheDir(); + propertiesFile = new File(cacheDir, FILE_NAME); if (!propertiesFile.exists()) { DebugToolsFileUtils.touch(propertiesFile); } @@ -314,3 +315,4 @@ private boolean shouldDeleteFile(File file, String currentVersion) { return isExtensionJar || isAgentJar || isJniLib; } } + diff --git a/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/constants/ProjectConstants.java b/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/constants/ProjectConstants.java index 137b2444..5358c9de 100644 --- a/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/constants/ProjectConstants.java +++ b/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/constants/ProjectConstants.java @@ -35,7 +35,7 @@ public interface ProjectConstants { String CONFIG_FILE = "debug-tools.properties"; - String AUTO_ATTACH_FLAG_FILE = NAME + "/auto_attach.txt"; + String AUTO_ATTACH_FLAG_FILE = "auto_attach.txt"; String PROJECT_PACKAGE_PREFIX = "io.github.future0923.debug.tools"; diff --git a/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsFileUtils.java b/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsFileUtils.java index 1bb47ed5..0beb25d3 100644 --- a/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsFileUtils.java +++ b/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsFileUtils.java @@ -134,7 +134,7 @@ public static File getTmpLibFile(InputStream inputStream, String prefix, String private static File createTempDir() { File tempDir = DebugToolsLibUtils.getDebugToolsLibDir(); if (!tempDir.exists()) { - if (!tempDir.mkdir()) { + if (!mkdirsSafely(tempDir, 5, 1)) { throw new IllegalStateException("Failed to create directory within " + tempDir); } } @@ -528,7 +528,10 @@ public static File write(File file, byte[] data, int off, int len, boolean isApp * 获取自动附加文件 */ public static File getAutoAttachFile() { - return FileUtil.touch(FileUtil.getUserHomePath() + "/" + ProjectConstants.AUTO_ATTACH_FLAG_FILE); + File configDir = DebugToolsPathUtils.getConfigDir(); + return FileUtil.touch(new File(configDir, ProjectConstants.AUTO_ATTACH_FLAG_FILE).getPath()); } } + + diff --git a/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsLibUtils.java b/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsLibUtils.java index fd6ddf7a..c82d1cbe 100644 --- a/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsLibUtils.java +++ b/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsLibUtils.java @@ -16,6 +16,7 @@ */ package io.github.future0923.debug.tools.base.utils; +import io.github.future0923.debug.tools.base.constants.ProjectConstants; import io.github.future0923.debug.tools.base.logging.AnsiLog; import java.io.File; @@ -31,11 +32,9 @@ public class DebugToolsLibUtils { static { String debugToolsLibDirEnv = System.getenv("DEBUG_TOOLS_HOME_DIR"); + DEBUG_TOOLS_HOME_DIR = DebugToolsPathUtils.getLibHomeDir(); if (debugToolsLibDirEnv != null) { - DEBUG_TOOLS_HOME_DIR = new File(debugToolsLibDirEnv); - AnsiLog.info("DEBUG_TOOLS_LIB_DIR: " + debugToolsLibDirEnv); - } else { - DEBUG_TOOLS_HOME_DIR = new File(System.getProperty("user.home") + File.separator + ".debugTools"); + AnsiLog.info("DEBUG_TOOLS_HOME_DIR: " + debugToolsLibDirEnv); } try { DEBUG_TOOLS_HOME_DIR.mkdirs(); @@ -44,7 +43,7 @@ public class DebugToolsLibUtils { } if (!DEBUG_TOOLS_HOME_DIR.exists()) { // try to set a temp directory - DEBUG_TOOLS_HOME_DIR = new File(System.getProperty("java.io.tmpdir") + File.separator + ".debugTools"); + DEBUG_TOOLS_HOME_DIR = new File(System.getProperty("java.io.tmpdir") + File.separator + ProjectConstants.NAME); try { DEBUG_TOOLS_HOME_DIR.mkdirs(); } catch (Throwable e) { diff --git a/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsPathUtils.java b/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsPathUtils.java new file mode 100644 index 00000000..d7747ca2 --- /dev/null +++ b/debug-tools-base/src/main/java/io/github/future0923/debug/tools/base/utils/DebugToolsPathUtils.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2024-2025 the original author or authors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package io.github.future0923.debug.tools.base.utils; + +import io.github.future0923.debug.tools.base.constants.ProjectConstants; + +import java.io.File; + +/** + * Resolve DebugTools directories with XDG-style layout across platforms. + * + * @author future0923 + */ +public class DebugToolsPathUtils { + + private static final String ENV_DEBUG_TOOLS_HOME_DIR = "DEBUG_TOOLS_HOME_DIR"; + private static final String ENV_XDG_CONFIG_HOME = "XDG_CONFIG_HOME"; + private static final String ENV_XDG_CACHE_HOME = "XDG_CACHE_HOME"; + private static final String ENV_XDG_DATA_HOME = "XDG_DATA_HOME"; + private static final String ENV_XDG_STATE_HOME = "XDG_STATE_HOME"; + + private DebugToolsPathUtils() { + } + + public static File getConfigDir() { + if (!isXdgEnabled()) { + return getLegacyConfigDir(); + } + return resolveXdgDir(ENV_XDG_CONFIG_HOME, ".config"); + } + + public static File getCacheDir() { + if (!isXdgEnabled()) { + return getLegacyConfigDir(); + } + return resolveXdgDir(ENV_XDG_CACHE_HOME, ".cache"); + } + + public static File getDataDir() { + if (!isXdgEnabled()) { + return getLegacyConfigDir(); + } + return resolveXdgDir(ENV_XDG_DATA_HOME, ".local" + File.separator + "share"); + } + + public static File getStateDir() { + if (!isXdgEnabled()) { + return getLegacyConfigDir(); + } + return resolveXdgDir(ENV_XDG_STATE_HOME, ".local" + File.separator + "state"); + } + + public static File getLibHomeDir() { + String debugToolsHome = System.getenv(ENV_DEBUG_TOOLS_HOME_DIR); + if (isNotBlank(debugToolsHome)) { + return new File(debugToolsHome); + } + if (isXdgEnabled()) { + return getCacheDir(); + } + return getLegacyLibDir(); + } + + public static File getLegacyConfigDir() { + String userHome = System.getProperty("user.home"); + if (userHome == null) { + return new File(ProjectConstants.NAME); + } + return new File(userHome, ProjectConstants.NAME); + } + + public static File getLegacyLibDir() { + String userHome = System.getProperty("user.home"); + if (userHome == null) { + return new File(".debugTools"); + } + return new File(userHome, ".debugTools"); + } + + private static boolean isXdgEnabled() { + return true; + } + + private static File resolveXdgDir(String envVar, String fallbackRelative) { + String basePath = System.getenv(envVar); + File baseDir; + if (isNotBlank(basePath)) { + baseDir = new File(basePath); + } else { + String userHome = System.getProperty("user.home"); + if (userHome == null) { + baseDir = new File("."); + } else { + baseDir = new File(userHome, fallbackRelative); + } + } + return new File(baseDir, ProjectConstants.NAME); + } + + private static boolean isNotBlank(String value) { + return value != null && !value.trim().isEmpty(); + } +} + + + + +