Jfinal 为什么报类找不到,明明已经引入jar了。

颖辉小居 发布于 2017/05/31 16:44
阅读 2K+
收藏 0

buildpath:

继续刷新报错变为:

[ERROR] [2017-05-31 17:40:12,979] [qtp245565335-23:34761] [com.jfinal.core.ActionHandler handle] /blog
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
	at com.jfinal.aop.Invocation.invoke(Invocation.java:87)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:74)
	at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:48)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:74)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1307)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:453)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
	at org.eclipse.jetty.server.Server.handle(Server.java:365)
	at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
	at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926)
	at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
	at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:73)
	... 26 more
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.jfinal.render.JspRender
	at com.jfinal.render.RenderFactory.getJspRender(RenderFactory.java:79)
	at com.jfinal.core.Controller.renderJsp(Controller.java:998)
	at demo.controller.BlogController.index(BlogController.java:11)
	... 31 more

project-clean,重启eclipse 重启电脑都试过了

而且奇怪的是使用JFinal.start启动就会报上面的错误。

public static void main(String[] args) {
		JFinal.start("src/main/webapp",80, "/", 5);
	}

使用eclipse配置的tomcat启动就没有这个问题。

而且这个错误都出现在包含render("add.jsp");的action中

已经设置:

constants.setViewType(ViewType.JSP);//设置render()的默认渲染类型

我的依赖:

我检查了和jfinal3.1的demo依赖包版本一样啊

2017年5月31日19:28:40

我重新建了一个maven工程,一步步重新手敲,还是一样的错误,下面我贴出完整代码:

目录结构:

POM.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>yh</groupId>
	<artifactId>jFinal2</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>jFinal2 Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api 
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.0.1</version>
			<scope>provided</scope>
		</dependency>-->
		<dependency>
			<groupId>com.jfinal</groupId>
			<artifactId>jfinal</artifactId>
			<version>3.1</version>
		</dependency>
		<dependency>
			<groupId>com.jfinal</groupId>
			<artifactId>jetty-server</artifactId>
			<version>8.1.8</version>
			<!-- 此处的 scope 值为 compile 仅为支持 IDEA 下启动项目 打 war 包时需要改成 provided,以免将一些无用的 
				jar 打进去 -->
			<scope>compile</scope>
		</dependency>

	</dependencies>
	<build>
		<finalName>jFinal2</finalName>
		<plugins>
			<!-- 指定maven编译方式为jdk1.8版本 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>

		</plugins>
	</build>
</project>

/jFinal2/src/main/java/yh/jfinal/Config.java 

package yh.jfinal;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.template.Engine;

import yh.jfinal.route.IndexRoute;

public class Config extends JFinalConfig {

	@Override
	public void configConstant(Constants me) {
		me.setDevMode(true);

	}

	@Override
	public void configRoute(Routes me) {
		me.add(new IndexRoute());

	}

	@Override
	public void configEngine(Engine me) {
		// TODO Auto-generated method stub

	}

	@Override
	public void configPlugin(Plugins me) {
		// TODO Auto-generated method stub

	}

	@Override
	public void configInterceptor(Interceptors me) {
		// TODO Auto-generated method stub

	}

	@Override
	public void configHandler(Handlers me) {
		// TODO Auto-generated method stub

	}

	public static void main(String[] args) {
		JFinal.start("src/main/webapp", 82, "/", 5);
	}
}

/jFinal2/src/main/java/yh/jfinal/controller/IndexController.java

package yh.jfinal.controller;

import com.jfinal.core.Controller;

public class IndexController extends Controller {
	public void index() {
		//这里就有问题
		renderJsp("index.jsp");
	}
	
	public void index2() {
		renderText("字符串就没问题");
	}

}

/jFinal2/src/main/java/yh/jfinal/route/IndexRoute.java

package yh.jfinal.route;

import com.jfinal.config.Routes;

