带有tomcat 8.5和Java 8 lambda x的AWS Elastic Beanstalk无法解析为变量

时间:2018-08-15 11:27:12

标签: java amazon-web-services tomcat java-8 elastic-beanstalk

我正在尝试使用tomcat 8.5和Java 8将Java Web应用程序部署到AWS Elastic Beanstalk。 我的Java应用程序包含lambda表达式,但没有编译错误 x无法解析为变量 我检查了我的环境,并使用: System.getProperty("catalina.base"); System.getProperty("java.version"); 并提供正确的Java环境/usr/share/tomcat81.8.0_181 我尝试通过添加以下

在我的应用程序web.xml中使用用户源1.8
<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>compiler</param-name>
        <param-value>modern</param-value>
    </init-param>
    <init-param>
        <param-name>compilerSourceVM</param-name>
        <param-value>1.8</param-value>
    </init-param>
    <init-param>
        <param-name>compilerTargetVM</param-name>
        <param-value>1.8</param-value>
    </init-param>
    <init-param>
        <param-name>suppressSmap</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

我也尝试使用server-update.config对AWS进行自定义配置 container_commands: replace-config: command: cp .ebextensions/web.xml /usr/share/tomcat8/web.xml

但是没有任何效果, 问题是:如何告诉tomcat使用Java 1.8。

编辑:示例代码 我测试过的非常简单的代码

<%!
    String str = "";
%>

<%
    List<String> test = new ArrayList<>();
    test.add("1");
    test.add("2");
    test.add("3");
    test.add("4");
    test.add("5");

    test.stream().forEach(x -> str += x + " - ");
%>

1 个答案:

答案 0 :(得分:0)

我自己遇到了这个问题,我相信答案是:你不能。也就是说,Tomcat确实在1.8以下运行,但是您看到的问题是,它(无法在Elastic Beanstalk上)在JSP中编译 1.8级代码。

为了编译JSP,Tomcat需要两个组件:一个JSP编译器(用于生成Java代码)和一个Java编译器(用于生成字节码)。两个参数compilerSourceVMcompilerTargetVM设置这两个编译的语言级别。

以下只是我的最佳猜测,但在实践中似乎可以证明:

如果Java环境中有Java编译器,则Tomcat可以使用它;否则,Tomcat可以使用它。否则,它依赖于嵌入式编译器。 Tomcat 8.x针对Java 1.7,因此其嵌入式编译器为1.7编译器。您的开发环境几乎可以肯定包含一个1.8编译器,因此您提供的配置可以正常工作。但是Elastic Beanstalk是在缺少编译器的Java环境下配置的,因此Tomcat 8.x支持的最高语言级别是1.7。

Tomcat 9针对Java 1.8,因此包含一个1.8级的嵌入式编译器。无论运行时环境中是否有Java编译器,它都应该能够支持您的配置。但是,Elastic Beanstalk(在撰写本文时)不支持Tomcat 9,因此您很可能只对JSP的1.7支持感到困惑。