如何在运行时获得Java应用程序的真正path?
我正在使用log4j创build一个Java应用程序。 我给出了configurationlog4j文件的绝对path以及生成的日志文件(生成此日志文件的位置)的绝对path。 我可以在运行时通过以下方式获得Java Web应用程序的绝对path:
String prefix = getServletContext().getRealPath("/");
但是在普通的Java应用程序的上下文中,我们可以使用什么?
尝试;
String path = new File(".").getCanonicalPath();
目前还不清楚你要求什么。 我不知道我们使用的web应用程序是什么意思,如果getServletContext().getRealPath()
不是答案,但是:
- 当前用户的当前工作目录由
System.getProperty("user.dir")
- 当前用户的主目录由
System.getProperty("user.home")
-
this.getClass().getProtectionDomain().getCodeSource().getLocation()
提供当前类加载的JAR文件的位置。
那么使用this.getClass().getProtectionDomain().getCodeSource().getLocation()
?
如果您正在讨论一个Web应用程序,您应该使用ServletContext
对象中的getRealPath
。
例:
public class MyServlet extends Servlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ String webAppPath = getServletContext().getRealPath("/"); } }
希望这可以帮助。
new File(".").getAbsolutePath()
最好将文件保存到user.home的子目录中,而不是应用程序的任何位置。 可能居住。
Sun为了确保applet和应用程序付出了相当大的努力。 使用Java Web Start启动无法确定应用程序。 真正的道路。 这一改变打破了很多应用 如果更改扩展到其他应用程序,我不会感到惊讶。
/***************************************************************************** * 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()
由于JAR
和从IDE
内部运行的应用程序的应用程序path不同,因此我编写了以下代码以始终返回正确的当前目录:
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()
,你应该很好。
我使用这个方法来获得jar或exe的完整path。
File pto = new File(YourClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()); pto.getAbsolutePath());
expression方式
new File(".").getAbsolutePath();
会得到与JVM执行相关的当前工作目录。 但是,JVM确实提供了许多其他有用的属性
System.getProperty(propertyName);
接口。 这些属性的列表可以在这里find 。
这些将允许您以独立于平台的方式引用当前用户目录,临时目录等。