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

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

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,因为它将在部署时创建。

BalusC是对的,您需要指示Maven使用Class-Path:条目中的当前目录( . )生成MANIFEST.MF

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

   maven-assembly-plugin 2.2   jar-with-dependencies    com.stackoverflow.App   .       make-assembly  package   single      

有两种解决方法

  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文件。

编辑:这是为了回应你的评论:

您需要确保属性文件位于具有正确根目录的类路径上,以便对jar文件进行加盖。 如果你的道路是

东东/ things.properties

并且运行时位置是

/opt/myapp/etc/stuff/things.properties

并且jar文件在

/选择/ MYAPP /斌/ myjar这一

然后你需要发射为

/ path / to / java -cp“/opt/myapp/etc:/opt/myapp/bin/myjar.jar”my.pkg.KavaMain

使用这种配置在开发环境中可能很烦人,幸运的是, maven exec插件可以为您提供正确的启动方案。

原答案:

您想了解maven资源插件 。

基本上你想添加这样的东西:

  maven-jar-plugin    src/main/java  **/*properties      

假设你的属性文件是你的java源代码 – 你的pom.xml真的应该在src / main / resources中。

我有一个类似的问题,这个线程是一个很大的帮助! 仅供参考,我修改了我的Ant构建文件以进行MANIFEST制作,然后在JAR-ing我的服务器端代码时指定该清单:

        [....]