平台:使用Eclipse IDE的Java SWT
在继续之前,我确实在Stack Overflow上看到了类似的问题19035407。
来源:
package prjMyapp;
import java.io.InputStream;
public class Myapp
{
public static void main(String[] args)
{
InputStream oStream = Myapp.class.getResourceAsStream("resources/StarTrekLandruRocks.txt");
if (null == oStream)
System.out.println("input stream is null");
else
System.out.println("input stream is NOT null :-)");
}
}
文件展示位置
prjMyApp / src / prjMyApp
--> All .java files
--> resources
--> Non-image resources
--> images
--> Image resources (jpg, png)
有趣的提示
我曾经使用过/prjMyapp/resources/whatever.txt和/prjMyapp/images/whatever.ext,但是在测试中找出这个问题,我意识到相对路径也有效,并且在视觉和其他方面都更好,因此“resources / StarTrekLandruRocks.txt”而不是之前的“/prjMyapp/resources/StarTrekLandruRocks.txt”。如上所述,图像,我有很多,在所有机器(甚至是Mac)上按预期工作,而不是文本文件。
开发机器:
无论我做什么,我的开发机器都能完美地执行代码。
CENTOS Box
我的CENTOS(Linux)框执行自包含的全包jar文件,为此我使用ANT创建文件。我可以加载文本文件,如果我将文本文件作为png扩展名,但是我无法将文件作为txt扩展名加载,与其他所有内容一样。
是的,我知道将txt文件重命名为png扩展名应该永远不会完成,但我很好奇会发生什么,因为我可以加载图像(jpg和png)而没有任何问题。我发现getSystemClassLoader只是不喜欢txt扩展名。将扩展名重命名为png是一种破解,并且无论出于何种原因都将该方法伪造成工作。
我宁愿不做黑客攻击。
为什么getSystemClassLoader不能直接使用txt扩展名?根据另一篇文章它应该,但不是我的系统。
修复是什么?
答案 0 :(得分:1)
这些评论让我得到答案。
方法getResourceAsStream()工作正常。我只是没有意识到该文件根本不在jar中作为txt扩展,因此失败。
<target name="jarResources" depends="jarCode">
<jar destfile="${jar.code}" update="true">
<fileset dir="${src.dir}" includes="**/*.png" />
<fileset dir="${src.dir}" includes="**/*.jpg" />
<fileset dir="${src.dir}" includes="**/*.ico" />
<fileset dir="${src.dir}" includes="**/*.txt" />
</jar>
</target>
我错过了jarResources部分的最后一行。它最初只有png,jpg和ico。添加txt行解决了这个问题。
问题可以在构建脚本中,而不仅仅是在Java中,经验教训。感谢。