繁体   English   中英

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

[英]AWS Elastic Beanstalk with tomcat 8.5 and java 8 lambda x cannot be resolved to a variable

我正在尝试使用 tomcat 8.5 和 java 8 将 java web 应用程序部署到 AWS Elastic Beanstalk。我的 java 应用程序包含 lambda 表达式,但它没有编译,错误x 无法解析为一个变量我已经检查了我的环境和: System.getProperty("catalina.base"); System.getProperty("java.version"); 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 container_commands: replace-config: command: cp .ebextensions/web.xml /usr/share/tomcat8/web.xml对 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 + " - ");
%>

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

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

以下只是我最好的猜测,但它似乎在实践中得到证实:

如果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 支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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