JFinal

登录 注册

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

环境: mac + idea + jfinal3.4:

image.png

image.pngimage.png

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

评论

  • 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 去找的?
  • 03-10 17:34
    生成器中用到的 Engine 对象有下面的配置:
    engine.setToClassPathSourceFactory();

    那么它将从 class path 与 jar 包中寻找模板,你的代码要去掉 "/" + PathKit.getWebRootPath() 这一部分,只留最后一部分

    注意:建议模板文件放在 src/main/resources 下面,然后可以只填模板文件名。因为 src/main/resources 的资源相当于是 class path
  • 03-10 17:35
    src/main/resources 下面的所有文件会被编译器复制到 target/classes 下面去,而 target/classes 是 class path
  • 03-10 17:37
    补充一下,换模板文件可以直接使用 Generator. setModelTemplate("my_model_template.jf") 方法,不必继承
  • 03-10 18:03
    @JFinal 按照波哥的建议, 我将模板文件移到 resource 下去的确可以;但有个疑问, 如果我是设成 this.template = "/src/main/java//com/jlayui/codegen/model/base_model_template.jf";这样的话, 就还是报文件没找到, 是否需要修改 engine 的 factory?
  • 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"
  • 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 下是可以的, 想看看我那种模板文件路径是否有别的解决方案。
  • 03-10 19:06
    你得看文档,搞清楚 ClassPathSourceFactory 是怎么用的,不要猜谜:https://www.jfinal.com/doc/6-2

    模板加载方式就两种,一是从普通目录加载,一种是从 class path / jar 包加载
  • 03-10 19:10
    补充一下,我前面说的一句:“那么它将从 class path 与 jar 包中寻找模板,你的代码要去掉 "/" + PathKit.getWebRootPath() 这一部分,只留最后一部分”

    其中的“只留最后一部分”,这个说得不精确,因为你最后一部分包括了:"src/main/java", 显然是错误的

    在第四个回复里面已经纠正并给出了代码,你没仔细看:
    this.template = "com/jlayui/codegen/model/base_model_template.jf"
  • 03-12 08:56
    @JFinal 知道为什么我那种方式不行了, maven 项目的话, 编译非 java 文件的话, 需要在 pom.xml 中加入:


    src/main/java

    **/*.jf

    false



    感谢波哥, 麻烦波哥了;
  • 03-12 08:57
    @lantsui 标签被过滤了...
  • 03-12 11:33
    @lantsui src/main/resources 下的所有文件,默认会被 copy 到 target/classes 之下,如果有目录结构也会被保留

    可能是你的项目过滤了相关配置,没有 copy 过去
  • 发送