【问题标题】:Null results when reading a resource读取资源时为空结果
【发布时间】:2018-03-16 11:21:05
【问题描述】:

这是我的项目结构:

这是我的代码,试图读取资源文件夹中的文件:

package passgen;

public class Application {

  public static void main(String[] args) {
        System.out.println(Application.class.getResourceAsStream("/configuration.properties"));
        System.out.println(Application.class.getResource("/configuration.properties"));
        System.out.println(Application.class.getClassLoader().getResourceAsStream("/configuration.properties"));
        System.out.println(Application.class.getClassLoader().getResource("/configuration.properties"));
        System.out.println(new Application().getClass().getResourceAsStream("/configuration.properties"));
        System.out.println(new Application().getClass().getResource("/configuration.properties"));
        System.out.println(new Application().getClass().getClassLoader().getResourceAsStream("/configuration.properties"));
        System.out.println(new Application().getClass().getClassLoader().getResource("/configuration.properties"));
        System.out.println(Application.class.getResourceAsStream("configuration.properties"));
        System.out.println(Application.class.getResource("configuration.properties"));
        System.out.println(Application.class.getClassLoader().getResourceAsStream("configuration.properties"));
        System.out.println(Application.class.getClassLoader().getResource("configuration.properties"));
        System.out.println(new Application().getClass().getResourceAsStream("configuration.properties"));
        System.out.println(new Application().getClass().getResource("configuration.properties"));
        System.out.println(new Application().getClass().getClassLoader().getResourceAsStream("configuration.properties"));
        System.out.println(new Application().getClass().getClassLoader().getResource("configuration.properties"));
  }

结果全部为空:

null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null

将“configuration.properties”替换为“src/main/resources/configuration.properties”(带斜线和不带斜线)没有任何区别。

其他答案,如this,告诉使用.getClass().getClassLoader().getResource(fileName),但这已经是其中之一。 为什么它们都为空,我如何获取资源?


POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>passgen</groupId>
<artifactId>passgen</artifactId>
<version>1</version>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<build>
    <finalName>passgen</finalName>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>${project.build.directory}/dist</targetPath>
            <includes>
                <include>**/*<!-- all resources that go to folder, rest will go into the jar --></include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*<!-- all resources that go to folder, rest will go into the jar --></exclude>
            </excludes>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <outputDirectory>${project.build.directory}/dist</outputDirectory>
                <archive>
                    <manifest>
                        <!-- <addClasspath>true</addClasspath> -->
                        <mainClass>
                            passgen.Application
                        </mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

【问题讨论】:

  • 您能告诉我们configuration.properties 在您正在运行的JAR/WAR 中的实际位置吗?我的猜测是它不存在,因为你的许多调用之一可能是你应该使用的。
  • Application.class.getClassLoader().getResource("configuration.properties") 应该可以工作,尝试重建项目并检查启动配置中设置的类路径是否正确(遵循 maven 约定) - 假设您从 Eclipse 运行它。
  • 你能证明使用你的 POM 吗?
  • 我不是从 jar 运行它,而是从 Eclipse 运行它。我重建了项目,但没有任何区别。这些是启动配置的屏幕截图:imgur.com/a/mD5cjimgur.com/a/rlMKB。我把 pom 放在了问题中。

标签: java resources


【解决方案1】:

您必须提供类加载器的完整路径,以防您想从项目目录加载它。

System.out.println(Application.class.getResourceAsStream("/main/resources/configuration.properties"));

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    找到了答案。出于某种原因,Eclipse 在 main/java/resources 文件夹中放置了“**”的排除模式。如果其他人有同样的问题:右键单击项目 -> 构建路径 -> 配置构建路径 -> 源选项卡。对于所有条目,检查“排除”的声音,它应该是“(无)”。如果您有一个排除模式将您的文件从类路径中排除(例如“**”),请单击删除以将其删除。

    编辑:由于某种原因,当您运行 Maven -> 更新项目时,Eclipse 将 ** 排除模式添加到 src/main/resource 文件夹中

    编辑 2: 我发现 Eclipse 中 src/main/resource 文件夹中的排除模式是正常的(请参阅this 答案)。排除意味着不是 Eclipse 处理 src/main/resources 文件夹编译,而是 Maven(准确地说是 Eclipse 的 Maven 插件,M2Eclipse)。在类路径中找不到这些资源的事实是由于 pom.xml 中存在的排除:

    <resource>
        <directory>src/main/resources</directory>
        <excludes>
            <!-- these resources will be excluded from the classpath; they will not go in to the target/classes folder and will not be packaged into the artifact -->
            <exclude>**/*</exclude>
        </excludes>
    </resource>
    

    我删除了它以获得下面列出的输出。

    现在上面代码的输出是这样的:

    java.io.BufferedInputStream@7852e922
    file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
    null
    null
    java.io.BufferedInputStream@4e25154f
    file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
    null
    null
    null
    null
    java.io.BufferedInputStream@70dea4e
    file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
    null
    null
    java.io.BufferedInputStream@5c647e05
    file:/C:/Users/Taiano/eclipse-workspace/sharedProjects/passgen/target/classes/configuration.properties
    

    如果您想从 jar 中排除资源,请在 maven-jar-plugin 部分中排除它。如果要在输出中生成从 jar 中排除的资源,请使用指定目标文件夹的目标 copy-resources 配置 maven-resources-plugin(如果您只是从神器,您将无处获得资源)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2019-08-19
      • 2012-02-22
      相关资源
      最近更新 更多