添加本地Jar包后启动报错

我下载了淘宝的SDK放在本地目录WEB_INF/lib下,然后在maven配置包的本地路径,启动之后报错

java.lang.RuntimeException: Plugin start error: com.jfinal.plugin.activerecord.ActiveRecordPlugin. 

File not found : E:\WorkSpace\boxbackend\file:\E:\WorkSpace\boxbackend\src\main\webapp\WEB-INF\lib\taobao-sdk-java-auto_1479188381469-20200428-source.jar!/sql/all_sql.sql

调试之后发现Config启动之后,获取PathKit.getRootClassPath()路径异常了

因为之前也下载了微信支付的SDK,以同样的方式配置的maven,是可以正常启动的,请教下是哪里的问题呢?

image.png

image.png


image.png

评论区

JFinal

2020-04-29 13:51

删掉这行代码:
arp.setBaseTemplatePath(...) 这行代码

改为在添加时使用路径,例如:
arp.addSqlTemplate("/sql/all_sql.sql");


或者你改成:
arp.setBaseTemplatePath("/sql");

然后添加的时候:
arp.addSqlTemplate("all_sql.sql");

总之不要使用 PathKit.getRootClassPath()

JFinal

2020-04-29 13:54

原因是: sql 管理使用的 enjoy Engine 对象默认配置了:
engine.setToClassPathSourceFactory();

将会去 class path 和 jar 包中找模板,而 class path 与 jar 包内的子目录是不可能存在 PathKit.getRootClassPath() 子目录的

opal

2020-05-02 20:53

要增加一个复合的 isource实现,参考freemarker的MultiTemplateLoader。
内部有一个isource 列表,按顺序调用getTemplate,找到就返回。

JFinal

2020-05-03 00:43

@opal 通过扩展 ISource 可以很容易实现和个自己的 MultiTemplateSource

opal

2020-05-03 07:23

public class MultiSourceFactory implements ISourceFactory {
public ISource getSource(String baseTemplatePath, String fileName, String encoding) {
try{
return new ClassPathSource(null, fileName, encoding);
}catch(Exception ex){
return new FileSource(baseTemplatePath, fileName, encoding);
}
}
}

JFinal

2020-05-03 10:38

@opal 你给的这个实现是最简单、最省代码的

但是如果 ClassPathSource 一直找不到资源,会一直进入 catch 代码块,而抛出异常是比较耗时的

所以建议参考 ClassPathSource 内部的实现,判断一下资源是否存在,将现有的 try catch 流程改成 if else 的流程

热门反馈

扫码入社