Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用maven生成后未找到来自src/main/resources的资源_Java_Maven_Maven 2 - Fatal编程技术网

Java 使用maven生成后未找到来自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

您好,我正在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>

但是,当我右键单击组装好的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