我可以使用在Java 7中编译的jar作为针对Java 6编译的项目中的依赖项吗?

时间:2018-03-29 08:45:35

标签: java maven jvm

我是否可以使用在Java 7中编译的jar作为与Java 6兼容的项目中的依赖项?我没有依赖项的源代码。我把编译好的jar作为maven依赖。

2 个答案:

答案 0 :(得分:3)

  

我是否可以使用在Java 7中编译的jar作为与Java 6兼容的项目中的依赖项?

让我们解开这个:

  • 您有一个已编译的项目,以便在Java 6 JRE上运行。 (假设您只在该项目中使用Java 6 API。)此项目的.class文件必须具有50的类文件格式主要版本...否则Java 6 JRE将不会能够加载它们。

  • 然后你有一个“在Java 7中编译”的依赖项。这可能意味着两件事之一:

    1. 它可以使用Java 7工具链编译,但目标版本为Java 6.

    2. 它可以使用Java 7的Java 7工具链进行编译。

在上面的两个子类中,如果在Java 7 JRE 1 上运行项目,应该能够在Java 6项目中使用依赖项。 Java 7 JRE可以加载和运行为Java 6编译的类文件。在其中一个子类中,您将加载具有两个(或更多)类版本号的类。但那没关系。

另一方面,如果您尝试在Java 6 JRE上运行代码,那么:

  • 如果 Java 7依赖项不使用任何Java 7(或更高版本)API,则子例1将工作;即它只使用Java 6或更早版本中存在的Java标准类,方法等。

  • Subcase 2不起作用。 Java 6 JRE将无法加载依赖项。实际上,如果依赖项是静态的(即项目源代码对依赖项的API具有编译时依赖性),那么项目代码将不会构建...因为Java 6编译器应该拒绝读取依赖项的较新版本类文件

最明智的方法是将项目和执行平台迁移到Java 7.或者更好的是Java 7,因为Java 7已经过EOL。

如果你不能这样做,那么下一个最好的办法就是避免使用Java 7依赖...直到你可以升级。

如果您的客户坚持要求他们继续支持Java 6,那么他们就会阻碍您升级产品线的能力。应该为此收取额外费用。

如果由于内部原因而无法升级Java平台,则此决定会累积技术部门......您的组织将被迫长期获得回报。

1 - ....或JDK。出于运行代码的目的,JDK等同于JRE。

答案 1 :(得分:2)

在您的情况下,您实际上询问Java 6和Java 7之间是否存在前向兼容性。一般来说,Java不支持前向兼容性,因为1.7 JVM无法运行使用1.6编译的代码。这种情况的发生主要是因为旧版本(1.6)不知道1.7编译的Java字节码的版本。