可执行 jar 找不到属性文件

2022-09-03 04:15:58

我在程序中使用此代码来加载属性文件:

Properties properties = new Properties();
URL url = new App().getClass().getResource(PROPERTIES_FILE);
properties.load(url.openStream());

代码在 Eclipse 中运行良好。然后我把程序打包成一个名为MyProgram.jar的JAR,然后运行它,我在第二行得到了一个NullPointerException。JAR 不包含属性文件,它们都位于同一目录中。我正在使用Maven来创建JAR。如何解决此问题?

更新:我不想将属性文件添加到JAR中,因为它将在部署时创建。


答案 1

BalusC是对的,你需要指示Maven在条目中生成一个带有当前目录()的条目。MANIFEST.MF.Class-Path:

假设您仍在使用 Maven Assembly 插件和描述符来构建可执行 JAR,则可以使用以下方法告诉插件这样做:jar-with-dependencies

  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>com.stackoverflow.App</mainClass>
        </manifest>
        <manifestEntries>
          <Class-Path>.</Class-Path> <!-- HERE IS THE IMPORTANT BIT -->
        </manifestEntries>
      </archive>
    </configuration>
    <executions>
      <execution>
        <id>make-assembly</id> <!-- this is used for inheritance merges -->
        <phase>package</phase> <!-- append to the packaging phase. -->
        <goals>
          <goal>single</goal> <!-- goals == mojos -->
        </goals>
      </execution>
    </executions>
  </plugin>

答案 2

有两种解决方法

  1. 不要将 JAR 用作 executabele JAR,而是将其用作库。

    java -cp .;filename.jar com.example.YourClassWithMain
    
  2. 获取 JAR 文件的根位置并从中获取属性文件。

    URL root = getClass().getProtectionDomain().getCodeSource().getLocation();
    URL propertiesFile = new URL(root, "filename.properties");
    Properties properties = new Properties();
    properties.load(propertiesFile.openStream());
    

两者都不是推荐的方法!推荐的方法是在 JAR 的文件中包含以下条目:/META-INF/MANIFEST.MF

Class-Path: .

然后,它将以通常的方式用作类路径资源。你真的必须以某种方式指示Maven生成这样的文件。MANIFEST.MF


推荐