我正在尝试使用tomcat 8.5和Java 8将Java Web应用程序部署到AWS Elastic Beanstalk。
我的Java应用程序包含lambda表达式,但没有编译错误 x无法解析为变量
我检查了我的环境,并使用:
System.getProperty("catalina.base");
System.getProperty("java.version");
并提供正确的Java环境/usr/share/tomcat8
和1.8.0_181
我尝试通过添加以下
<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 + " - ");
%>
答案 0 :(得分:0)
我自己遇到了这个问题,我相信答案是:你不能。也就是说,Tomcat确实在1.8以下运行,但是您看到的问题是,它(无法在Elastic Beanstalk上)在JSP中编译 1.8级代码。
为了编译JSP,Tomcat需要两个组件:一个JSP编译器(用于生成Java代码)和一个Java编译器(用于生成字节码)。两个参数compilerSourceVM
和compilerTargetVM
设置这两个编译的语言级别。
以下只是我的最佳猜测,但在实践中似乎可以证明:
如果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支持感到困惑。