如果你将自定义SQL文件打包到了jar包,该如何读取

例子

原来
activeRecordPlugin.setBaseSqlTemplatePath(PathKit.getRootClassPath());
activeRecordPlugin.addSqlTemplate("sql/demo.sql");

假如生成了一个 A.jar 文件当你运行的时候 会报错 找不到文件

因为打包成了 jar 包之后需要通过IO流才能读取,通过File对象读取不到

我给改了一下
activeRecordPlugin.setBaseSqlTemplatePath("classpath:");
activeRecordPlugin.addSqlTemplate("sql/demo.sql");

然后从写了一下 FileStringSource.java 的 loadFile 方法,用了 Spring 的读取配置文件的类

示例代码

package com.jfinal.template;

import org.apache.commons.io.IOUtils;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

public static StringBuilder loadFile(String fileName, String encoding) {
    if(fileName.indexOf("classpath:") == 0) {
        StringBuilder ret = new StringBuilder();
        try {
            PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
            Resource resource = patternResolver.getResource(fileName);
            ret.append(IOUtils.toString(resource.getInputStream(), encoding));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ret;
    }
    File file = new File(fileName);
    if (!file.exists()) {
        throw new RuntimeException("File not found : " + fileName);
    }

    StringBuilder ret = new StringBuilder((int)file.length() + 3);
    BufferedReader br = null;
    try {
        br = new BufferedReader(new InputStreamReader(new FileInputStream(file), encoding));
        // br = new BufferedReader(new FileReader(fileName));
        String line = br.readLine();
        if (line != null) {
            ret.append(line);
        } else {
            return ret;
        }

        while ((line=br.readLine()) != null) {
            ret.append("\n").append(line);
        }
        return ret;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                com.jfinal.kit.LogKit.error(e.getMessage(), e);
            }
        }
    }
}


评论区

JFinal

2017-04-05 17:35

目前版本的 jfinal 3.0 只能去改源码来扩展一下,因为 addSqlTemplate 只支持 String 参数,需要再提供一个支持 IStringSource 的 addSqlTemplate 方法对外开放的 API 才能方便去扩展这个功能

这个功能后续考虑做进去,目前建议直接修改 jfinal sql 管理模块的源码,简单粗爆

giegie

2017-04-12 00:48

感谢楼主提供方法
我现在是这么解决
fileName = fileName.replace("classpath:/", "");
StringBuilder out = new StringBuilder();
InputStream inputStream = com.jfinal.template.FileStringSource.class.getClassLoader().getResourceAsStream(fileName);
byte[] b = new byte[4096];
try {
for (int n; (n = inputStream.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
} catch (IOException e) {
throw new RuntimeException("Error loading sql file.", e);
} finally {
if (inputStream != null) try {inputStream.close();} catch (IOException e) {LogKit.error(e.getMessage(), e);}
}
return out;

JFinal

2017-04-22 16:00

jfinal 3.1 已添加 arp.addSqlTemplate(IStringSource) 方法,正在内测中,多多关注社区动态

热门反馈

扫码入社