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)
Bal*_*usC 18
有两种解决方法:
不要将JAR用作executabele JAR,而是用作库.
java -cp .;filename.jar com.example.YourClassWithMain
Run Code Online (Sandbox Code Playgroud)获取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文件.
| 归档时间: |
|
| 查看次数: |
41136 次 |
| 最近记录: |