【问题标题】:Reading a file from a jar, or anywhere on the classpath?从 jar 或类路径中的任何位置读取文件?
【发布时间】:2011-01-28 20:52:34
【问题描述】:

我正在尝试构建一个将资源文件构建到 jar 中的应用程序,但我希望该项目可在 eclipse 中运行。我的项目有一个基本的 maven 2 结构,我不确定如何读取文件,以便在从 JAR 或从 Eclipse 中运行时找到并使用它。想好了吗?

结构:

src/main/java
src/main/resources/file.txt

目前的阅读方式:

getClass().getResourceAsStream("/file.txt")

是否有读取 src/main/resources/* 的读取方法,以及 JAR 的根级别(部署资源的位置)?

【问题讨论】:

    标签: java maven-2 file-io jar


    【解决方案1】:

    我不明白你的问题。来自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-plugin 进行了快速测试,但无法重现您的问题:

    $ mvn archetype:generate -DgroupId=com.stackoverflow -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 元素,如果你定义了一个)?

    【讨论】:

    • 必须对 eclipse 项目执行什么操作才能在自动构建步骤期间将资源复制到目标/类?
    • @Stefan 设置 src/main/resource 作为源文件夹。但这应该由 maven-eclipse-plugin 或 M2Eclipse 完成。
    • 我尝试使用 mvn eclipse:eclipse 重新生成项目,但还是不行。唔。我想我就这样手动添加吧。
    • 我刚刚重试了我自己的项目,现在它正在工作。一定是一些连我都无法重现的杂散日食问题。
    【解决方案2】:

    使用 maven2 放在 src/main/resources 中的任何东西都将放在 jar 的根目录中。因此,您当前使用的方法将同时满足这两个条件。 从 Maven 页面: http://maven.apache.org/guides/getting-started/index.html#How_do_I_add_resources_to_my_JAR

    【讨论】:

      猜你喜欢
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      相关资源
      最近更新 更多