我正在回顾github上的HikariCP项目,它声明它支持“Java7和Java8maven工件”,在其源代码中,它使用了一些Java8特性:
java.util.function.Consumer;
java.util.function.Predicate;
java.util.function.UnaryOperator;我想如果这个项目被其他Java 7引用,就会出现错误。那么,项目是如何同时支持Java 7和Java 8的呢?
发布于 2016-08-12 08:04:47
这不是一个错误(正如我自己所想的)。这个项目确实使用Java 8中的类,它不使用Java 7进行编译,它的Maven构建也不使用Java 7运行。
但是,由于Java 8特有的特性(如Lambdas )在源代码中没有使用,所以它确实与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 ,不管怎么说,!您可能会注意到,导入Java8类的惟一类是com.zaxxer.hikari.util.FastList。我不知道他们为什么这么做。
UPDATE:只想澄清项目字节码的版本是1.7,可以很容易地用反编译器或十六进制验证。它的源代码确实符合Java 7,因此可以用
<source>1.7</source>
<target>1.7</target>正如@Puce所指出的。
另一方面,它必须使用JDK1.8进行编译,以便在编译过程中可以使用源代码中引用的Java 8类。编译完代码后,只要不尝试加载缺少的Java8类(在本例中是从java.util.function包中),它就可以与Java 7一起运行。
发布于 2016-08-12 07:47:16
<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 7,而这并不是自动正确的。
您试过用Java 7访问库吗?
这个项目的好消息是,支持Java 7似乎很容易。FastList只是一个列表实现。由于列表接口已经在Java 8中进行了扩展,所以即使它们只抛出一个UnsupportedOperationException,它们也被迫实现新方法。
通过使用JDK 7构建项目,他们可以轻松地删除那些看似不需要的方法。
https://stackoverflow.com/questions/38908722
复制相似问题