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

Gan*_*row 47 java maven-2 maven

您好我在我的java应用程序中使用src/main/resources中的配置文件.我正在我的班级里读它:

new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));
Run Code Online (Sandbox Code Playgroud)

所以现在我用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>
Run Code Online (Sandbox Code Playgroud)

因此,当我运行我的应用程序时,我收到此错误:

src\main\resources\config.txt (The system cannot find the path specified)
Run Code Online (Sandbox Code Playgroud)

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

ben*_*y23 81

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

new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.txt")));
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您处于静态上下文中,那么您还可以使用"Thread.currentThread().getContextClassLoader()"而不是"getClass()". (9认同)
  • 如上所述,Maven将来自`src/main/resources`的资源放入类路径的根目录中,因此JAR文件中没有`src/main/resources`目录 - 以同样的方式,`.class`文件是不在名为`src/main/java`的目录中.那有意义吗? (3认同)

Pet*_*rey 11

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

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

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

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


khm*_*ise 5

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

...this.getClass().getResourceAsStream("/config.txt");
Run Code Online (Sandbox Code Playgroud)

  • 你需要`getClass()`因为`this`不太可能是`Class`类型. (6认同)