2019-08-22 16:41

@新手的呐喊 如果 jar 包内没有 log4j.properties 文件,而是放在 config 目录下面的话,应该是可以被加载的,除非 log4j 加载配置用了不一样的 ClassLoader

你在前面谈到用的是 log4j的classloader是 sun.misc.Launcher.AppClassLoader,正常情况下是不应该的

或许是 log4j 自己有代码去拿了这个 parent class loader

jfinal 为其它配置文件的加载做过测试,是可以从 config 目录下去拿的, log4j.properties 文件没有做过这个测试

2019-08-22 16:13

@kehuadong 这个办法很赞,百度网盘下载速度太慢了

2019-08-22 16:13

@新手的呐喊 其实 jfinal 的默认打包方式已经足够方便了,文件并不多,所有的 class 文件也打成了 jar 包

fatjar 还是建议啥配置都不用改的情况下使用。 为此,jfinal-undertow 还提供了命令行传参的方式来启动,注意看下面代码的第 188 行:
https://gitee.com/jfinal/jfinal-undertow/blob/jfinal-undertow-1.9/src/main/java/com/jfinal/server/undertow/UndertowServer.java

命令行可以这样用:
java -Dundertow.port=8080 -Dundertow.host=0.0.0.0 -jar my-project.jar

另外还有三个参数也可以这样来传递,也就是说,fatjar 的用法已经将常用的参数可以在配置文件之外优先传递了

这些努力都是为了让你在使用 fatjar 时不必再改配置文件,更不必去添加 config 目录

2019-08-22 16:08

@happyboy 这个应该是数据源连接池的问题,连接池需要定期对池里的 Conection 对象进行一点操作,和服务端互动一下,否则服务端会在超过一定时间后主动断开连接

当服务端断开连接以后,你再发请求就需要一个建立连接的时间,比较耗时

数据库服务端主动断开连接是一种保护机制,主动回收资源

2019-08-22 16:06

@思维炮弹 只要是从 Controller、Interceptor、Validator 这三个组件开始 @Inject 注入的,沿路下来,一直都可以 @Inject

我估计你没成功是别的原因,你是不是在 Controller 的父类中注入了,这个要配置:
me.setInjectSuperClass(true)

最后,注入功能默认是不开启的,需要你配置一下:
me.setInjectDependency(true);

2019-08-21 20:58

@weiyie jfinal 4.4 对格式严格性这唯一的例外进行了改进,这回完美了,建议升级到 4.4,新版本已推送到了 maven 中心库,极度好用

2019-08-21 20:49

速度很快, 链接去掉 target="_blank" 体验会好些

2019-08-21 20:30

INFO 提示你连接关闭这个才正常,不关闭证明有资源泄漏

此外,提示信息是 INFO,这个是很恰当的输出,你需要将日志级别调整到 warn、error 之类的就不会输出这类信息

2019-08-21 20:28

可能是 setnx 是 redis 后来加的,所以没有添加上

没有加的 API,可以通过 Redis.use().getJedis().setnx(...) 这种方式来支持,建议写一个工具类来支持,例如工具类取名叫:
RedisKit.java

将一些没有加的方法添加进去,注意,加的时候别忘了要在 finally 块中关闭 jedis.close(), 以释放资源,具体的 close 代码可以参考 jfinal 的 redis 相关代码

还有一个办法是直接修改 jfinal 源码加进去,再将 jfinal 打包成自己的版本使用。

最好的办法是将 jfinal 的 redis 插件代码单拿出来,自己改掉它,当成一个小工具包使用,这个办法可以不用改 jfinal 源码,有利于将来升级 jfinal

2019-08-21 16:41

你开启了嵌套事务,很可能是外层你还用了 @Before(Tx.class)

在控制台看一下 jfinal action report 中输出的拦截器信息,找一找 Tx.class 是不是存在,用 @Clear(Tx.class) 删之

2019-08-21 16:38

这个问题并不是异常,而仅仅是个警告,并且提示信息告知要使用更短的 maxLifetime 值

而你设置的值太大了

这个可能还不是关键问题,或许是你自己有代码提前关闭了 Connection

搜索一下你的代码有没有这种 getConnection(), 如果是自行获取连接,建议: getDataSource().getConnection() , 这样更安全,因为前者你获取到的可能是一个 ThreadLocal 中的连接,如果你开启了事务,线程后续还需要使用该 ThreadLocal 就会有问题

不过这个可能性很小,因为这种情况大概率会报异常而不是警告

2019-08-21 16:34

@老宇

@老高 jfinal sql 管理的美妙之处在于,除了三个 sql 管理的专用指令以外,你还可以使用 enjoy 模板引擎的其她所有功能,自由、强大、方便、高效

2019-08-21 16:32

@Inject 注入并不是所有地方都可以使用,例如你自己写的工具类中就无法获取,需要使用:
Aop.get(...) 获取

@Inject 可以使用的地方如下:
1:Controller 中
2:Interceptor 中
3:Validator 中
4:以上三个组件注入的组件的子组件,例如:
MyController 中使用 @Inject Aaa 注入了 Aaa 对象, Aaa 中又使用了 @Inject Bbb 注入了 Bbb 对象,这样可以一直无限注入下去

简单说,只要是从上述三个组件开始注入的,就可以一直不停地注入下去

但是,假定你有一个 MyKit , 该类的实例化对象如果是在上述三个组件中注入的是可以的,否则需要使用 Aop.get(...)

上述机制的原因如下:
使用 @Inject 注入需要 jfinal 接管对象的创建,而 Controller、Interceptor、Validator 组件的创建本身就是 jfinal 接管的,所以在这三类组件中可以使用 @Inject

文档中已经说得很详细:
https://www.jfinal.com/doc/4-5
注意看红色字体强调的部分

2019-08-20 20:39

总结就是: 需要改配置就不要打 fatjar , 否则 "非 fatjar" 更方便,因为这种模式的目录并不多,文件也不多

2019-08-20 20:38

用 winrar 打开 jar 包看看里头有没有 log4j.properties

jar 包中的配置文件被加载的优先级始终高于 config 目录下面

既然你都有 config 目录了,建议不要打成 fatjar

如果一定要打成 fatjar ,将 log4j.properties 中的配置改好以后再打包,多省事