java - jetty嵌入jsp问题

标签 java jsp embedded-jetty

我正在尝试运行一个非常简单的嵌入了jetty的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时我仍然得到:

  1. java.lang.IllegalStateException:ServletContext 中未设置 org.apache.tomcat.InstanceManager
  2. org.apache.jasper.JasperException:无法编译 JSP 类

代码是here

当我发现问题时,我会继续发布更新。

最佳答案

您必须为 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% 不兼容。

Important: For success with JSP, Use a proper build system (choose one of the following: maven, ant+ivy, buildr, grails, grape, sbt, or leiningen). Don't skip this, don't work around this, don't try to do it manually.

使用正确的 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 文物。

http://search.maven.org/#artifactdetails%7Corg.eclipse.jetty%7Cjetty-annotations%7C9.4.8.v20171121%7Cjar

这将引入您的 JSP Web 应用程序所需的正确的 asm jar 和适当的依赖项。

您需要来自 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 支持需要考虑的一些事项:

  • 不要在 OSGi 中捆绑(JSTL/EL/Standard 库不支持这种用法。主要是由于类加载器的期望)
  • 不要使用 Java 9+ JPMS 模块(JSTL/EL/Standard 库不支持这种用法,主要是由于类加载器期望和资源 URL 期望)
  • 不要创建 uber jar(JSTL/EL/Standard 库不支持此功能)
  • 不要以任何方式重新打包 JSTL jar,它们需要保留为文件系统上可用的 JSTL/EL/Standard jar。
  • 不要创建自定义类加载器。 (JSTL/EL/标准库期望类加载器的定义非常狭窄)

关于java - jetty嵌入jsp问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48928954/

相关文章:

java - 格式化 double 型,左侧和右侧均加零

java - 在jsp中使用java对象

java - 在 log4j 配置的嵌入式 Jetty 应用程序中看不到 logback 日志

jsp - 如何在单个安装程序中捆绑 JSP tomcat Web 应用程序

java - Jetty 支持来自 SoapUI 的 TLS 1.2 请求

servlets - Jetty 7 的 websocket、servlet 和资源处理程序的嵌入式配置

java - 无法从一个 .java 中运行另一个 .java 中的公共(public)类

java - 在 Android 中组合来自服务器的 JSON 表

上下文中的 Java 类路径

java - 如何在jsp页面调用jasper报表