关于ActiveRecordPlugin加载sql模板的疑惑

@JFinal @杜福忠

ActiveRecordPlugin提供了自动从resource和jar中加载sql模板的功能。

setBaseSqlTemplatePath设置模板加载扫描路径,设置了,就只会从这个路径扫描加载模板。

addSqlTemplate函数用来添加需要加载的sql模板文件,我为了省事,就只添加了all.sql这个文件其他sql模板文件通过在all.sql文件里使用

#namespace("proQuery")

#include("proQuery.sql")

#end

这样的语句包含进去。这一切都工作的很好。

疑惑的地方是:

在开发环境下,它会自动从resource目录下按setBaseSqlTemplatePath设置的路径扫描加载,这很正常。

在生产环境下,我把config目录下的sql模板文件全部删掉(编译打包后,maven会自动把resource下的模板文件复制到config目录下)。它也会自动从jar加载,这也很正常。

那么疑惑来了:如果生产环境下,在升级更新系统的时候,往往会只替换自己的程序jar,而jar里会打包进去最新的模板文件,但config目录下忘了用最新的sql文件覆盖。此时,config目录下可能会出现比jar文件里少某几个sql文件的情况,也会出现虽然个数都对,某个sql文件内容修改了的情况。这个时候重启程序,它是优先从jar加载还是从config目录下加载呢?

也做了一些试验,但还是想从官方这里得到确切的答复。

评论区

JFinal

2023-09-07 13:52

优先从 jar 包中加载, 打包时 sql 模板文件不要生成到 config 目录下,通过配置排除掉

zzutligang

2023-09-07 18:46

@JFinal 感谢回复!还不知道怎么在pom文件里配置打包时剔除resource里面的sql模板文件!

JFinal

2023-09-07 19:36

@zzutligang 参考 jfinal-admin 或者 jfinal-club

大致是配置一下 pom.xml 中的 resoures
${project.basedir}/src/main/java **/*.sql **/*.jf ${project.basedir}/src/main/resources 然后在 package.xml 中将 sql 排除在外,不 copy

JFinal

2023-09-07 19:40

参考 jfinal-admin 或者 jfinal-club,大致是配置一下 pom.xml 中的 resoures

<!--
添加 includes 配置后,excludes 默认为所有文件 **/*.*,反之亦然
该规则在 maven-jar-plugin 等插件中同样适用
-->
<resources>
<!-- 添加该配置是为了将 .sql 文件打入 jar 包 -->
<resource>
<!-- 注意 IDEA 下必须要使用 ${project.basedir}/ 前缀,否则不生效 -->
<directory>${project.basedir}/src/main/java</directory>
<includes>
<!-- **/* 前缀用法,可以匹配所有路径 -->
<include>**/*.sql</include>
<include>**/*.jf</include>
</includes>
</resource>

<!--
没有添加 resources 配置时,src/main/resources 目录是默认配置
一旦添加 resources 配置指向 src/main/java 目录时,原先的默认配置被取代,
所以需要添加如下配置将默认配置再添加进来,否则无法使用 src/main/resources
下的资源文件
-->
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>

然后在 package.xml 中将 sql 排除在外,不 copy

JFinal

2023-09-07 19:44

package.xml 中大致这么配置:

<!-- src/main/resources 全部 copy 到 config 目录下 -->
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/*.sql</exclude>
</excludes>
<outputDirectory>config</outputDirectory>
</fileSet>

zzutligang

2023-09-07 20:19

@JFinal 十分感谢,我刚试出来。这个只会排除sql文件,不会排除包含sql的目录,我又增加了sql/这样,连目录页不会复制过了,这样,jar里会包含sql目录以及文件,分发压缩包里的config目录下就不会包含sql目录和sql文件。完美。

JFinal

2023-09-10 12:10

@zzutligang 超赞

对于打包:通过配置,让 sql 留在 jar 文件内,不要复制到 config 目录

对于开发:通过配置,确保 target/classes 下面存在 sql 文件,否则程序无法启动

热门反馈

扫码入社