可执行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
有两种解决方法 :
-
不要将JAR用作executabele JAR,而是用作库。
java -cp .;filename.jar com.example.YourClassWithMain
-
获取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我的服务器端代码时指定该清单:
[....]
- Javacv + Yosemite + Eclipse:项目未运行,java.lang.UnsatisfiedLinkError
- 有没有办法让eclipse报告一般的“catch(exceptione)”作为错误/警告(在java中)?
- 在Tomcat中启用Context reload =“true”时,JDBC连接池用完了连接
- 是否可以从eclispe中的mysql表生成带有hibernate注释的java类文件
- 将事件添加到此日历
- Java SE上的JPA:对象:entity.Customer@5e80188f不是已知的实体类型
- Eclipse如何找到JRE或JDK locaton?
- 将SqlCipher与Android应用程序集成(在Windows上)
- 设置从Eclipse运行的Java程序的内存