我正在审核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?
答案 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构建项目,他们可以轻松删除那些看似不需要的方法。