首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
jfinal3.4 利用 Engine 结合模板生成 model 时, 提示无法找到 jf 文件
lantsui
2019-03-10 17:25
环境: mac + idea + jfinal3.4:
但文件其实是存在的, 请问是什么问题?
项目:
JFinal
评论区
lantsui
2019-03-10 17:31
public ClassPathSource(String baseTemplatePath, String fileName, String encoding) {
this.finalFileName = this.buildFinalFileName(baseTemplatePath, fileName);
this.fileName = fileName;
this.encoding = encoding;
this.classLoader = this.getClassLoader();
this.url = this.classLoader.getResource(this.finalFileName);
if (this.url == null) {
throw new IllegalArgumentException("File not found : \"" + this.finalFileName + "\"");
} else {
this.processIsInJarAndlastModified();
}
}
跟了下源码, 为什么模板会从 classLoader 去找的?
回复
JFinal
2019-03-10 17:34
生成器中用到的 Engine 对象有下面的配置:
engine.setToClassPathSourceFactory();
那么它将从 class path 与 jar 包中寻找模板,你的代码要去掉 "/" + PathKit.getWebRootPath() 这一部分,只留最后一部分
注意:建议模板文件放在 src/main/resources 下面,然后可以只填模板文件名。因为 src/main/resources 的资源相当于是 class path
回复
JFinal
2019-03-10 17:35
src/main/resources 下面的所有文件会被编译器复制到 target/classes 下面去,而 target/classes 是 class path
回复
JFinal
2019-03-10 17:37
补充一下,换模板文件可以直接使用 Generator. setModelTemplate("my_model_template.jf") 方法,不必继承
回复
lantsui
2019-03-10 18:03
@JFinal
按照波哥的建议, 我将模板文件移到 resource 下去的确可以;但有个疑问, 如果我是设成 this.template = "/src/main/java//com/jlayui/codegen/model/base_model_template.jf";这样的话, 就还是报文件没找到, 是否需要修改 engine 的 factory?
回复
JFinal
2019-03-10 19:01
前面说过了,是从 class path 与 jar 包中寻找模板,那么你的:
this.template = "/src/main/java/com/jlayui/codegen/model/base_model_template.jf";
就相当于是从:"项目根目录/target/classes/src/main/java/com/jlayui/codegen/model/base_model_template.jf" 这里找模板
你确定上面的目录下面真的存在模板文件?
既然说过了是从 class path 或者 jar 包中找,为何不写成:
this.template = "com/jlayui/codegen/model/base_model_template.jf"
回复
lantsui
2019-03-10 19:05
@JFinal
把"/" + PathKit.getWebRootPath() 这一部分去掉后, 还是会报找不到文件; 我试在在我的类里去修改 engine.SourceFactory 也可以执行:
public class ModelClazzGenerator extends ModelGenerator {
public ModelClazzGenerator(String modelPackageName, String baseModelPackageName, String modelOutputDir) {
super(modelPackageName, baseModelPackageName, modelOutputDir);
FileSourceFactory fileSourceFactory = new FileSourceFactory();
this.engine.setSourceFactory(fileSourceFactory);
this.template = "/src/main/java/com/jlayui/codegen/model/model_template.jf";
}
}
请问是否还有别的做法?
移动模板文件到 resource 下是可以的, 想看看我那种模板文件路径是否有别的解决方案。
回复
JFinal
2019-03-10 19:06
你得看文档,搞清楚 ClassPathSourceFactory 是怎么用的,不要猜谜:https://www.jfinal.com/doc/6-2
模板加载方式就两种,一是从普通目录加载,一种是从 class path / jar 包加载
回复
JFinal
2019-03-10 19:10
补充一下,我前面说的一句:“那么它将从 class path 与 jar 包中寻找模板,你的代码要去掉 "/" + PathKit.getWebRootPath() 这一部分,只留最后一部分”
其中的“只留最后一部分”,这个说得不精确,因为你最后一部分包括了:"src/main/java", 显然是错误的
在第四个回复里面已经纠正并给出了代码,你没仔细看:
this.template = "com/jlayui/codegen/model/base_model_template.jf"
回复
lantsui
2019-03-12 08:56
@JFinal
知道为什么我那种方式不行了, maven 项目的话, 编译非 java 文件的话, 需要在 pom.xml 中加入:
src/main/java
**/*.jf
false
感谢波哥, 麻烦波哥了;
回复
lantsui
2019-03-12 08:57
@lantsui
标签被过滤了...
回复
JFinal
2019-03-12 11:33
@lantsui
src/main/resources 下的所有文件,默认会被 copy 到 target/classes 之下,如果有目录结构也会被保留
可能是你的项目过滤了相关配置,没有 copy 过去
回复
发送
我要反馈
热门反馈
扫码入社
this.finalFileName = this.buildFinalFileName(baseTemplatePath, fileName);
this.fileName = fileName;
this.encoding = encoding;
this.classLoader = this.getClassLoader();
this.url = this.classLoader.getResource(this.finalFileName);
if (this.url == null) {
throw new IllegalArgumentException("File not found : \"" + this.finalFileName + "\"");
} else {
this.processIsInJarAndlastModified();
}
}
跟了下源码, 为什么模板会从 classLoader 去找的?