import yh.jfinal.controller.IndexController;

public class IndexRoute extends Routes {

	@Override
	public void config() {
		add("/", IndexController.class);
	}

}

/jFinal2/src/main/webapp/WEB-INF/web.xml 

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
	<display-name>Archetype Created Web Application</display-name>

	<filter>
		<filter-name>jfinal</filter-name>
		<filter-class>com.jfinal.core.JFinalFilter</filter-class>
		<init-param>
			<param-name>configClass</param-name>
			<param-value>yh.jfinal.Config</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>jfinal</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

/jFinal2/src/main/webapp/index.jsp 

<%@ page pageEncoding="UTF-8"%>
<html>
<body>
	<h2>只想打开这个页面</h2>
</body>
</html>

 

加载中
1
JFinal
JFinal

如果是 jetty 下启动,添加 jetty 对 jsp 的支持:

<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-jsp</artifactId>
  <version>8.1.8.v20121106</version>
  <scope>provided</scope>
</dependency>

   注意上面这个配置中的 scope 为 provided 可以避免打 war 包时将 jsp 的 jar 打进去,部署时不需要这个包。如果是 IDEA 下开发,这个 scope 需要先改为 compile 才能启动项目,打包时记录再改成 provided

颖辉小居
颖辉小居
非常感谢您的帮助,这个是正解。
0
JFinal
JFinal

注意一下是不是对老版本的 jfinal 仍然有未发现的依赖,删干净一下

颖辉小居
颖辉小居
您好,我重新建了一个简易版的工程还是一样的问题,我已经把代码都贴出来了,请你重新刷新一下上面的问题描述,谢谢
颖辉小居
颖辉小居
你好,我又一次新建项目还是一样的问题,里面的代码配置我都是手动敲或者复制官方文档,没有copy以前任何工程的源码。只要是renderJsp(XXX.jsp) 就会报这个错误,情况完全一样。使用tomcat启动就没有这个问题。
颖辉小居
颖辉小居
你好,我的buildpath中除了jre1.8 都在maven中了,我一个个对比了jar包的版本,和jfinal3.1的demo的依赖版本都一致。我尝试删除本地依赖库,重新下载,结果还是一样。
0
绝对是路过

你要确定你的运行环境中有这个jar包,举个例子,你在tomcat中运行,配置的server.xml文件,你就要确定配置目录下面有这个jar。如果确定有,看下maven依赖是否冲突,存在多个不同版本的jar包

颖辉小居
颖辉小居
我确定有这个jar包,在maven 的library下可以看到这个jar包,展开也可以看到错误所找不到的类,pom中我没有加任何scop标签。我又跟着官方文档一步一步做还是一模一样的问题。
0
绝对是路过

引用来自“绝对是路过”的评论

你要确定你的运行环境中有这个jar包,举个例子,你在tomcat中运行,配置的server.xml文件,你就要确定配置目录下面有这个jar。如果确定有,看下maven依赖是否冲突,存在多个不同版本的jar包

src/main/webapp/WEB-INF/lib包正确吗?

颖辉小居
颖辉小居
回复 @绝对是路过 : 你好已经找到原因了,是在jfinal作者的帮助下解决的,详情请看被采纳的答案,最后非常感谢您的热心帮助。
绝对是路过
回复 @颖辉小居 : 刚刚看了下jfinal 已经在运行环境中加入了jar,你这个是撒原因就搞不懂了。。。
颖辉小居
颖辉小居
回复 @绝对是路过 : 您好,我已经把代码都贴出来了,请你重新刷新一下上面的问题描述。
绝对是路过
回复 @颖辉小居 : 我看看下,有可能我理解有误
颖辉小居
颖辉小居
这个是maven工程,依赖的包都在maven的本地仓库中,难道我还要一个个找到它们,在webapp下新建一个lib文件夹,再把jar包都拷贝到这个目录下面吗?
下一页
返回顶部
顶部