2017-05-09 34 views
1

我无法理解如何以eclipse和jar的方式加载资源。Java classLoader和getResourceAsStream

在我的项目中,我有一个源文件,src。 在那之下,我创建了一个新的包,可以将资源(图像,音频..)导入到。 因此它的资源为src/resources,而src/com/Mainclass.java

现在,我从其他答案了解,.class.getResource(); 开始在类的目录中查找。除了从eclipse提取jar的类的目录改变。 换句话说,

MainClass.class.getResourceAsStream("/resources/img.png") 

只在Eclipse工作

我甚至不确定它为什么可行,因为资源与主类不在同一条路径中。我会反而期待../resources/img.png工作,因为我们会从com。src/,其中资源是。

不过,一旦我提取物作为一个罐子,我觉得里面,分离:

<root of the jar>/com/mainclass.java 

<root of the jar>/src/resources 

所以这是行不通的。

更简单的解决方案是:如何找到MainClass.class.getResourceAsStream(“/ resources/img.png”)加载的确切目录? 我试过把/ resources /放在每个子文件夹中,但它仍然无法工作。 IT将在eclipse之外工作,如果资源文件夹与jar相同,但不在jar本身内。

这里是我的构建路径:

enter image description here

我没有外部库,项目是一个Maven Java项目。

+1

我认为你应该阅读Maven的基本文档。 Eclipse中使用的源代码/编译布局以Eclipse方式(很多)和Maven方式(一点)混合使用。 – davidxxx

+0

为了全局理解,请阅读:https://maven.apache.org/guides/getting-started/。 有关资源需求,请阅读:https://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory。html – davidxxx

回答

3

这些资源应该在src/main/resources之下(如果它们将成为应用程序的一部分),或者在src/test/resources之下,如果它们仅用于测试而不是最终工件的一部分。

Maven的副本从src/main/resourcestarget/classes的资源和那些从src/test/resourcestarget/test-classes。在测试过程中,target/classes和`target/test-classes被添加到类路径中。

所以,你的代码实际上应该是这个样子:

MainClass.class.getResourceAsStream("/img.png") 
+0

我upvote从根本上是正确的,但我不知道它会解决它的问题,因为我看到他的Eclipse配置和他对Maven – davidxxx

+1

@davidxxx的知识,我知道你的意思。我相信'src/resources'目录的内容应该简单地移到'src/main/resources'下,这应该把它整理出来。 – carlspring

+0

@carlspirng那么你是否建议我将src/resources移动到src/main/resources中,然后将每次调用资源的代码更改为MainClass.class.getResourceAsStream(“/ img.png”)?只是为了看看我是否得到了正确的 –