jfinal4.2报错com.jfinal.aop does not exist

之前一直用的jfinal老版本3.5,一直很稳定,看到4.2发布了,于是决定与时俱进升级一下。但是,问题来了,启动很正常,但是涉及到service调用的基本都报错。注:4.2在本机windows下调试的时候也正常,但是部署到linux服务器上之后出问题了。

Caused by: 
java.lang.ClassNotFoundException: com.work.web.system.daolian.DaoLianService$$EnhancerByJFinal
	at java.lang.ClassLoader.findClass(ClassLoader.java:530)
	at com.jfinal.proxy.ProxyClassLoader.findClass(ProxyClassLoader.java:64)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at com.jfinal.proxy.ProxyClassLoader.loadProxyClass(ProxyClassLoader.java:49)
	at com.jfinal.proxy.ProxyFactory.getProxyClass(ProxyFactory.java:70)
	at com.jfinal.proxy.ProxyFactory.get(ProxyFactory.java:41)
	at com.jfinal.proxy.Proxy.get(Proxy.java:32)
	at com.jfinal.aop.Duang.duang(Duang.java:42)
	at com.work.web.system.daolian.DaoLianService.<clinit>(DaoLianService.java:16)
	at com.work.web.system.daolian.DaoLianController.<init>(DaoLianController.java:20)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at java.lang.Class.newInstance(Class.java:442)
	at com.jfinal.core.ControllerFactory.getController(ControllerFactory.java:25)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:76)
	at com.core.handler.XssHandler.handle(XssHandler.java:31)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:89)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
	at com.core.filter.LoginFilter.chainAdmin(LoginFilter.java:115)
	at com.core.filter.LoginFilter.doFilter(LoginFilter.java:48)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
	at com.core.filter.WebFilter.doFilter(WebFilter.java:86)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
	at com.core.filter.DomainFilter.doFilter(DomainFilter.java:50)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1602)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1588)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1557)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
	at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.Server.handle(Server.java:502)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
	at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:411)
	at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:305)
	at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:159)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
	at java.lang.Thread.run(Thread.java:748)
Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:3: error: package com.jfinal.aop does not exist
import com.jfinal.aop.Invocation;
                     ^
Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:4: error: cannot find symbol
public class SessionService$$EnhancerByJFinal extends SessionService {
                                                      ^
  symbol: class SessionService
Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:6: error: package com.core.tools does not exist
	public  void del(com.core.tools.PageData p0) throws java.lang.Exception {
	                               ^
Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:7: error: cannot find symbol
		Invocation inv = new Invocation(this, 13L,
		^
  symbol:   class Invocation
  location: class com.work.web.system.session.SessionService$$EnhancerByJFinal
Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:7: error: cannot find symbol
		Invocation inv = new Invocation(this, 13L,
		                     ^
  symbol:   class Invocation
  location: class com.work.web.system.session.SessionService$$EnhancerByJFinal

总结一下,以上核心的报错如下:

Caused by: 
java.lang.ClassNotFoundException: com.work.web.system.daolian.DaoLianService$$EnhancerByJFinal

Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:3: error: package com.jfinal.aop does not exist

Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:7: error: cannot find symbol
		Invocation inv = new Invocation(this, 13L,

在社区看到一篇帖子,跟我的情况很像,但是帖子并没有给出解决方案。http://www.jfinal.com/feedback/5931

目前我还在排查原因,尚未解决。已经暂时降到3.5版本了,降级后一切恢复正常。

评论区

JFinal

2019-06-08 10:03

应该是你的运行环境有问题,检查一下安装的是否为 JDK, JRE 是不可以的

再检查 JDK 最低要是 1.8 版本

最后,环境变量 CLASSPATH 最重要,检查配的环境变量,CLASSPATH 配置要是下面这样:
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

如果是 windows 系统,检查环境变量 CLASSPATH 的值为:
%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

记得搞定后回来分享

升级到 4.2 功能、性能各方面要好很多

happyboy

2019-06-09 00:54

@JFinal CLASSPATH的配置稍微有点出入,经过调整后还是一样的问题。jfinal3.5就已经必须用jdk8了吧,所以jdk也不是问题所在。问题持续追踪中。

JFinal

2019-06-09 09:06

@happyboy 检查一下安装的是 JDK 还是 JRE

这个问题一定要解决,要反馈给我,毕竟有两个同学碰到过

JFinal

2019-06-09 09:19

@happyboy CLASSPATH 配置调整完成以后,最后是先退出登录,再重新登录 linux ,然后用下面的命令:
echo $CLASSPATH

看看配置是不是真到位了

badouyuren

2019-06-10 09:02

这个问题我碰到了,我用的是3.8,升级之后出现了类似的问题,赶紧回退了

happyboy

2019-06-10 11:20

@badouyuren 我挨个试过了,我这边3系列的版本都没问题,4.0及以上版本有这个问题。目前还在跟踪这个问题

happyboy

2019-06-10 11:33

@badouyuren 你是3.8升级到4.2吗?

JFinal

2019-06-10 11:46

@happyboy @badouyuren 找到原因后一定要告诉我,我这边很好用,一点事没有

akak

2019-06-10 19:09

今天下午升级系统发现类似问题

2019/06/10 18:54:34.034 [DEBUG] com.jfinal.proxy.ProxyGenerator -
Generate proxy class "com.lingweitech.fw.common.counter.event.CounterGroupWriteEventListener$$EnhancerByJFinal":
package com.lingweitech.fw.common.counter.event;
import com.jfinal.aop.Invocation;
public class CounterGroupWriteEventListener$$EnhancerByJFinal extends CounterGroupWriteEventListener {

public void doEvent(com.lingweitech.fw.common.counter.event.CounterGroupWriteEvent p0) {
Invocation inv = new Invocation(this, 1L,
args -> {
CounterGroupWriteEventListener$$EnhancerByJFinal.super.doEvent(
(com.lingweitech.fw.common.counter.event.CounterGroupWriteEvent)args[0]
);
return null;
}
, p0);

inv.invoke();
}
}
2019/06/10 18:54:35.035 [ERROR] com.jfinal.proxy.ProxyCompiler - /CounterGroupWriteEventListener$$EnhancerByJFinal.java:3: 错误: 程序包com.jfinal.aop不存在
import com.jfinal.aop.Invocation;
^
2019/06/10 18:54:35.035 [ERROR] com.jfinal.proxy.ProxyCompiler - /CounterGroupWriteEventListener$$EnhancerByJFinal.java:4: 错误: 找不到符号
public class CounterGroupWriteEventListener$$EnhancerByJFinal extends CounterGroupWriteEventListener {
^
符号: 类 CounterGroupWriteEventListener
2019/06/10 18:54:35.035 [ERROR] com.jfinal.proxy.ProxyCompiler - /CounterGroupWriteEventListener$$EnhancerByJFinal.java:6: 错误: 找不到符号
public void doEvent(com.lingweitech.fw.common.counter.event.CounterGroupWriteEvent p0) {
^
符号: 类 CounterGroupWriteEvent
位置: 程序包 com.lingweitech.fw.common.counter.event
2019/06/10 18:54:35.035 [ERROR] com.jfinal.proxy.ProxyCompiler - /CounterGroupWriteEventListener$$EnhancerByJFinal.java:7: 错误: 找不到符号
Invocation inv = new Invocation(this, 1L,
^
符号: 类 Invocation
位置: 类 com.lingweitech.fw.common.counter.event.CounterGroupWriteEventListener$$EnhancerByJFinal
2019/06/10 18:54:35.035 [ERROR] com.jfinal.proxy.ProxyCompiler - /CounterGroupWriteEventListener$$EnhancerByJFinal.java:7: 错误: 找不到符号
Invocation inv = new Invocation(this, 1L,
^
符号: 类 Invocation
位置: 类 com.lingweitech.fw.common.counter.event.CounterGroupWriteEventListener$$EnhancerByJFinal

akak

2019-06-10 19:16

回退至jfinal3.8版本恢复正常。

happyboy

2019-06-10 19:20

@akak 咱们的报错是一样的,可能是同一个原因。

akak

2019-06-10 19:39

@happyboy 编译环境、运行环境都检查排除了,用了几个小时还是没有找到原因。无赖中百度搜索一下就到这个帖子了。麻烦@jfianl 给排查处理一下啦。谢谢!

happyboy

2019-06-10 20:43

@akak 波总现在也是一脸茫然,哈哈。

JFinal

2019-06-10 22:59

@akak 你用到的这个 CounterGroupWriteEventListener 应该是不需要被代理的,所以在这个类上用一下 @Clear 注解清除掉全局拦截器即可

@happyboy 这个问题很少人碰到,而且异常提示没有意义,因为异常提示的是找不到 com.jfinal.aop 这个包,而你用 jfinal 开发,这个包是一定存在的

@happyboy @akak 麻烦你们二位能做一个可以重现这个问题的 demo 给我,下载首页的 jfinal demo for maven ,然后将这个 demo 改造为可以重现这个问题,发给我, 我在本地找找原因

happyboy

2019-06-11 10:44

@JFinal 正有此意啊,其实不光com.jfinal.aop找不到,连我们自己写的service也报找不到。

JFinal

2019-06-11 11:08

@happyboy 只要你能做个可以在我本地重现的 demo , 一切都好解决

happyboy

2019-06-11 19:06

@JFinal 郁闷,调了一下午了,从官网首页下载的,怎么玩都没事,在自己系统里就是不行,也没发现哪里不一样。继续调......

JFinal

2019-06-11 20:03

@happyboy 那你将你自己项目中的东东 copy 到 jfinal 官网下载的 demo 中去,然后看能不能重现问题,如果不出问题了,证明是你项目的配置有问题

JFinal

2019-06-15 23:10

@happyboy @akak @badouyuren

这个问题很可能是 tomcat 有丢失 class path 的现象,兼容 tomcat 丢失 class path 的 jfinal 新版本已提交到 gitee.com

尽快试用以后给出反馈,试用办法如下:
1: git clone git@gitee.com:jfinal/jfinal.git
2: cd jfinal
3: vim pom.xml 将其中的 《skip》false《/skip》 改为 《skip》true《/skip》
4: mvn clean install
5: 修改自己项目中的 pom.xml ,将 jfinal 版本号改为 4.3-SNAPSHOT
6: 试用新版本

这个问题很重要,尽快给出反馈

happyboy

2019-06-16 00:48

@JFinal 正想趁夜深人静,继续调试一下的,恰好看到了波总的回复。于是立马做了尝试,天啊撸,真的可以了!真的可以了!真的可以了!重要的事情说三遍。虽然我用的不是tomcat,而是嵌入式jetty,但是问题同样解决了。另外,4.2版本在我本地开发环境下也是没有问题的,只是在linux生产环境下出现了诡异。♪(^∇^*)

JFinal

2019-06-16 08:41

@happyboy 我也是偶然在 Windows 机器上的 tomcat 下看到这个异常,而这两个东东已经很久没用过了

只要能重现问题,一切都好解决

零悦

2019-06-19 12:11

今天升级到4.2也出现此问题,看到此贴,马上升级到4.3,完美解决

happyboy

2019-06-26 15:26

@零悦 估计咱们是第一批用4.3的,^_^

JFinal

2019-06-26 15:29

@零悦 @happyboy 4.3 这几天会发布到中心库去,再打磨几个小功能

张文

2019-06-27 17:32

好的,就等着米下锅了。4.2就不要用了,用4.3 吧