我是否可以使用在Java 7中编译的jar作为与Java 6兼容的项目中的依赖项?我没有依赖项的源代码。我把编译好的jar作为maven依赖。
答案 0 :(得分:3)
我是否可以使用在Java 7中编译的jar作为与Java 6兼容的项目中的依赖项?
让我们解开这个:
您有一个已编译的项目,以便在Java 6 JRE上运行。 (假设您只在该项目中使用Java 6 API。)此项目的.class文件必须具有50的类文件格式主要版本...否则Java 6 JRE将不会能够加载它们。
然后你有一个“在Java 7中编译”的依赖项。这可能意味着两件事之一:
它可以使用Java 7工具链编译,但目标版本为Java 6.
它可以使用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字节码的版本。