尽管使用Java 8功能,项目如何支持Java 7

时间:2016-08-12 02:01:56

标签: java maven java-8 java-7

我正在审核github上的HikariCP项目,它声明它在源代码中支持" Java 7和Java 8 maven artifact" 代码,它使用了一些Java 8特性:

java.util.function.Consumer;
java.util.function.Predicate;
java.util.function.UnaryOperator;

我想如果其他人使用Java 7引用此项目,则会发生错误。那么,该项目如何使其同时支持Java 7和Java 8?

2 个答案:

答案 0 :(得分:5)

这不是错误(正如我自己想的那样)。该项目确实使用了Java 8中的类。它不能使用Java 7进行编译,而且它的Maven构建也不能与Java 7一起运行。

但是,由于源代码中没有使用像Lambdas这样的特定于Java 8的功能,因此它可以在Java 7中运行。

尝试创建 Java 7 项目,将HikariCP声明为依赖项,并运行以下代码:

import com.zaxxer.hikari.util.FastList;

public class Main {

    public static void main(String[] args) {

        FastList<String> fastList = new FastList<>(String.class);
        fastList.add("Hello");
        System.out.println(fastList);
    }
}

它成功运行。另一方面,以下代码失败:

fastList.removeIf(null);

这是因为removeIf()和其他一些方法使用Java 8中的类,因此无法在Java 7中运行。但是它们都抛出UnsupportedOperationException < / STRONG> 的!您可能会注意到,导入Java 8类的唯一类是com.zaxxer.hikari.util.FastList。我不确定他们为什么这么做。

更新:只是想澄清项目字节码的版本是1.7,因为可以使用反编译器或hexdump轻松验证。它的源代码符合Java 7,因此可以使用

构建
<source>1.7</source>
<target>1.7</target>

正如@Puce所指出的那样。

另一方面,它必须使用JDK 1.8进行编译,以便在编译期间源代码中引用的Java 8类可用。编译代码后,只要没有尝试加载缺少的Java 8类(在这种情况下来自java.util.function包),它就可以在Java 7上运行。

答案 1 :(得分:0)

<plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.5.1</version>
               <extensions>true</extensions>
               <configuration>
                  <source>1.7</source>
                  <target>1.7</target>
               </configuration>
</plugin>

这可能是项目的错误。

指定源和目标级别仅考虑语言功能并影响字节代码版本。不检查API。

如果他们使用JDK 8来构建项目,那么项目构建正常。但我怀疑它会用JDK 7编译。

他们可能认为在这里指定1.7会使它支持Java SE 7,这不会自动纠正。

您是否尝试使用Java SE 7访问该库?

该项目的好消息是,支持Java SE 7似乎很容易。 FastList只是一个List实现。由于List接口已在Java SE 8中扩展,因此即使它们仅抛出UnsupportedOperationException,它们也被迫实现新方法。

通过使用JDK 7构建项目,他们可以轻松删除那些看似不需要的方法。