【问题标题】:How to find the parent directory of a deployed Java EE application?如何找到已部署的 Java EE 应用程序的父目录?
【发布时间】:2015-11-10 16:04:51
【问题描述】:

我有一个 Java EE 项目,我将把它变成一个 war 文件。当它运行时,它会生成一个日志文件,我希望该文件与war文件在同一父目录中生成。比如我的war文件是:

C:\project.war

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

C:\log.txt

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

【问题讨论】:

  • 不确定你能做到这一点。为什么不直接使用绝对路径引用文件?
  • @Cássio Mazzochi Molin 我不太明白。你能解释更多吗?
  • @Cássio Mazzochi Molin 你的意思是我为什么不在代码中这样做“C:\file.txt”?
  • 是的,我只是想知道你为什么不使用这种方法。
  • @Cássio Mazzochi Molin 因为我现在在 Windows 上做这个项目,但下周我必须把它交给使用 mack OSx 的人,所以硬编码 "C:\log.txt" 不会行不通,至少据我所知。您能否建议以独立于操作系统的方式执行此操作?

标签: java jakarta-ee build war


【解决方案1】:

你不应该依赖这样的路径。当您将其分发给某人进行部署时,您创建的 WAR 可能会部署在完全不同的路径上。它可以部署为 WAR 存档或展开的目录。目标应用程序服务器(Tomcat、JBoss、WebLogic 等)可能会以不同的方式执行此操作,并且做出隐含假设(例如相对于 WAR 部署路径的日志文件路径)在您的直接开发环境之外将不起作用。另外,Java EE 不会让您访问 WAR 部署目录的物理位置,这仅仅是因为它不知道(再次,因为 如何 WAR 的部署方式不是 Java EE 规范的一部分, 而是留给 Tomcat、JBoss 等实现者...)。

在我看来,正确的方法是创建一个可以保存在类路径中的属性文件,并将日志文件目录的属性放在属性文件中,以便应用程序在运行时读取并发出该文件的日志。有关更多见解,请参阅 Reading Properties file

    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)提供的开箱即用机制来记录日志。

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

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

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

【讨论】:

  • 你可能是对的,我正在做的不是一个好主意。我这样做是因为我真的不知道将日志文件放在哪里(参见这个问题stackoverflow.com/questions/33629700/…),我认为在与war文件相同的目录中生成它就足够了
【解决方案2】:

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

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

<Context>
    <Environment name="logLocation" value="C:/logs/log.txt" type="java.lang.String"/>
</Context>

获取logLocation 使用:

InitialContext initialContext = new InitialContext(); 
Context environmentContext = (Context) initialContext.lookup("java:/comp/env");
String logLocation = (String) environmentContext.lookup("logLocation");

然后获取你的文件:

File file = new File(logLocation);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2011-06-17
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多