繁体   English   中英

码头嵌入式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时,我仍然得到:

  1. java.lang.IllegalStateException:ServletContext 中没有设置 org.apache.tomcat.InstanceManager
  2. org.apache.jasper.JasperException:无法为 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 工件的版本保持一致。

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

这将引入正确的 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 支持需要考虑的一些事项:

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

想在此处发布此内容,因为在将旧版应用程序从 tomcat 迁移到码头后遇到了类似的问题。 我得到了java.lang.IllegalStateException: No org.apache.tomcat.InstanceManager set in ServletContext异常,但没有你提到的其他异常。 考虑到这是在搜索该错误时显示的第一篇文章,我觉得这是最合适的发布位置。

在做了广泛的研究之后,我遇到了这个线程 如线程所示,当码头缺少某些模块时,可能会引发该错误。 在这种特殊情况下,缺少的模块是plusannotations

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

您也可以使用addAfteraddBefore函数以编程方式执行此操作。 这里要注意的一件事是,您以编程方式添加模块的顺序很重要,因此请注意添加它们的位置。 这是一个示例片段:

//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.xmljetty-annotations.xml文件的内容。

码头加.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

<?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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM