java - 在命令行上运行时,使用 getResourceAsStream() 列出文件为空

标签 java embedded-resource

我正在尝试列出应用程序 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/

相关文章:

java - 我无法在 Eclipse 中输入花括号

java - 是否可以在 PHP 中为 ReSTLet 创建客户端?

c++ - 如何使用 C++ 自解压二进制资源(可执行文件)?

email - 从 Outlook::Attachment(嵌入式电子邮件)获取 Outlook::_MailItem

c# - 如何使用 "Resources embedded in resx"的资源?

Java Swing框架预览与实际尺寸有差异

java - 从同一帐户多次远程登录会导致所有访问 token 刷新 spring security

silverlight-2.0 - 如何在 Silverlight 2 中引用嵌入资源

javascript - 在 Chrome 中查找请求文件的位置

java - 如何为不实现 parcelable 的对象 Arraylist 实现 Parcelable?