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

问题描述 投票:0回答:1

我正在尝试使用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 + " - ");
%>
java amazon-web-services tomcat java-8 amazon-elastic-beanstalk
1个回答
0
投票
我自己遇到了这个问题,我相信答案是:您不能。也就是说,Tomcat确实在1.8以下运行,但是您看到的问题是,它(在Elastic Beanstalk上)不能在JSP中

compile 1.8级代码。

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

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

如果Java编译器在Java环境中可用,则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支持感到困惑。

© www.soinside.com 2019 - 2024. All rights reserved.