60

您好,我在我的 java 应用程序中使用来自 src/main/resources 的配置文件。我在我的课堂上读它是这样的:

new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));

所以现在我正在使用 maven 构建它mvn assembly:assembly。这是我的 pom.xml 中的一点:

<plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <finalName>TestSuite</finalName>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.some.package.Test</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

所以当我运行我的应用程序时,我得到了这个错误:

src\main\resources\config.txt (The system cannot find the path specified)

但是当我右键单击我组装好的罐子时,我可以在里面看到它,有人知道我做错了什么吗?

4

6 回答 6

97

来自的资源src/main/resources将被放在类路径的根目录中,因此您需要将资源获取为:

new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.txt")));

您可以通过查看 maven 生成的 JAR/WAR 文件进行验证,您可以config.txt在存档的根目录中找到该文件。

于 2012-04-16T08:58:38.163 回答
13

FileReader 从文件系统上的文件中读取。

也许您打算使用这样的东西从类路径加载文件

// this will look in src/main/resources before building and myjar.jar! after building.
InputStream is = MyClass.class.getClassloader()
                     .getResourceAsStream("config.txt");

或者您可以在读取之前从 jar 中提取文件。

于 2012-04-16T08:54:46.277 回答
6

您放入 src/main/resources 的资源将在构建过程中复制到可以使用以下命令访问的目标/类:

...this.getClass().getResourceAsStream("/config.txt");
于 2012-04-16T08:55:21.790 回答
4

一旦我们构建 jar 将在BOOT-INF/classestarget/classes文件夹下拥有资源文件,该文件夹位于类路径中,使用以下方法并将src/main/resources下的文件作为方法调用getAbsolutePath("certs /uat_staging_private.ppk"),即使我们可以将此方法放置在 Utility 类中,调用的 Thread 实例将被带到加载 ClassLoader 以从类路径中获取资源。

 public String getAbsolutePath(String fileName) throws IOException {
      return Thread.currentThread().getContextClassLoader().getResource(fileName).getFile();
  }

在此处输入图像描述 在此处输入图像描述

我们可以将以下标记添加到 pom.xml 中的标记以包含这些资源文件以构建目标/类文件夹

<resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.ppk</include>
            </includes>
        </resource>
</resources>
于 2019-06-04T07:26:18.557 回答
1

我认为程序集插件将文件放在类路径上。JAR 中的位置与您在磁盘上看到的位置不同。解压缩生成的 JAR 并查看文件所在的位置。

于 2012-04-16T08:59:20.237 回答
-1

src/main/resources/您可以直接替换为classpath:

因此,对于您的示例,您将替换此行:

new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));

通过这一行:

new BufferedReader(new FileReader(new File("classpath:config.txt")));
于 2018-10-25T17:46:55.927 回答