【发布时间】:2017-10-11 02:48:37
【问题描述】:
我正在尝试在我的应用程序的 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 路径的内容来自我项目的一个依赖项,我无法预测它们将来可能添加哪些其他文件(因此我需要扫描该路径)。为了引入这些依赖项,我使用了来自 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 单元测试中的工作方式与在命令行中不同。
【问题讨论】:
-
虽然我仍然不知道为什么这在单元测试中有效但在命令行中无效,@ptomli 用一种更紧凑的替代方法向我指出了a thread。
Resource[] xsdFiles = resourceResolver.getResources("classpath:/xml/*.xsd");然后迭代xsdFiles。