可执行jar将找不到属性文件

Hai*_*yen 15 java eclipse jar maven

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

Properties properties = new Properties();
URL url = new App().getClass().getResource(PROPERTIES_FILE);
properties.load(url.openStream());
Run Code Online (Sandbox Code Playgroud)

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

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

Pas*_*ent 23

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

假设您仍在使用Maven Assembly Plugin和jar-with-dependencies描述符来构建可执行JAR,您可以使用以下命令告诉插件:

  <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>
Run Code Online (Sandbox Code Playgroud)

  • 您好,我尝试使用上面的方法创建一个jar-with-depencies,可以加载位于同一目录中的属性文件,但它不起作用.我使用"java -jar myjar.jar"运行我的jar.我尝试使用Class.getResource()Class.ClassLoader.getResource()检索属性文件,在文件名中包含和不包含前导斜杠,但这些都不起作用.如果我打印java.class.path的内容,我只获取我的jar文件(没有".",尽管它在MANIFEST的Class-Path中正确设置).有人可以帮帮我吗? (4认同)

Bal*_*usC 18

有两种解决方法:

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

    java -cp .;filename.jar com.example.YourClassWithMain
    
    Run Code Online (Sandbox Code Playgroud)
  2. 获取JAR文件的根位置并从中获取属性文件.

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

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

Class-Path: .
Run Code Online (Sandbox Code Playgroud)

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