当前位置: 首页 > 知识库问答 >
问题:

如何动态获取spring boot应用程序jar父文件夹路径?

常俊爽
2023-03-14

我有一个使用java-jar运行的Spring引导Web应用程序application.jar.我需要从代码中动态获取jar父文件夹路径。我怎么才能做到这一点?

我已经试过了,但没有成功。

共有3个答案

邴俊达
2023-03-14

试试这个代码

public static String getParentRealPath(URI uri) throws URISyntaxException {
    if (!"jar".equals(uri.getScheme()))
        return new File(uri).getParent();
    do {
        uri = new URI(uri.getSchemeSpecificPart());
    } while ("jar".equals(uri.getScheme()));
    File file = new File(uri);
    do {
        while (!file.getName().endsWith(".jar!"))
            file = file.getParentFile();
        String path = file.toURI().toString();
        uri = new URI(path.substring(0, path.length() - 1));
        file = new File(uri);
    } while (!file.exists());
    return file.getParent();
}

URI uri = clazz.getProtectionDomain().getCodeSource().getLocation().toURI();
System.out.println(getParentRealPath(uri));
时恩
2023-03-14
    File file = new File(".");
    logger.debug(file.getAbsolutePath());

这对我有用,让我的罐子运行的路径,我希望这是你所期待的。

袁泰
2023-03-14

嗯,对我起作用的是对这个答案的改编。代码为:

如果您使用java-jar myapp运行。jar目录路径将与以下内容非常接近:jar:file:/D:/arquivos/repositorio/myapp/trunk/target/myapp-1.0.3-RELEASE。罐子/引导INF/类/br/com/cancastilho/service。或者,如果您是从Spring Tools套装运行的,可以这样运行:file:/D:/arquivos/repositorio/myapp/trunk/target/classes/br/com/cancastilho/service

public String getParentDirectoryFromJar() {
    String dirtyPath = getClass().getResource("").toString();
    String jarPath = dirtyPath.replaceAll("^.*file:/", ""); //removes file:/ and everything before it
    jarPath = jarPath.replaceAll("jar!.*", "jar"); //removes everything after .jar, if .jar exists in dirtyPath
    jarPath = jarPath.replaceAll("%20", " "); //necessary if path has spaces within
    if (!jarPath.endsWith(".jar")) { // this is needed if you plan to run the app using Spring Tools Suit play button. 
        jarPath = jarPath.replaceAll("/classes/.*", "/classes/");
    }
    String directoryPath = Paths.get(jarPath).getParent().toString(); //Paths - from java 8
    return directoryPath;
}

编辑:

实际上,如果您使用spring boot,那么您可以像这样使用ApplicationHome类:

ApplicationHome home = new ApplicationHome(MyMainSpringBootApplication.class);
home.getDir();    // returns the folder where the jar is. This is what I wanted.
home.getSource(); // returns the jar absolute path.
 类似资料:
  • 要获取请求URL,可以在堆栈溢出中找到以下方法。 第一种方法: 第二种方法: 第三种方法: 我不知道在spring boot应用程序中使用哪一个来获取请求URL。 如果我使用第三种方法,那么我是否需要在配置类中创建RequestContextListener的bean,如下所示?

  • 如何在Eclipse中配置Java动态Web项目,使Web-INF/lib文件夹位于子文件夹中? 例如,假设我希望我的“lib”文件夹位于此处: src/main/webapp/WEB-INF/lib 我的webapp根在这里: src/main/webapp/ 如何在Eclipse中配置此功能?我知道我可以“添加jar”,但我希望它们被组织在我的应用程序构建路径库部分的“Web应用程序库”部分。

  • 问题内容: 我在项目的根目录中有一个资源文件夹/程序包,我“不想”加载某个文件。如果我想加载某个文件,我将使用class.getResourceAsStream,我会很好的!我实际上想要做的是在资源文件夹中加载一个“文件夹”,循环访问该文件夹中的文件,并获取每个文件的流,并读取内容…假设在运行时之前未确定文件名… 我该怎么办?有没有一种方法可以获取jar文件中“文件夹”中文件的列表?请注意,带有资

  • 当我使用相对路径时,我可以从Eclipse运行Java程序。但是,当我将其作为JAR文件运行时,该路径不再有效。在我的src/components/SettingsWindow中。我有:

  • 问题内容: 如何使用Java获取当前计算机的“程序文件”路径? 问题答案: 只需致电 请注意,它仅适用于Windows环境:-)

  • 问题内容: 我需要在WebContent目录中获取文件的真实路径,以便我使用的框架可以访问该文件。它仅将String文件作为属性,因此我需要在WebContent目录中获取此文件的真实路径。 我使用Spring Framework,因此应该可以在Spring中解决。 问题答案: 如果您在servlet中需要此功能,请使用!