我正在尝试使用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 + " - ");
%>
compile 1.8级代码。
为了编译JSP,Tomcat需要两个组件:一个JSP编译器(用于生成Java代码)和一个Java编译器(用于生成字节码)。两个参数compilerSourceVM
和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支持感到困惑。