[英]Issues while using Jetty Embedded to handle JSP. (JasperException: Unable to compile class for JSP)
[英]jetty embedded jsp issues
我正在尝试运行一个嵌入了码头的非常简单的 java 服务器。 我正在使用 gradle 来编译它,但为简单起见,我将只描述我尝试开始我的过程的方式
start.bat
com
test
worktest
Starter.class
WebServer.class
./lib:
asm-3.2.jar
cglib-nodep-2.2.jar
ecj-3.12.3.jar
gentyref-1.2.0.jar
gson-2.8.2.jar
javax.servlet-api-3.1.0.jar
jetty-http-9.4.8.v20171121.jar
jetty-io-9.4.8.v20171121.jar
jetty-jsp-2.1-7.5.4.v20111024.jar
jetty-security-9.4.8.v20171121.jar
jetty-server-9.4.8.v20171121.jar
jetty-servlet-9.4.8.v20171121.jar
jetty-util-9.4.8.v20171121.jar
jetty-webapp-9.4.8.v20171121.jar
jetty-xml-9.4.8.v20171121.jar
mockachino-0.6.2.jar
objenesis-1.2.jar
slf4j-api-1.7.25.jar
slf4j-simple-1.6.2.jar
tomcat-api-9.0.5.jar
tomcat-el-api-9.0.5.jar
tomcat-jasper-9.0.5.jar
tomcat-jasper-el-9.0.5.jar
tomcat-jsp-api-9.0.5.jar
tomcat-juli-9.0.5.jar
tomcat-servlet-api-9.0.5.jar
tomcat-util-9.0.5.jar
tomcat-util-scan-9.0.5.jar
./web:
index.jsp
./web/js:
jquery-1.7.1.min.js
start.bat 看起来像这样
cat start.bat
set JAVA_STARTER="com.test.worktest.Starter"
set CLASSPATH=".\lib\*;."
java -cp %CLASSPATH% %JAVA_STARTER%
服务器启动得很好但是当我尝试访问 localhost:port 我得到
Problem accessing /index.jsp. Reason:
JSP support not configured
我在 jdk 9.0.1 上。
第2部分
按照下面的答案,我对我的 gradle 脚本进行了一些更改。 摆脱了不兼容的部门。
我还发现 asm3.0 是 mockachino 的一个 dep。 它现在消失了。 目前我看起来像:
dependencies {
compile 'com.google.code.gson:gson:2.8.2'
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
runtime group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
compile group: 'org.eclipse.jetty', name: 'jetty-http', version: '9.4.8.v20171121'
compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.8.v20171121'
compile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.8.v20171121'
compile group: 'org.eclipse.jetty', name: 'jetty-webapp', version: '9.4.8.v20171121'
compile group: 'org.eclipse.jetty', name: 'apache-jsp', version: '9.4.8.v20171121'
compile group: 'org.eclipse.jetty', name: 'jetty-annotations', version: '9.4.8.v20171121'
compile 'javax.servlet:javax.servlet-api:3.1.0'
testCompile group: 'se.mockachino', name: 'mockachino', version: '0.6.2'
testCompile group: 'junit', name: 'junit', version: '4.11'
}
和我的 lib 文件夹:
apache-el-8.5.23.jar
apache-jsp-8.5.23.jar
apache-jsp-9.4.8.v20171121.jar
asm-6.0.jar
asm-commons-6.0.jar
asm-tree-6.0.jar
ecj-3.12.3.jar
gson-2.8.2.jar
javax.annotation-api-1.2.jar
javax.servlet-api-3.1.0.jar
jetty-annotations-9.4.8.v20171121.jar
jetty-http-9.4.8.v20171121.jar
jetty-io-9.4.8.v20171121.jar
jetty-jndi-9.4.8.v20171121.jar
jetty-plus-9.4.8.v20171121.jar
jetty-schemas-3.1.jar
jetty-security-9.4.8.v20171121.jar
jetty-server-9.4.8.v20171121.jar
jetty-servlet-9.4.8.v20171121.jar
jetty-util-9.4.8.v20171121.jar
jetty-webapp-9.4.8.v20171121.jar
jetty-xml-9.4.8.v20171121.jar
slf4j-api-1.7.25.jar
slf4j-simple-1.7.25.jar
访问jsp时,我仍然得到:
代码在这里
当我发现事情时,我会继续发布更新。
您必须为 Jetty 设置 JSP,仅存在 JAR 是不够的。
应从您的项目中删除以下 JAR。
jetty-jsp-2.1-7.5.4.v20111024.jar
tomcat-api-9.0.5.jar
tomcat-el-api-9.0.5.jar
tomcat-jasper-9.0.5.jar
tomcat-jasper-el-9.0.5.jar
tomcat-jsp-api-9.0.5.jar
tomcat-juli-9.0.5.jar
tomcat-servlet-api-9.0.5.jar
tomcat-util-9.0.5.jar
tomcat-util-scan-9.0.5.jar
jetty-jsp
对 Jetty 9.4.8 无效。
直接/普通/默认 Tomcat 库在 Jetty 中 100% 不兼容。
重要提示:要成功使用 JSP,请使用合适的构建系统(选择以下之一:maven、ant+ivy、builder、grails、grails、sbt 或 leiningen)。 不要跳过这个,不要解决这个问题,不要尝试手动完成。
使用适当的servlet-api
jar。
http://search.maven.org/#artifactdetails%7Cjavax.servlet%7Cjavax.servlet-api%7C3.1.0%7Cjar
如果您要部署到 JDK,或者打算在 JSP 中使用 Java 1.7(或更新的)功能,请删除ecj-3.12.3.jar
。 默认情况下,将使用 JDK 编译器(如果存在)。 不要忘记在JettyJspServlet
配置上配置您想要的源/目标级别。
确保为 Jetty 9.4.8 使用有效的 ASM jar。
删除它,因为它不兼容:
asm-3.2.jar
确保您使用来自org.eclipse.jetty
组 id 的jetty-annotations
工件(和瞬态依赖项),与其他 jetty 工件的版本保持一致。
这将引入正确的 asm jar 和 JSP web 应用程序所需的适当依赖项。
您将需要来自org.eclipse.jetty
组 id 的apache-jsp
工件(和瞬态依赖项),与其他 jetty 工件的版本保持一致。
http://search.maven.org/#artifactdetails%7Corg.eclipse.jetty%7Capache-jsp%7C9.4.8.v20171121%7Cjar
这将引入您需要的正确 JSP 支持库(和 JSTL/EL)。
然后您需要为 JSP 进行配置。
请参阅https://github.com/jetty-project/embedded-jetty-jsp 上的示例项目
最后,使用 JSP/JSTL/EL 支持需要考虑的一些事项:
想在此处发布此内容,因为在将旧版应用程序从 tomcat 迁移到码头后遇到了类似的问题。 我得到了java.lang.IllegalStateException: No org.apache.tomcat.InstanceManager set in ServletContext
异常,但没有你提到的其他异常。 考虑到这是在搜索该错误时显示的第一篇文章,我觉得这是最合适的发布位置。
在做了广泛的研究之后,我遇到了这个线程。 如线程所示,当码头缺少某些模块时,可能会引发该错误。 在这种特殊情况下,缺少的模块是plus
和annotations
。
Jetty 模块可以通过几种不同的方式启用。 例如,您可以添加--add-to-start=<module-name1>,<module-name2>,…etc.
启动命令的参数:
[mybase]$ java -jar $JETTY_HOME/start.jar --add-to-start=server,deploy,http,jmx,stats,servlets,webapp,logging-log4j,apache-jsp,apache-jstl,plus,annotations
您也可以使用addAfter
和addBefore
函数以编程方式执行此操作。 这里要注意的一件事是,您以编程方式添加模块的顺序很重要,因此请注意添加它们的位置。 这是一个示例片段:
//Create the server
Server server = new Server(8080);
//Enable parsing of jndi-related parts of web.xml and jetty-env.xml
org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList.setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration");
classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration");
添加它们的另一种方法是通过 XML 文件。 这是码头提供的jetty-plus.xml
和jetty-annotations.xml
文件的内容。
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<!-- =========================================================== -->
<!-- Add plus Configuring classes to all webapps for this Server -->
<!-- =========================================================== -->
<Call class="org.eclipse.jetty.webapp.Configuration$ClassList" name="setServerDefault">
<Arg><Ref refid="Server" /></Arg>
<Call name="addAfter">
<Arg name="afterClass">org.eclipse.jetty.webapp.FragmentConfiguration</Arg>
<Arg>
<Array type="String">
<Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>
<Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>
</Array>
</Arg>
</Call>
</Call>
</Configure>
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<!-- =========================================================== -->
<!-- Add annotation Configuring classes to all webapps for this Server -->
<!-- =========================================================== -->
<Call class="org.eclipse.jetty.webapp.Configuration$ClassList" name="setServerDefault">
<Arg><Ref refid="Server" /></Arg>
<Call name="addBefore">
<Arg name="beforeClass">org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Arg>
<Arg>
<Array type="String">
<Item>org.eclipse.jetty.annotations.AnnotationConfiguration</Item>
</Array>
</Arg>
</Call>
</Call>
</Configure>
这些 XML 文件在您使用参数选项添加它们时使用,或者您也可以通过start.ini
文件通过使用--module=<module-name>
添加模块来启用相应的模块来使用它们。
希望这可以帮助某人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.