欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java打成jar包运行,和打成exe运行获取项目运行路径的工具类

程序员文章站 2022-03-30 22:57:10
...

1. 工具类

这里搜集了网上三种获取运行路径的方法,写了个工具类,具体如下:

package com.zgd.jar.utils;

import com.zgd.jar.App;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;

public class PathUtil {

    /**
     * 获取当前运行的目录
     * @return
     */
    public static String getRunPath(){
        /**
         * 方法一:获取当前可执行jar包所在目录
         */
        String filePath = System.getProperty("java.class.path");
        String pathSplit = System.getProperty("path.separator");//得到当前操作系统的分隔符,windows下是";",linux下是":"
        /**
         * 若没有其他依赖,则filePath的结果应当是该可运行jar包的绝对路径,
         * 此时我们只需要经过字符串解析,便可得到jar所在目录
         */
        if(filePath.contains(pathSplit)){
            filePath = filePath.substring(0,filePath.indexOf(pathSplit));
        }else if (filePath.endsWith(".jar")) {//截取路径中的jar包名,可执行jar包运行的结果里包含".jar"
            filePath = filePath.substring(0, filePath.lastIndexOf(File.separator) + 1);
        }
        return filePath;
    }

    public static String getJarPath(){
        /**
         * 方法二:获取当前可执行jar包所在目录
         */
        String filePath = "";
        URL url = App.class.getProtectionDomain().getCodeSource().getLocation();
        try {
            filePath = URLDecoder.decode(url.getPath(), "utf-8");// 转化为utf-8编码,支持中文
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (filePath.endsWith(".jar")) {// 可执行jar包运行的结果里包含".jar"
            // 获取jar包所在目录
            filePath = filePath.substring(0, filePath.lastIndexOf("/") + 1);
        }

        File file = new File(filePath);
        filePath = file.getAbsolutePath();//得到windows下的正确路径
        return filePath;
    }

    public static String getExePath() throws IOException {
        return new File("").getAbsolutePath();
    }
}

2.main方法运行的app类

package com.zgd.jar;

import com.zgd.jar.utils.PathUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;

/**
 * Hello world!
 *
 */
public class App {

    private static Logger logger = LogManager.getLogger(App.class);


    public static void main( String[] args ) {
        String s = "\n" +
                "                                      \n" +
                "                                      \n" +
                "                                      \n" +
                "                                ,---, \n" +
                "       ,----,                 ,---.'| \n" +
                "     .'   .`|   ,----._,.     |   | : \n" +
                "  .'   .'  .'  /   /  ' /     |   | | \n" +
                ",---, '   ./  |   :     |   ,--.__| | \n" +
                ";   | .'  /   |   | .\\  .  /   ,'   | \n" +
                "`---' /  ;--, .   ; ';  | .   '  /  | \n" +
                "  /  /  / .`| '   .   . | '   ; |:  | \n" +
                "./__;     .'   `---`-'| | |   | '/  ' \n" +
                ";   |  .'      .'__/\\_: | |   :    :| \n" +
                "`---'          |   :    :  \\   \\  /   \n" +
                "                \\   \\  /    `----'    \n" +
                "                 `--`-'               \n";
        System.out.println(s);
        System.out.println("PathUtil.getRunPath():获取的路径是 "+ PathUtil.getRunPath());
        System.out.println("PathUtil.getJarPath():获取的路径是 "+ PathUtil.getJarPath());
        try {
            System.out.println("PathUtil.getExePath():获取的路径是 "+ PathUtil.getExePath());
        } catch (IOException e) {
            logger.error(Thread.currentThread().getStackTrace()[1].getMethodName() +"发生的异常是: ",e);
        }

        while (true){

        }
    }
}

3. 测试效果

分别打成jar包运行,和打成exe来运行,我们来分别测试下效果:
打成jar运行的方法
打成exe运行的方法

这里说一下我运行的目录位置: jar包是在C:\Users\Admin\Desktop\myapp文件夹中, exe是在C:\Users\Admin\Desktop桌面

3.1 打成jar包获取项目运行路径

java打成jar包运行,和打成exe运行获取项目运行路径的工具类

3.2 打成exe包获取项目运行路径

java打成jar包运行,和打成exe运行获取项目运行路径的工具类
可以看到第三种方法无论是jar还是exe都能很好的获取项目运行的根目录.