Java 使用maven生成后未找到来自src/main/resources的资源
您好,我正在java应用程序中使用src/main/resources中的配置文件。我在课堂上这样读:Java 使用maven生成后未找到来自src/main/resources的资源,java,maven,maven-2,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-asse
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>
但是,当我右键单击组装好的jar时,我可以看到它在里面,任何人都知道我做错了什么?文件阅读器从文件系统上的文件读取 也许您打算使用类似的方法从类路径加载文件
// this will look in src/main/resources before building and myjar.jar! after building.
InputStream is = MyClass.class.getClassloader()
.getResourceAsStream("config.txt");
或者,您可以在读取之前从jar中提取文件。在构建过程中,您放入src/main/resources中的资源将被复制到目标/类,这些目标/类可以通过以下方式访问:
...this.getClass().getResourceAsStream("/config.txt");
src/main/Resources
中的资源将放在类路径的根目录下,因此您需要获得以下资源:
new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.txt")));
您可以通过查看maven生成的JAR/WAR文件进行验证,因为您将在归档文件的根目录中找到
config.txt
。我认为汇编插件将该文件放在类路径上。JAR中的位置将不同于您在磁盘上看到的位置。解压缩生成的JAR并查看文件所在的位置。您可以直接用类路径替换src/main/resources/
因此,对于您的示例,您将替换这一行:
new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));
new BufferedReader(new FileReader(new File("classpath:config.txt")));
通过这一行:
new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));
new BufferedReader(new FileReader(new File("classpath:config.txt")));
一旦我们构建了jar,jar就会将资源文件放在BOOT-INF/classes或target/classes文件夹下,该文件夹位于classpath中,使用下面的方法并将文件作为方法调用传递到src/main/resources下getAbsolutePath(“certs/uat\u staging\u private.ppk”),甚至我们可以将这个方法放在实用程序类中,调用线程实例将被用来加载类加载器以从类路径获取资源
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>
src/main/resources
**/*.物业
**/*.ppk
src/main/resources不起作用,因为它们将被复制到target/classes文件夹并打包到jar中。我已经纠正了这一点。非常感谢。如果类路径中有
,但原因不正确,则该方法有效。i、 e.它读取的是原件而不是副本。@beny23这可能比使用总是查看根/顶层的getClassLoader()
更简单。您需要getClass()
因为这个
不太可能属于类
。你能在你的答案中添加一点文字,解释一下Maven是怎么造成这种差异的吗?那将是一个很大的帮助。谢谢你。如前所述,Maven将src/main/resources
中的资源放入类路径的根目录中,因此JAR文件中没有src/main/resources
目录-同样地,.class
文件不在名为src/main/java
的目录中。这有意义吗?如果您处于静态上下文中,那么您也可以使用“Thread.currentThread().getContextClassLoader()”而不是“getClass()”。很高兴听到@587