项目打成jar包后,无法访问到里面sql的问题

之前的代码如下:

ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(sourceEnum.name().toLowerCase(), plugin);
activeRecordPlugin.setBaseSqlTemplatePath(PathUtils.getRootPath());
activeRecordPlugin.addSqlTemplate("sql/xjq_weibo.sql");

修改代码如下:

ActiveRecordPlugin activeRecordPlugin = new ActiveRecordPlugin(sourceEnum.name().toLowerCase(), plugin);
//这行不要
//activeRecordPlugin.setBaseSqlTemplatePath(PathUtils.getRootPath());
activeRecordPlugin.getEngine().setSourceFactory(new ClassPathSourceFactory());
activeRecordPlugin.addSqlTemplate("sql/xjq_weibo.sql");

这里用到了ClassPathSource,可以从jar文件中读取文件。

默认是用FileSource,这个是用File file = new File()方式读取文本文件。

而读jar包里的文件时,用了ClassPathSource,看源码可以发现,用的是(贴几行关键代码)

InputStream inputStream = classLoader.getResourceAsStream(finalFileName);
StringBuilder ret = new StringBuilder();
BufferedReader br = null;
try {
   br = new BufferedReader(new InputStreamReader(inputStream, 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);
}

牛逼!

评论区

JFinal

2018-04-06 11:52

jfinal 3.4 打算将 sql 管理用到的 Engine 对象默认使用 ClassPathSourceFactory,因为大多数情况下 sql 文件都是放在 src/main/resources 下面的,最终人支编译到 class path 下面去,或者被打成 jar 包,大家有什么建议?

感谢你的分享

热门分享

扫码入社