Java: 访问任何模块外的相对路径

Java: Access relative path outside ANY module

我有一个 java 项目,它由几个模块组成:

myWebApp
  - conf     //not a java module, just text files
  - ModuleA
      -- src
      -- target
      -- moduleA.iml
      -- pom.xml
  - ModuleB
     ...
  - pom.xml
  - myWebApp.iml
  - myWebApp.env

我想从 Class(显然在模块的 src 文件夹下)访问 myWebApp.env 文件(这是一个 java 属性文件),例如:

InputStream is = new FileInputStream(<RelativePathToEnvFile>);

问题是相对路径似乎只适用于模块源根目录下的子目录,或者类路径中使用 getResource() 技巧的任何地方,如前所述 here

在我所知道的每一种其他语言上,我都可以这样做:

InputStream is = new FileInputStream("../../../../../myWebApp.env");

这在java中是不可能的吗?

从 Java 7 开始,您可以使用 NIO 文件 API 执行此操作(旧文件 API 也可以,但使用 NIO 可以更好地完成相对路径解析)

File file = Paths.get("../../pom.xml").toFile();

为确保文件正确,您可以调用toRealPath()来解析相对路径段

File file = Paths.get("../../pom.xml").toRealPath().toFile();

如果您有一个工作目录作为起点,您可以从中解析一个相对路径:

File file = Paths.get(".") //the current working dir
                 .resolve("../pom.xml") //navigate to a relative path
                 .toFile(); //convert to old File api

使用 IDE 时,您必须确保工作目录正确。工作目录不一定是与执行的 class 所属的模块目录相同的情况。工作目录可以是 project/parent 模块的目录。

此外,您的代码可能仅适用于该特定设置。至少你应该考虑将 env 文件放在你的模块之一的资源文件夹中(或者有一个单独的配置模块),然后在 classpath.

中解析文件