如果我使用Java 8库编写应用程序代码,并尝试使用Java 6编译器编译它,构建是否会失败?
我的笔记本电脑上有Java8。我使用java.time库编写了一个小代码段,以使用EclipseIDEV4.9(2018-09版)计算应用程序处理时间。该项目使用Java1.6编译器版本。然后我在我的笔记本电脑上运行了这个应用程序,它运行时没有任何错误,并且产生了预期的输出。然后,我使用Java1.6编译器将应用程序导出到war文件中,在运行Java1.7VM的Tomcat6服务器上运行它。我面临以下情况:如果我使用Java 8库编写应用程序代码,并尝试使用Java 6编译器编译它,构建是否会失败?,java,eclipse,tomcat,Java,Eclipse,Tomcat,我的笔记本电脑上有Java8。我使用java.time库编写了一个小代码段,以使用EclipseIDEV4.9(2018-09版)计算应用程序处理时间。该项目使用Java1.6编译器版本。然后我在我的笔记本电脑上运行了这个应用程序,它运行时没有任何错误,并且产生了预期的输出。然后,我使用Java1.6编译器将应用程序导出到war文件中,在运行Java1.7VM的Tomcat6服务器上运行它。我面临以下情况: 日志文件中没有错误。日志级别设置为调试 应用程序处理数据库行,并根据某些逻辑,在4个不同
更新:我不是在寻找问题的解决方案。我正在寻找Java编译器行为的解释。包
Java.time
仅在Java8中引入。因此,如果您使用它,您的代码将无法在以前的JVM版本上工作
您应该更改Tomcat的JVM版本,或者从项目中删除依赖于
java.time的代码。如果您使用maven,您的代码将要运行。但您必须确保只使用所选Java版本中的功能。是的,如果使用Java 7+版本中引入的功能,可能会失败。引用几句话:
java.time库
菱形语法:
列表=新的ArrayList()李>
Lambda或流函数
switch语句中的字符串
Iterable接口中的forEach()方法
接口中的默认和静态方法
这不是一个完整的列表,只是几个示例。您使用过lambda's或streams吗?您使用了Java 6中没有的东西吗?只使用了Java.time库。没有lambda或streams,所以它不会工作。Java8编译器确切地知道如何处理与Java6兼容的代码,因为它在某种程度上是嵌入了“过去的知识”。你要做的是,有一个编译器编译代码,它在创建时不可能存在(编译器也不知道该怎么做),但它确实有效。Java1.6编译器设法编译代码并生成WAR文件。当我在Tomcat1.6服务器中部署WAR文件时,应用程序运行时没有任何错误。问题是,它没有执行它应该执行的操作,即从数据库表中读取条目。但在运行时并没有应用程序错误,在编译期间也并没有任何构建错误。所以。。。您使用Java 6编译器编译了Java 6中不存在的代码?叫我怀疑,我不相信。如果问题是“它没有做它应该做的事情”,那么你在代码中犯了逻辑错误。这不是我的问题。我已经通过删除java.time相关代码解决了这个问题。我的问题是,由于我使用的是旧的编译器版本,所以构建不应该失败吗?我完全依赖于您的代码。如果您在代码中使用旧编译器不支持的新功能,它将失败。这就是我被难倒的地方,因为编译没有失败。在Tomcat 1.6服务器中部署使用Java 1.6编译器构建的WAR文件时,也没有出现任何运行时错误。JVM具有向后兼容性。如果您使用1.6编译器编译代码,并在JVM1.7(例如)或更高版本上运行,它将正常工作。但是,如果您使用1.7编译器编译代码并在JVM 1.6上运行,那么如果您使用的是旧版JVM中未引入的新功能,则可能会失败。这里的问题不是JVM兼容性。问题是,使用1.8库编写的代码使用1.6编译器编译并导出到WAR,并在1.7 JVM中无误运行,但未能实现其逻辑目标。通过删除1.8代码段,它得到了修复。在某个时刻,应该有一个错误,但事实并非如此。编译器不应该编译代码,也不应该导出WAR,或者日志记录器应该产生适当的错误。我甚至不知道在这种情况下会出现什么错误,因为我以前从未遇到过这种情况,也没有在网上找到类似的东西。这就是我的问题,因为它没有失败。这是一个已知的问题还是一个新的Java错误?Maven没有使用。SimpleEclipseTomcat集成用于在本地运行,并导出war文件以在RHELTomcat服务器上运行。