如何找到已部署JavaEE应用程序的父目录?

如何找到已部署JavaEE应用程序的父目录?,java,jakarta-ee,build,war,Java,Jakarta Ee,Build,War,我有一个JavaEE项目,我将把它转换成war文件。当它运行时,它将生成一个日志文件,我希望该文件在与war文件相同的父目录下生成。例如,我的war文件是: C:\project.war 那么我的日志文件的路径将是: C:\log.txt 但我发现的只是如何在项目中找到资源。如何在项目生成日志文件之前找到其父目录?您不应该依赖这样的路径。当您将创建的战争分发给其他人进行部署时,它可能会部署在完全不同的路径上。它可以部署为WAR存档或分解目录。目标应用程序服务器(Tomcat、JBoss、WebL

我有一个JavaEE项目,我将把它转换成war文件。当它运行时,它将生成一个日志文件,我希望该文件在与war文件相同的父目录下生成。例如,我的war文件是:

C:\project.war

那么我的日志文件的路径将是:

C:\log.txt


但我发现的只是如何在项目中找到资源。如何在项目生成日志文件之前找到其父目录?

您不应该依赖这样的路径。当您将创建的战争分发给其他人进行部署时,它可能会部署在完全不同的路径上。它可以部署为WAR存档或分解目录。目标应用程序服务器(Tomcat、JBoss、WebLogic等)可能会有不同的做法,在您的即时开发环境之外,做出诸如日志文件路径相对于WAR部署路径之类的隐式假设是行不通的。另外,JavaEE不会让您访问WAR部署目录的物理位置,仅仅是因为它不知道它(同样,因为WAR的部署方式不是JavaEE规范的一部分,而是留给实现者,比如Tomcat、JBoss…)

我认为,正确的方法是创建一个可以保存在类路径中的属性文件,并将日志文件目录的属性放在属性文件中,应用程序可以在运行时读取该属性文件,并将日志发送到该文件。请参阅以获取更多见解

    Properties props = ...; // the link above will help you get the properties
    String logDir = props.getProperty("log.dir", "/tmp"); // /tmp is default

    // logDir cannot be null
    File logFile = new File(logDir, "application.log"); 

    // make sure the directories are created if did not exist previously
    logFile.getParent().mkdirs(); 

    // write log statements to logFile
    ...
或者,特别是对于日志记录,您可以查看许多API(包括JDK)为日志记录提供的现成机制

  • (JDK记录器示例)
  • (Log4J示例)
当然,如果您确实需要使用物理目录,您可以执行类似的操作来访问启动应用程序服务器(部署WAR文件)的目录:

File f = new File("."); // f is the current directory; where the JVM was launched
System.out.println(f.getAbsolutePath()); 

一旦你有了“f”,你就可以从中衍生出其他路径。同样,这不是一个好主意,我将让您决定是否应该使用这种方法。

与其尝试获取与应用程序相关的文件,不如尝试使用绝对路径来引用该文件。对于跨平台解决方案,请使用JNDI

在Tomcat的
context.xml
文件中声明以下内容:

<Context>
    <Environment name="logLocation" value="C:/logs/log.txt" type="java.lang.String"/>
</Context>
然后获取您的文件:

File file = new File(logLocation);

我不确定你能做到。你为什么不直接用它的绝对路径引用这个文件呢?@Cássio Mazzochi Molin我不太明白。你能解释更多吗?@Cássio Mazzochi Molin你是说我为什么不在代码中使用这样的“C:\file.txt”吗?是的,我只是想知道你为什么不使用这种方法。@Cássio Mazzochi Molin因为我现在在windows上做这个项目,但下周我将不得不把它给使用mack OSx的人,所以硬编码为“C:\log.txt”至少据我所知,这是行不通的。你能建议用一种独立于操作系统的方式来做这件事吗?你可能是对的,我所做的不是一个好主意。我这样做是因为我真的不知道把日志文件放在哪里(见这个问题),我认为在和war文件相同的目录中生成它就足够了
File file = new File(logLocation);