Browse Source

修改代码获取file服务所在目录逻辑,正确解析路径

zhaojinyu 2 weeks ago
parent
commit
e392759428

+ 35 - 4
base-modules/service-file/src/main/java/com/ruoyi/file/domain/FileUpdateInfo.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
 import java.io.File;
+import java.net.URL;
 
 @Data
 @TableName("file_update_info")
@@ -26,10 +27,40 @@ public class FileUpdateInfo {
         return fileName.substring(0, fileName.lastIndexOf('.')) + "-" + version + fileName.substring(fileName.lastIndexOf('.'));
     }
 
-    // 获取文件完整路径(基于当前服务运行目录)
+    // 获取文件完整路径(基于 JAR 文件所在的目录)
     public String getFilePath() {
-        // 获取当前服务运行目录
-        String currentDir = System.getProperty("user.dir");
-        return currentDir + File.separator + fileName;
+        return getServiceDir() + File.separator + fileName;
+    }
+
+    // 动态获取 JAR 文件所在的目录
+    public static String getServiceDir() {
+        try {
+            // 获取当前类的 ClassLoader
+            ClassLoader classLoader = FileUpdateInfo.class.getClassLoader();
+            // 获取当前类的资源路径(例如 JAR 文件路径)
+            URL url = classLoader.getResource(FileUpdateInfo.class.getName().replace('.', '/') + ".class");
+            if (url != null && "jar".equals(url.getProtocol())) {
+                // 从 JAR 文件中获取路径
+                String jarPath = url.getPath();
+                // 去掉 JAR 文件内部路径部分
+                int bangIndex = jarPath.indexOf("!/");
+                if (bangIndex > 0) {
+                    jarPath = jarPath.substring(0, bangIndex);
+                }
+                // 去掉 "file:" 前缀
+                if (jarPath.startsWith("file:")) {
+                    jarPath = jarPath.substring(5);
+                }
+                // 获取 JAR 文件所在的目录
+                return new java.io.File(jarPath).getParent();
+            } else if (url != null && "file".equals(url.getProtocol())) {
+                // 如果是直接运行的文件路径
+                String filePath = url.getPath();
+                return new java.io.File(filePath).getParent();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return System.getProperty("user.dir"); // 如果无法获取 JAR 路径,退回到当前工作目录
     }
 }

+ 5 - 1
base-modules/service-file/src/main/java/com/ruoyi/file/service/impl/FileUpdateInfoServiceImpl.java

@@ -49,6 +49,7 @@ public class FileUpdateInfoServiceImpl implements FileUpdateInfoService {
         fileUpdateInfoMapper.insert(fileUpdateInfo);
     }
 
+    //检查是否需要更新
     @Override
     public boolean checkFileUpdate(Long id) throws Exception {
         FileUpdateInfo fileUpdateInfo = fileUpdateInfoMapper.selectById(id);
@@ -78,6 +79,7 @@ public class FileUpdateInfoServiceImpl implements FileUpdateInfoService {
         }
     }
 
+    //下载更新
     @Override
     public void performFileUpdate(Long id) throws Exception {
         FileUpdateInfo fileUpdateInfo = fileUpdateInfoMapper.selectById(id);
@@ -90,7 +92,9 @@ public class FileUpdateInfoServiceImpl implements FileUpdateInfoService {
         String remoteUrl = remoteUrlBase + fileName;
 
         try {
-            String backupDirPath = System.getProperty("user.dir") + File.separator + "backup";
+            // 获取 JAR 文件所在的目录
+            String serviceDir = FileUpdateInfo.getServiceDir();
+            String backupDirPath = serviceDir + File.separator + "backup";
             File backupDir = new File(backupDirPath);
             if (!backupDir.exists()) {
                 boolean created = backupDir.mkdirs();