jfinal3.4 利用 Engine 结合模板生成 model 时, 提示无法找到 jf 文件

环境: mac + idea + jfinal3.4:

image.png

image.pngimage.png

但文件其实是存在的, 请问是什么问题?

评论区

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 过去