如何在运行时获取 Java 应用程序的真实路径?
Posted
技术标签:
【中文标题】如何在运行时获取 Java 应用程序的真实路径?【英文标题】:How to get the real path of Java application at runtime? 【发布时间】:2011-05-01 06:48:09 【问题描述】:我正在创建一个使用 log4j 的 Java 应用程序。我已经给出了配置 log4j 文件的绝对路径以及生成的日志文件的绝对路径(生成此日志文件的位置)。我可以通过以下方式在运行时获取 Java Web 应用程序的绝对路径:
String prefix = getServletContext().getRealPath("/");
但是在普通 Java 应用程序的上下文中,我们可以使用什么?
【问题讨论】:
【参考方案1】:我认为每个人都忽略了一个关键问题。
String prefix = getServletContext().getRealPath("/");
servlet 实例可以位于任意多个节点之一上,并且在技术上根本不需要文件系统。
例如,在 Java EE 容器中,应用程序可以从数据库甚至目录服务器加载。应用程序的不同部分也可以在不同的节点上运行。对应用程序外部世界的访问由应用程序服务器提供。
如果您必须保持与旧版 log4j 的兼容性,请使用 java.util.logging 或 Apache Commons Logging。告诉应用服务器日志文件应该去哪里。
【讨论】:
【参考方案2】:我的类路径的根目录中有一个文件“cost.ini”。我的 JAR 文件名为“cost.jar”。
以下代码:
如果我们有 JAR 文件,则获取 JAR 文件所在的目录。 如果我们有 *.class 文件,则取类根目录。try
//JDK11: replace "UTF-8" with UTF_8 and remove try-catch
String rootPath = decode(getSystemResource("cost.ini").getPath()
.replaceAll("(cost\\.jar!/)?cost\\.ini$|^(file\\:)?/", ""), "UTF-8");
showMessageDialog(null, rootPath, "rootpath", WARNING_MESSAGE);
catch(UnsupportedEncodingException e)
.getPath()
返回的路径格式为:
file:/C:/folder1/folder2/cost.jar!/cost.ini
在 *.class 中:/C:/folder1/folder2/cost.ini
如果应用程序以 JAR 格式提供,则每次使用 File
都会引发异常。
【讨论】:
我不明白反对票。方法适用于 jar 和不适用于 jar 应用程序。因为在发布时您使用 jar,但在调试时您使用一组 java 类。【参考方案3】:如果你想使用这个答案:https://***.com/a/4033033/10560907
您必须像这样添加导入语句:
import java.io.File;
在最开始的 java 源代码中。
喜欢这个答案:https://***.com/a/43553093/10560907
【讨论】:
如果你想使用第一个答案,那你就错了。你给出的第二个答案是正确的。【参考方案4】:如果你想获取Spring(Servlet)等java web应用程序的真实路径,可以从你的HttpServletRequest自带的Servlet Context对象中获取。
@GetMapping("/")
public String index(ModelMap m, HttpServletRequest request)
String realPath = request.getServletContext().getRealPath("/");
System.out.println(realPath);
return "index";
【讨论】:
【参考方案5】:我使用这种方法来获取 jar 或 exe 的完整路径。
File pto = new File(YourClass.class.getProtectionDomain().getCodeSource().getLocation().toURI());
pto.getAbsolutePath());
【讨论】:
【参考方案6】:由于JAR
的应用程序路径和在IDE
内部运行的应用程序不同,我编写了以下代码以始终返回正确的当前目录:
import java.io.File;
import java.net.URISyntaxException;
public class ProgramDirectoryUtilities
private static String getJarName()
return new File(ProgramDirectoryUtilities.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath())
.getName();
private static boolean runningFromJAR()
String jarName = getJarName();
return jarName.contains(".jar");
public static String getProgramDirectory()
if (runningFromJAR())
return getCurrentJARDirectory();
else
return getCurrentProjectDirectory();
private static String getCurrentProjectDirectory()
return new File("").getAbsolutePath();
private static String getCurrentJARDirectory()
try
return new File(ProgramDirectoryUtilities.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParent();
catch (URISyntaxException exception)
exception.printStackTrace();
return null;
只需致电getProgramDirectory()
,无论哪种方式,您都应该做得很好。
【讨论】:
【参考方案7】:/*****************************************************************************
* return application path
* @return
*****************************************************************************/
public static String getApplcatonPath()
CodeSource codeSource = MainApp.class.getProtectionDomain().getCodeSource();
File rootPath = null;
try
rootPath = new File(codeSource.getLocation().toURI().getPath());
catch (URISyntaxException e)
// TODO Auto-generated catch block
e.printStackTrace();
return rootPath.getParentFile().getPath();
//end of getApplcatonPath()
【讨论】:
如果有URISyntaxException
,此代码将抛出NullPointerException
。
这不会抛出 NullPointerException
当然它会抛出一个 NPE。 rootPath
为 null 并且在异常情况下永远不会更改,然后您取消引用它。如果您想辩论,请提供事实或论据。不只是否认。【参考方案8】:
不清楚你要什么。如果getServletContext().getRealPath()
不是答案,我不知道“关于我们正在使用的网络应用程序”是什么意思,但是:
System.getProperty("user.dir")
给出
当前用户的主目录由System.getProperty("user.home")
给出
加载当前类的 JAR 文件的位置由 this.getClass().getProtectionDomain().getCodeSource().getLocation()
给出。
【讨论】:
@Gary 你在发布之前看过文档吗?它是当前工作目录。user.home
是用户的主目录。
@Jonathan 对不起。你说得很对,我错了。今天咖啡喝多了!
我赞成这个。我没有从这篇文章中得到我的问题的解决方案,但这段代码是我的项目所需要的。 (获取运行 java 应用程序的路径并将路径添加到 java.path -我的 dll 始终在此路径中-)谢谢。【参考方案9】:
那么使用this.getClass().getProtectionDomain().getCodeSource().getLocation()
呢?
【讨论】:
【参考方案10】:表达式
new File(".").getAbsolutePath();
将为您提供与 JVM 执行相关的当前工作目录。但是,JVM 确实通过
System.getProperty(propertyName);
界面。这些属性的列表can be found here。
这些将允许您以独立于平台的方式引用当前用户目录、临时目录等。
【讨论】:
但这些系统属性中的任何一个或任何其他属性都不能提供问题的答案。【参考方案11】:如果您谈论的是 Web 应用程序,您应该使用来自 ServletContext
对象的 getRealPath
。
例子:
public class MyServlet extends Servlet
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
String webAppPath = getServletContext().getRealPath("/");
希望这会有所帮助。
【讨论】:
但这里我使用的是简单的 Java 应用程序。 @SameekMishra 那么你为什么提到 Web 应用程序?【参考方案12】:最好将文件保存到 user.home 的子目录中,而不是应用程序的任何位置。可能居住。
Sun 付出了相当大的努力来确保小程序和应用程序。使用 Java Web Start 启动无法确定应用程序。真实路径。这一变化破坏了许多应用程序。如果这些更改扩展到其他应用程序,我不会感到惊讶。
【讨论】:
【参考方案13】:new File(".").getAbsolutePath()
【讨论】:
返回工作目录而不是应用程序目录。因此,当在文件上按 Enter 键以使用应用程序打开时,我们会采用错误的应用程序路径。【参考方案14】:试试;
String path = new File(".").getCanonicalPath();
【讨论】:
还有System.getProperty("user.dir")
,不能抛出IOException
。
这真的返回应用程序的安装目录吗?看起来它应该返回工作目录,这不一定是同一件事。
对此进行了测试,它返回的是工作目录,而不是应用程序的目录。以上是关于如何在运行时获取 Java 应用程序的真实路径?的主要内容,如果未能解决你的问题,请参考以下文章