【问题标题】:JetBrains' @NotNull works only when project built from IDEAJetBrains 的 @NotNull 仅适用于从 IDEA 构建的项目
【发布时间】:2017-05-06 02:11:30
【问题描述】:

我编写了一个简单的项目来学习如何使用注释验证。 为此,我添加了 maven 依赖项(我也尝试了 javax.validation,这对我不起作用):

<dependency>
    <groupId>org.jetbrains</groupId>
    <artifactId>annotations</artifactId>
    <version>15.0</version>
</dependency> 

并以这种方式使用它:

public boolean add(@NotNull T entry){ ...

当我从IDEA构建项目时,一切都很好,但是在使用maven命令编译代码时它不起作用。 在反编译的类文件中,我注意到 IDEA 以不同的方式编译我的类。它添加了这个检查:

if (entry == null) {
    $$$reportNull$$$0(0);
}

而 maven 没有。

我做错了什么?请告诉我应该如何使用它(无论是 jetbrains 还是 javax 验证)。

【问题讨论】:

标签: java maven validation annotations notnull


【解决方案1】:

在这里部分猜测:你看,不是“IDEA”将额外的检查放入字节码中。

问题是:注解也可用于生成代码(请参阅here 以获得进一步阅读)。正如您从该链接中看到的那样; 代码生成的核心是:注解需要一个 javax.annotation.processing.Processor 类。 编译器将使用它来将源代码注释转换为字节码中的合理内容。

如果我没听错,你就没有为你的 maven 编译设置这些 javax 部件。所以可能那里缺少一个部分;所以解决方案是修复您的 Maven 设置以提供所有必需的依赖项。

【讨论】:

    【解决方案2】:

    您的 @NotNull 注释似乎是 IntelliLang 插件的一部分,旨在支持 IDEA 中的编码(即有助于合同编码)。我怀疑它在 IDEA 之外可用。

    在开始使用语言注入之前,请确保 IntelliLang 插件已启用。该插件与 IntelliJ IDEA 捆绑,默认激活

    我不太了解,所以请跟reference打个招呼

    另一方面,javax.validation 设计用于完全不同的事物。它通过来自 java EE 的Bean Validation 检查数据对象内容是否有效

    【讨论】:

      【解决方案3】:

      创建了一个 Maven 插件来为 Maven 构建做同样的事情:

      https://github.com/osundblad/intellij-annotations-instrumenter-maven-plugin

      默认情况下它仅适用于 JetBrains 注释。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 2012-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        相关资源
        最近更新 更多