java无法将当前目录添加到类路径
Cuurent state 正如chris所建议的,我创建了一个最低限度的示例(基于maven):
public class MainApp {
public static void main(String[] args) {
System.out.println(MainApp.class.getResourceAsStream("/my.properties"));
System.out.println(MainApp.class.getClassLoader().getResourceAsStream("their.properties"));
}
}
这正在工作(与我的不工作应用程序中的maven配置相同,并且在同一位置有相同的MANIFEST.MF)! 所以我只是把上面的两行代码复制到我真正的应用程序中,构建它并将这两个文件复制到jar的文件夹中。但是现在两个系统输出都会产生“null”! 所以有些东西似乎在摆弄类路径/或者让我们忽略清单中的类路径? (在这两种情况下,打印输出类路径的输出是相同的-只打印出jar) 知道如何解决这个问题吗
原始问题:
我无法从当前目录中读取文件(属性)。以下是我的设置(基于maven): 读取文件:
MyClass.class.getClassLoader().getResourceAsStream("my.properties")
在放置在resources/my中的my属性的测试中运行良好。财产
因为当前目录是默认的类路径,所以我认为它应该只用于放置我的。属性位于与jar相同的目录中,并从此目录运行java -jar
,但它不起作用(资源流为null)。
然后我在main中添加了奇数代码以打印出类路径:
String classpath = System.getProperty("java.class.path");
String[] classpathEntries = classpath.split(File.pathSeparator);
for (int i = 0; i < classpathEntries.length; i++) {
System.out.println(classpathEntries[i]);
}
我还尝试了一些其他代码,但在这两种情况下,只有我的jar文件的路径被打印出来。所以我试着加上“.”通过使用maven程序集插件来实现。从舱单:
...
Class-Path: .
...
但这没有帮助。那么如何从当前目录获取我的程序加载getClassLoader().getResourceAsStream(my.properties)
为什么这不是this的副本 我可以从类路径加载资源。我将文件放在src/test/resource/my中。性质 Maven将它们与所有类一起复制,并且一切都很好。由于文件位于src/test/resources中,因此打包的jar中缺少该文件(如预期的)。用户必须给出一个my。属性来运行程序。我想从当前目录中读取这个文件(假设java-jar是从带有my.properties的jar目录中调用的),但这不起作用
编辑 maven程序集插件配置:
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>some.pkg.MainApp</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
</configuration>
这将导致清单。。。jar/META-INF/MANIFEST。MF
# 1 楼答案
在Ubuntu上运行Java 1.7.0_51-b13(Oracle),你的方法对我来说很好。因此,可能是版本带来了差异,也可能是运行测试的方式出现了微妙的变化。下面是我如何进行测试的,也许它会帮助你进一步诊断
这是我使用的清单
密码呢
我创建了这个罐子,如下所示:
然后我将jar移动到自己的目录中并运行
它打印为空,所以我
它打印出来了