我正在尝试列出应用程序 jar 文件中特定路径的文件。当我使用“mvn clean package”构建时它可以工作,但是当我使用“java -jar target/myproject_1.0.jar”在命令行上运行时,文件列表为空。基于this suggestion ,我正在使用此代码读取目录内容
boolean failed = true;
String schemaLocation = "/xml";
System.out.println("Scanning folder "+schemaLocation);
InputStream dirStream = getClass().getResourceAsStream(schemaLocation);
BufferedReader dirReader = new BufferedReader(new InputStreamReader( dirStream ));
try{
String filename = dirReader.readLine();
while( filename != null ){
failed = false;
if( filename.endsWith(".xsd")){
String fullname = schemaLocation+"/"+filename;
System.out.println("Loading schema file "+fullname );
InputStream in = getClass().getResourceAsStream(schemaLocation+"/"+filename);
readAndProcessSchema(in);
}
filename = dirReader.readLine();
}
}catch(IOException ex){
ex.printStackTrace();
}
if(failed){
System.out.println("Fallback enabled.");
InputStream in = getClass().getResourceAsStream(schemaLocation+"/schema_v1.0.xsd");
readAndProcessSchema(in);
}
请注意,流不是空的,只是空的。只有路径列表逻辑失败,因为代码示例末尾的后备代码(读取硬编码的 xsd 文件名)甚至可以在命令行上运行。我也尝试过 MyClass.class.getResourceAsStream("/xml")
(基于 this suggestion ),结果相同。
另一个可能相关的注释是 xml 路径的内容来 self 的项目依赖项之一,并且我无法预测它们将来可能添加哪些其他文件(因此我需要扫描该路径)。为了引入这些依赖项,我使用 this post 中的建议,我相信它是有效的,因为 jar 文件的目录似乎包含了所有内容:
$ jar -tvf target/myproject-1.0.jar | grep xml
0 Tue Oct 10 10:02:28 PDT 2017 xml/
1999 Tue Oct 10 10:02:28 PDT 2017 xml/schema_v1.0.xsd
4474 Tue Oct 10 10:02:28 PDT 2017 xml/schema_v2.0.xsd
5757 Fri Oct 06 16:07:48 PDT 2017 META-INF/maven/com.mycompany/myproject/pom.xml
还值得一提的是,它作为 Spring Boot 应用程序运行,使用其 spring-boot-maven-plugin“重新打包”目标构建。我现在不仅想知道如何解决这个问题,还想知道为什么类路径在 Maven 单元测试中的工作方式与在命令行上的工作方式不同。
最佳答案
org.apache.commons.io.IOUtils.toString(getClass().getResourceAsStream("/csv/test.csv"), Charset.forName("UTF-8")))
这是如何访问 jar 文件中的内部源代码的示例。
这很棘手,资源的根路径是什么。在 IDE 中,您可以将某些文件夹(例如 webapp/recource)标记为资源文件夹。当您构建 jar 文件时,资源文件夹内容将位于根目录中。因此,如果您的资源路径从/开始,则意味着jar的根目录(即资源文件夹的根目录)。
我不使用相对路径,所以你可以看看 open resource with relative path in java获取更多相关信息。
关于java - 在命令行上运行时,使用 getResourceAsStream() 列出文件为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46673266/