我正在创建一个Java应用程序,我正在使用log4j。我已经给出了配置log4j文件的绝对路径以及生成的日志文件的绝对路径(生成此日志文件的位置)。我可以在运行时通过以下方式获取Java Web应用程序的绝对路径:
String prefix = getServletContext().getRealPath("/");
但在普通Java应用程序的上下文中,我们可以使用什么?
答案 0 :(得分:43)
尝试;
String path = new File(".").getCanonicalPath();
答案 1 :(得分:28)
目前尚不清楚你要求的是什么。我不知道“我们正在使用的网络应用程序是什么”意味着getServletContext().getRealPath()
不是答案,但是:
System.getProperty("user.dir")
System.getProperty("user.home")
this.getClass().getProtectionDomain().getCodeSource().getLocation()
给出。答案 2 :(得分:9)
那么使用this.getClass().getProtectionDomain().getCodeSource().getLocation()
呢?
答案 3 :(得分:4)
如果您正在谈论Web应用程序,则应使用getRealPath
对象中的ServletContext
。
示例:
public class MyServlet extends Servlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
String webAppPath = getServletContext().getRealPath("/");
}
}
希望这有帮助。
答案 4 :(得分:1)
最好将文件保存到user.home的子目录中,而不是应用程序的任何位置。可能会驻留。
Sun竭尽全力确保applet和应用程序。使用Java Web Start启动无法确定应用程序。真正的道路。这一变化打破了许多应用。如果将更改扩展到其他应用程序,我不会感到惊讶。
答案 5 :(得分:1)
/*****************************************************************************
* 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()
答案 6 :(得分:1)
由于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 :(得分:1)
我使用此方法获取jar或exe的完整路径。
File pto = new File(YourClass.class.getProtectionDomain().getCodeSource().getLocation().toURI());
pto.getAbsolutePath());
答案 8 :(得分:0)
new File(".").getAbsolutePath()
答案 9 :(得分:0)
如果要获取诸如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";
}
答案 10 :(得分:0)
我认为每个人都忽略了一个关键问题。
String prefix = getServletContext().getRealPath("/");
servlet 实例可以位于任意多个节点之一上,并且在技术上根本不需要文件系统。
例如,在 Java EE 容器中,可以从数据库甚至目录服务器加载应用程序。应用程序的不同部分也可以在不同的节点上运行。应用程序服务器提供对应用程序外部世界的访问。
如果您必须保持与旧版 log4j 的兼容性,请使用 java.util.logging 或 Apache Commons Logging。告诉应用服务器日志文件应该放在哪里。
答案 11 :(得分:-1)
如果要使用以下答案:https://stackoverflow.com/a/4033033/10560907
您必须添加这样的导入语句:
import java.io.File;
最开始的Java源代码。
答案 12 :(得分:-1)
我的类路径的根目录上有一个文件“ cost.ini”。我的JAR文件名为“ cost.jar”。
以下代码:
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
/C:/folder1/folder2/cost.ini
如果应用程序以JAR格式提供,则每次使用File
都会导致异常。
答案 13 :(得分:-2)
表达式
new File(".").getAbsolutePath();
将获取与JVM执行相关的当前工作目录。但是,JVM确实通过
提供了许多其他有用的属性System.getProperty(propertyName);
接口。这些属性的列表can be found here。
这些将允许您以独立于平台的方式引用当前用户目录,临时目录等。