相关疑难解决方法(0)

Java版本之间是否存在后向不兼容的具体示例?

Java版本之间是否存在不兼容性,其中针对Java版本X的Java源代码/ Java类文件将无法在版本Y(其中Y> X)下编译/运行?

"Java发布"我指的是以下版本:

  • JDK 1.0(1996年1月)
  • JDK 1.1(1997年2月)
  • J2SE 1.2(1998年12月)
  • J2SE 1.0(2000年5月)
  • J2SE 1.4(2002年2月)
  • J2SE 5.0(2004年9月)
  • Java SE 6(2006年12月)

家庭规则:

  • 请尽可能包含参考和代码示例.
  • 请尽量在答案中具体/具体.
  • 被标记为@Deprecated的类不计为向后不兼容.

java jvm bytecode backwards-compatibility

48
推荐指数
7
解决办法
3597
查看次数

为什么不从下一个JVM中删除类型擦除?

Java在Java 5中引入了带有泛型的类型擦除,因此它们可以在旧版本的Java上工作.这是兼容性的权衡.我们已经失去了兼容性[1] [2] [3] - 字节码可以在更高版本的JVM上运行,但不能在早期版本上运行.这看起来是更糟糕的选择:我们丢失了类型信息,我们仍然无法在旧版本上运行为较新版本的JVM编译的字节码.发生了什么?

具体来说,我要问,如果有任何技术原因,类型擦除不能在JVM的下一个版本中删除(假设,就像以前的版本中,它的字节码将无法反正在最后版本上运行).

[3]:对于那些真正喜欢它的人来说,类型擦除可能会以类似于retrolambda的方式向后移植.

编辑:我认为关于向后兼容性的定义的讨论模糊了这个问题.

java jvm backwards-compatibility type-erasure

28
推荐指数
3
解决办法
3392
查看次数

类文件有错误的版本52.0,应该是50.0

我正在尝试用IntelliJ构思编译我的项目.我正在外部jar文件中使用一个类,并在编译时收到上述错误.

据我所知,它说的是jar文件是使用比IntelliJ使用的Java版本更新的Java版本编译的.我的问题是如何使它们兼容?我已将Mac上的Java更新为1.8,当我运行java -versionjavac -version确认这一点时.

我错过了什么?(除了Java开发经验)

java intellij-idea

22
推荐指数
6
解决办法
7万
查看次数

JDK,JRE兼容JAR

我对JDK和JRE源代码和二进制兼容性(例如thisthis)有所了解,但不确定以下情况:

考虑我有一个使用JDK5编译并在JRE6上运行的应用程序.它使用一些库(jar),它们也使用JDK5编译.

现在我想使用JDK6编译我的应用程序.在这种情况下运行时会出现哪些新问题(特别是与"旧"罐的兼容性)?我应该完全重新测试应用程序(触摸每个库)还是可以依赖于承诺的JDK/JRE兼容性?

java compatibility

12
推荐指数
2
解决办法
3468
查看次数

管理Java版本兼容性

我读过" JDK通常是向前兼容的,而JRE通常是向后兼容的."

Java开发人员在他们的应用程序中做了什么样的版本检查?

你是否每次发布升级JDK?

如何最大限度地减少版本之间的不兼容性?

java versioning

6
推荐指数
2
解决办法
1266
查看次数

从Java 9到Java 8的兼容性和迁移

我正在阅读有关新Java 9模块系统的文档.

3兼容性和迁移解释了如何将代码从Java 8迁移到Java 9,但没有说明如何"迁移"或运行用Java 9编写的应用程序到Java 9运行时之前.

所以,如果我有,比如一个以模块化方式编写的JAR应用程序(每个模块都有一个模块描述符),如果我将它部署在一起,即JDK 8运行时会发生什么?

java java-9

6
推荐指数
2
解决办法
4578
查看次数

为什么javac目标选项不能低于源选项?

我已经阅读过相关内容sourcetarget选项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”。与源版本高于目标版本的任何其他组合相同。

java javac maven

5
推荐指数
1
解决办法
1431
查看次数

使用-source和-target javac选项进行编译

我已将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)

我不确定; 上述设置实际意味着什么?

java compiler-construction maven

3
推荐指数
1
解决办法
1万
查看次数

Java向下兼容性澄清

我需要对JRE做一点澄清.向下兼容吗?我的意思是如果我使用java5开发一个应用程序,如果目标有最新的java6,我的应用程序能够运行吗?

java backwards-compatibility

1
推荐指数
1
解决办法
272
查看次数