Java版本之间是否存在不兼容性,其中针对Java版本X的Java源代码/ Java类文件将无法在版本Y(其中Y> X)下编译/运行?
"Java发布"我指的是以下版本:
家庭规则:
Java在Java 5中引入了带有泛型的类型擦除,因此它们可以在旧版本的Java上工作.这是兼容性的权衡.我们已经失去了兼容性[1] [2] [3] - 字节码可以在更高版本的JVM上运行,但不能在早期版本上运行.这看起来是更糟糕的选择:我们丢失了类型信息,我们仍然无法在旧版本上运行为较新版本的JVM编译的字节码.发生了什么?
具体来说,我要问,如果有任何技术原因,类型擦除不能在JVM的下一个版本中删除(假设,就像以前的版本中,它的字节码将无法反正在最后版本上运行).
[3]:对于那些真正喜欢它的人来说,类型擦除可能会以类似于retrolambda的方式向后移植.
编辑:我认为关于向后兼容性的定义的讨论模糊了这个问题.
我正在尝试用IntelliJ构思编译我的项目.我正在外部jar文件中使用一个类,并在编译时收到上述错误.
据我所知,它说的是jar文件是使用比IntelliJ使用的Java版本更新的Java版本编译的.我的问题是如何使它们兼容?我已将Mac上的Java更新为1.8,当我运行java -version或javac -version确认这一点时.
我错过了什么?(除了Java开发经验)
我正在阅读有关新Java 9模块系统的文档.
第3段兼容性和迁移解释了如何将代码从Java 8迁移到Java 9,但没有说明如何"迁移"或运行用Java 9编写的应用程序到Java 9运行时之前.
所以,如果我有,比如一个以模块化方式编写的JAR应用程序(每个模块都有一个模块描述符),如果我将它部署在一起,即JDK 8运行时会发生什么?
我已经阅读过相关内容source和target选项javac,它们分别定义了我的源代码编译所需的版本和我想要支持的最旧的 JRE 版本。在使用 Maven 构建工具时,我在 pom.xml 中定义了这些参数,如下所示:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>15</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
,但是目标版本不能设置低于源版本,为什么会这样呢?
尝试使用此配置进行编译会导致错误:“编译致命错误:警告:源版本 15 需要目标版本 15”。与源版本高于目标版本的任何其他组合相同。
我已将Web应用程序升级到Java 7,JAVA_HOME指向1.7.我的Maven插件正在从java_home读取Java版本.但是在pom.xml中看到以下设置后我有点困惑:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<fork>true</fork>
<compilerVersion>1.6</compilerVersion>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
如果按原样保留上述设置,Maven是否会使用1.6或1.7编译Java代码?根据我对此链接的理解,上述设置将获得优先权,项目将使用1.6而不是1.7进行编译.那是对的吗?
如果我给出如下设置,如果我有特定于JDK 1.7的代码,我的代码现在会编译吗?
<source>1.6</source>
<target>1.7</target>
Run Code Online (Sandbox Code Playgroud)
我不确定; 上述设置实际意味着什么?
我需要对JRE做一点澄清.向下兼容吗?我的意思是如果我使用java5开发一个应用程序,如果目标有最新的java6,我的应用程序能够运行吗?