如何从主 jar 指定文件路径,而不是依赖 JAR

How to specify file path from Main jar, and not for dependency JAR

我有一个包含 3 个模块的 java 项目。

[ ] Utils
   ----->code
   ----->pom.xml
[ ] Module B
   ----->Resources\config.xml
   ----->code
   ----->pom.xml
[ ] Module C
   ----->Resources\config.xml
   ----->code
   ----->pom.xml

utils 模块是模块 A 和模块 B 的依赖项。utils 具有 ModuleB 和 ModuleC 都使用的 'ReadConfig' 功能。模块 B 和模块 C 在资源文件夹中具有不同的配置。

理想情况下,模块 B 和模块 C 都应该 运行 作为具有依赖项的独立 jar,并从目标目录(jar 所在的同一目录)读取 config.xml。

目前我通过以下方式获取配置文件位置:

public static final String JAR_PATH = Constants.class.getProtectionDomain().getCodeSource().getLocation().getPath();
public static final String CONFIG_PATH = JAR_PATH.substring(0, JAR_PATH.lastIndexOf('/')) + "/config.xml";

此代码在 Utils 模块中。

问题是,在 IntelliJ(和 netbeans)中,当我 运行 项目时,JAR_PATH 是 Utils 目标目录。我希望它指向模块 A 或模块 B 目标目录。

我的问题是:

  1. 这种情况下的最佳做法是什么。其中两个模块使用不同的配置文件。
  2. 如何使 intellij / netbeans 运行 模块 A / B 在 运行 安装模块时独立(具有依赖项的 jar)(如果我执行 mvn assembly:single 它会生成一个 jar具有有效的依赖关系。我想知道如何从 intellij 做到这一点)

如果您需要从 运行 您的 jar 应用程序文件所在的目录中读取一些文件, 然后只需使用:(它将相对于您 运行 您的应用所在的目录进行解析)

File f = new File("someDirInDirWhereMyJarIsRunFrom/myConfig.xml");
FileInputStream fis = new FileInputStream(f);
// read the "fis"

这是假设您的应用程序文件夹的结构如下:

  + YourAppFolder
  |---> yourApp.jar
  |---+ someDirInDirWhereMyJarIsRunFrom
      |--->myConfig.xml