【问题标题】:adding relative directory to java classpath and using ClassLoader().getResourceAsStream("")将相对目录添加到 java 类路径并使用 ClassLoader().getResourceAsStream("")
【发布时间】:2009-05-09 02:25:15
【问题描述】:

是否可以在java类路径中添加相对目录(即foo/bar/plugh)并使用

InputStream in = getClassLoader().getResourceAsStream("xyzzy.properties");

要获取 foo/bar/plugh/xyzzy.properties?

我的类路径如下所示:

foo.jar;foo/bar/plugh;xyz.jar 

我可以使用 foo 和 xyz jar 中的类和资源,但不能使用 plugh 目录中的类和资源。在这些情况下,in 始终为空。

我无法让它工作,我不确定这是否只是不受支持,我错过了一些微妙的东西,或者我做错了什么。我需要使用绝对路径吗?

【问题讨论】:

  • 你是如何设置这个类路径的?像下面的例子? java -classpath foo.jar;foo/bar/plugh;xyz.jar

标签: java directory classpath classloader


【解决方案1】:

也许我误解了你想要做什么,但如果你的类路径中有一个文件夹,这意味着它下面的所有文件也应该在类路径中。如果没有,您始终可以在类路径上传递每个 .properties 文件。

但无论哪种方式,由于包含该文件的文件/文件夹位于类路径中,您应该能够做到:

InputStream in = new FileInputStream("classpath:xyz.properties")

由于“foo/bar/plugh”在类路径中,它会寻找 xyz.properties 的位置之一是“foo/bar/plugh”。

【讨论】:

  • 由于某种原因,当我的应用程序通过 codehaus maven appassmebler 构建的批处理文件运行时,这对我不起作用。绝对路径有效,但相对路径无效。
  • 我唯一能想到的是,如果您在类路径中的相对路径是根据程序运行的位置来解析的。例如,如果我在 C:\myapp\bin 目录中有批处理文件,则“基本”路径可能是 C:\myapp\bin,而不是 C:\myapp。如果是这种情况,它将尝试解析“C:\myapp\bin\foo\bar\plugh\xyz.properties”。
  • 它使用目录的绝对路径对我有用。但这很奇怪,因为我之前尝试过使用代码: InputStream in = getClassLoader().getResourceAsStream("xyzzy.properties"); 这两种方法有什么区别?谢谢。
  • 有没有办法用方法获取这个属性:ResourceBundle.getBundle("xyz");谢谢。
  • @David 我认为只要“xyz.properties”在您的类路径中,就应该使用 getBundle()
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2014-09-29
  • 1970-01-01
相关资源
最近更新 更多