使用maven构建后找不到src / main / resources中的资源

时间:2012-04-16 08:51:30

标签: java maven maven-2

您好我在我的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)

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

6 个答案:

答案 0 :(得分:79)

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

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

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

答案 1 :(得分:11)

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

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

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

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

答案 2 :(得分:5)

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

...this.getClass().getResourceAsStream("/config.txt");

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

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

通过此行:

new BufferedReader(new FileReader(new File("classpath:config.txt")));

答案 5 :(得分:0)

构建完jar后,将在类路径中的 BOOT-INF / classes target / classes 文件夹下拥有资源文件,请使用以下方法将文件作为方法调用 getAbsolutePath(“ certs / uat_staging_private.ppk”) 传递到 src / main / resources 下,即使我们可以放置此文件Utility类中的方法和调用线程实例将被加载来加载ClassLoader,以从类路径获取资源。

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

enter image description here enter image description here

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

<resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.ppk</include>
            </includes>
        </resource>
</resources>