eclipse兼容性中的空分析在7到8之间中断

kul*_*uda 5 java eclipse maven sts-springsourcetoolsuite null-check

我在使用Oracle java 8u25的Windows 7 64位上的Spring工具套件3.6.2(Eclipse clon)下遇到了奇怪的nullcheck分析行为.与java 7源兼容性相同的maven项目在eclipse中成功找到NPE错误,但是当我将maven中的编译版本更改为java 1.8时,eclipse无法找到此错误.

我在Eclipse中的nullcheck分析配置(Java-> Compiler-> Errors/Warnings-> Null分析)是:在null分析中包含断言true启用基于注释的分析true NotNull自定义注释正确设置为javax.validation.constraints.NotNull等. (一切似乎没问题,因为它在java 7下工作)

我的maven pom在这里http://pastebin.com/pF1yJSG2,如上所述当pom中的java.version是1.7 null检查工作时,当1.8为空时检查不起作用.

示例源代码是:

package test.nullcheckbug.core;

import javax.validation.constraints.NotNull;

public class Program {

/**
 * This will fail to compile under java 7 (null analysis works in STS
 * 3.6.2). But under java 8 it does not show error in Eclipse Markers -
 * static analysis does not work ?!
 * 
 * @return null which is not allowed
 */
@NotNull
public String fail() {
    return null;
}

/**
 * Simple main.
 * 
 * @param args
 *            ignored args
 */
public static void main(String[] args) {
}
}
Run Code Online (Sandbox Code Playgroud)

有谁知道问题在哪里以及如何在jdk 1.8兼容性下启用nullcheck?

编辑:Maven似乎没有参与.在非maven项目上模拟的相同问题具有相同的源代码和编译器的兼容级别设置为1.7.这是一个错误吗?

EDITED-2:经过更多的检查,我发现注释中的以下区别有所不同:java.lang.annotation.ElementType.TYPE_USE,当注释没有这个时,在Java 8下没有检测到nullcheck,但在Java下检测到了但是为什么呢?为什么会有这么不同的行为?!

EDITED-3:经过MartinLippert的研究并经过我的测试后,看来nullcheck API在java 7和java 8之间发生了巨大的变化.空检测需要(从eclipse库的2.0版本看)java.lang.annotation.ElementType.TYPE_USE,在分析中忽略类型@Target(value = {METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}).所以问题现在如下:为什么JAVA 8下的空分析只需要新的元素类型?(我知道使用java 8可以充分利用新的语言功能,但为什么需要破坏兼容性?例如javax.validation @NotNull现在无法用作nullchecking注释: - ((()

Ste*_*ann 1

对于 Eclipse Luna,开发工作主要集中在“典型”组合上:

  • Java 7 和声明注释
  • Java 8 和类型注释

在此版本中,Java 8 和声明注释的组合(本问题中所要求的)未完全实现。此问题已通过https://bugs.eclipse.org/bugs/show_bug.cgi?id=435805修复

自 M4 以来,该修复已在 Eclipse Mars 的里程碑构建中提供。

OTOH,我只能鼓励使用 Java 8 的项目升级到类型注释以获得更大的表达能力 - 实现更精确的空类型检查。