Spring启动,文件无法读取,启动时使用jar包

时间:2017-07-07 13:43:21

标签: java spring spring-boot filenotfoundexception

Spring boot,无法读取文件,启动时使用jar包。 当我使用.war开始时,一切正常

这是war maven pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>xls</nonFilteredFileExtension>
            <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
            <nonFilteredFileExtension>p12</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
    </configuration>
</plugin>

但请使用java -jar

enter image description here

我想从java -jar开始,现在我需要做什么? spring boot version 1.4.4

public void generater(HttpServletResponse response, boolean testMode) {
        ExcelTemplateEnum excelTemplate = this.exportTemplate();
        FileInputStream is = null;
        Workbook workbook = null;
        try {
            String templateFilePath = this.getTemplateFilePath(excelTemplate);
            URL url = ExeclExportHandler.class.getClassLoader().getResource(templateFilePath);
            is = new FileInputStream(url.getFile());
            ExcelTransformer transformer = this.getExcelTransformer();
            // 渲染导出数据
            if (isMultipleBeans()) {
                List<Map<String, Object>> data = this.renderDataList();
                this.checkExportParam(data);
                workbook = transformer.transform(is, getTemplateSheetNamesList(), getSheetNamesList(), data);
            } else {
                Map<String, Object> data = this.renderData();
                this.checkExportParam(data);
                workbook = transformer.transform(is, data);
            }
            if (testMode) {
                ...
            } else {
                ExcelHelper.setExcelHeader(response, excelTemplate.outname());
                workbook.write(response.getOutputStream());
                response.flushBuffer();
            }
        } catch (Exception e) {
            ...
        } finally {
            IOUtils.closeQuietly(is, workbook);
        }
    }
  

错误第75行

    is = new FileInputStream(url.getFile());

1 个答案:

答案 0 :(得分:2)

您必须按Class.getResourceAsStream()访问资源,因为您无法访问jar中包含的文件:

is = this.getClass().getResourceAsStream(templateFilePath)

如果它适用于战争它只是运气,因为你的servlet / J2EE容器似乎解压你的战争......所有容器都不是这样(由于规范是由容器决定它是否将打开战争或不打开)。具有不同容器的手段你也会得到这个战争的例外。