Cuurent州 正如克里斯建议我创建了一个最小的例子(基于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)! 所以我只是将上面的2行复制到我的真实应用程序中,构建它并将2个文件复制到jar的文件夹中。但现在两个sysouts都会产生“null”! 所以似乎有些东西似乎在使用classpath /或者忽略来自manifest的classpath? (打印出类路径的输出在两种情况下都相同 - 只打印出jar) 知道如何解决问题吗?
原始问题:
我从当前目录中读取文件(属性)时遇到问题。这是我的设置(基于maven): 阅读文件:
MyClass.class.getClassLoader().getResourceAsStream("my.properties")
在我的属性置于resources / my.properties中的测试中正常工作。
由于当前目录是默认的类路径,我认为它应该只是将my.properties放在与jar相同的目录中并从此目录运行java -jar
,但它不起作用(资源流为空) 。
然后我添加奇数代码到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 的重复 从classpath加载资源没有问题。我把文件放在src / test / resource / my.properties中 Maven将它们与所有类一起复制,一切正常。由于该文件位于src / test / resources中,因此在打包的jar中缺失(按预期)。用户必须提供my.properties才能运行该程序。我想从当前目录中读取这个文件(假设java-jar是从带有my.properties的jar目录调用的)但这不起作用!
修改 maven-assembly-plugin config:
<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
答案 0 :(得分:1)
在Ubuntu上运行Java 1.7.0_51-b13(Oracle),你的方法对我来说很好。因此,版本引入的差异或运行测试的方式都有微妙的变化。以下是我运行测试的方法,也许它可以帮助您进一步诊断。
这是我使用的清单
Manifest-Version: 1.0
Class-Path: .
Main-Class: Foo
Created-By: 1.7.0_06 (Oracle Corporation)
代码
public class Foo {
public static void main( String[] args ) {
Object v = Foo.class.getClassLoader().getResourceAsStream("my.properties");
System.out.println( "v = " + v );
}
}
我按如下方式创建了jar:
jar cfm MyJar.jar Manifest.txt Foo.class
然后我将jar移动到自己的目录中并运行
cd dirContainingJar
java -jar MyJar.jar
并且它打印为null,所以我接着
echo Hello > my.properties
java -jar MyJar.jar
并打印
v = java.io.BufferedInputStream@131b92e6