从jar或类路径中的任何位置读取文件?
问题描述:
我正在尝试构建一个将资源文件构建到jar中的应用程序,但我希望在eclipse中运行该项目。我的项目有一个基本的maven 2结构,我不确定如何读取文件,以便在从JAR或eclipse中运行时找到并使用它。思想?从jar或类路径中的任何位置读取文件?
结构:
src/main/java
src/main/resources/file.txt
当前读数方法:
getClass().getResourceAsStream("/file.txt")
是否有读书方法,将拿起的src /主/资源/ *,以及根JAR的水平(在哪里部署资源)?
答
我不明白你的问题。 src/main/resources
的资源会自动复制到target/classes
,因此可以在Maven和Eclipse下相对于相同位置的根级别(除非您的Eclipse项目未正确配置)的类路径中使用。
而当打包在JAR中时,target/classes
的内容按“原样”打包,因此没有任何更改。
换句话说,访问您file.txt
这样是完全没有问题(这实际上是how things are documented):
// Retrieve resource
InputStream is = getClass().getResourceAsStream("/file.txt");
// Do something with the resource
...
如果你有什么地方出了问题,请澄清。
更新:我做了一个快速测试与Maven的Eclipse的插件,我无法重现你的问题:
$ mvn archetype:generate -DgroupId=com.* -DartifactId=q2467362 -Dversion=1.0-SNAPSHOT
...
$ cd q2467362
$ mkdir -p src/main/resources
$ mvn eclipse:eclipse
...
$ cat .classpath
<classpath>
<classpathentry kind="src" path="src/test/java" output="target/test-classes" including="**/*.java"/>
<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
<classpathentry kind="output" path="target/classes"/>
<classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar" sourcepath="M2_REPO/junit/junit/3.8.1/junit-3.8.1-sources.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
</classpath>
目录src/main/resources
添加源文件夹中的预期。你能否显示你的POM(尤其是resources
元素,如果你定义的话)?
答
使用maven2放入src/main/resources中的任何内容都将放置在jar的根级别。所以你现在使用的方法将满足这两个条件。 来自Maven页面: http://maven.apache.org/guides/getting-started/index.html#How_do_I_add_resources_to_my_JAR
在自动构建步骤期间,eclipse项目必须将资源复制到目标/类上才能做什么? – 2010-03-18 14:06:50
@Stefan设置'src/main/resource'作为源文件夹。但是这应该由maven-eclipse-plugin或者M2Eclipse完成。 – 2010-03-18 14:35:32
我尝试用mvn eclipse重新生成该项目:eclipse,但它仍然没有采用。嗯。我想我只会以这种方式手动添加它,然后。 – 2010-03-18 14:54:46