小编典典

相对于正在执行的jar文件加载文件

java

问题说明了一切。

在我的情况下,特殊之处在于当前工作目录不是jar文件的位置,而是c:\Windows\system32(我的jar文件由Windows使用右键菜单启动,我想将文件夹的路径作为参数传递给jar)

现在,我想加载一个config.xml与jar相同的文件夹中的配置文件。该文件的目的当然是为jar提供设置。对我来说重要的是,xml文件 位于
jar文件 之外 ,以便于编辑。

我很难加载该文件。Windows执行该行

cmd /k java -jar D:\pathToJarfile\unpacker-0.0.1-SNAPSHOT-jar-with-dependencies.jar

调用整个过程cmd /k会使Windows命令提示符保持打开状态,以便我可以看到jar的输出。

我不能使用new File(".")System.getProperty("user.dir")作为相对路径,因为这些函数分别返回C:\Windows\system32\.C:\Windows\system32(这是Windows执行AFAIK的所有内容的工作文件夹)。

我都没有成功Launcher.class.getResourceAsStream("/../config.xml")。由于该路径以开头/,因此搜索从jar的根节点开始。要../config.xml精确指向该文件,但调用返回null

有人可以指出我正确的方向吗?我真的被困在这里。每次加载此文件的确让我感到烦恼…

我自己的要求:

  • 我不想在Java源代码中对路径进行硬编码
  • 我不想将文件的路径作为参数传递给java -jar调用(既不作为的参数,main(String[] args)也不-Dpath=d:\...用于设置系统属性)

除了原始问题之外,在使用时,我还很难将maven2 Class-Path: .放入MANIFEST.MF(BalusC发布的解决方案)中jar- with-dependencies。问题是该行出现在常规jar的MANIFEST文件中,而不出现在jar-with-
dependencies.jar的MANIFEST文件中(生成了2个jar文件)。对于任何关心我如何做到的人:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-5</version>
    <configuration>
      <archive>
        <manifest>
          <mainClass>${mainClass}</mainClass>
          <addClasspath>true</addClasspath>
          <!--at first, i tried to place the Class-Path entry
              right here using <manifestEntries>. see below -->
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>attached</goal>
        </goals>
        <phase>package</phase>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>${mainClass}</mainClass>
            </manifest>
            <!--this is the correct placement -->
            <manifestEntries>
              <Class-Path>.</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </execution>
    </executions>
  </plugin>

阅读 218

收藏
2020-09-21

共1个答案

小编典典

要开始Launcher.class.getResourceAsStream("/../config.xml")工作,您需要将其路径添加到Class- PathJAR MANIFEST.MF文件的条目中。这是正常的做法。

2020-09-21