如何在 IntelliJ IDEA 中禁用 pom.xml 验证

How to disable pom.xml validation in IntelliJ IDEA

我正在使用 buildnumber-maven-plugin 获取 Mercurial 变更集作为项目内部版本号:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.2</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>hgchangeset</goal>
            </goals>
        </execution>
    </executions>
</plugin>

然后我用${changeSet}属性设置build.number属性在同一个pom.xml:

<build.number>${changeSet}</build.number>

然而,IntelliJ IDEA 抱怨它 Cannot resolve symbol 'changeSet':

此外,模块根目录和受影响的 pom.xml 文件在项目工具 window 中带有红色下划线 window。

我尝试了所有提供的 Alt+Enter 选项和 Maven 配置设置;没有任何帮助。

一切正常,我只是想摆脱 IDE 中显示的恼人错误。有什么建议吗?

IDE 和环境:

IntelliJ IDEA 2016.1.2
Build #IC-145.972, built on May 14, 2016
JRE: 1.8.0_65-b17 amd64
JVM: Java HotSpot(TM) 64-Bit Server VM by Oracle Corporation

是的,看起来坏了

有意思。我已经在 IntelliJ IDEA Ultimate 14.1.7 和 IntelliJ IDEA Community 2016.1.2 中测试了这种行为,即使关闭了所有 Maven 检查,IDEA 不知道的属性仍然显示为红色。这看起来是 IDEA 中的一个错误(或者更仁慈地说,一个未实现的功能),它在无法识别 属性 时给出的错误不受检查设置控制。

IDEA 的错误跟踪器中有几个相关问题:

在 JetBrains 支持论坛上也有关于类似问题的 post:

可能的解决方法

IDEA-96358 的评论和支持 post 中都列出了解决方法。您可以在 Settings / Build, Execution, Development / Build Tools / Maven / Runner / Properties 中添加动态属性的虚拟版本,如以下屏幕截图所示:

将值放在那里让 IDEA 知道它们,因此它不会以红色突出显示它们。但是,我在测试中发现,由于 IDEA 将值作为属性传递给 Maven,因此它们没有被 buildnumber-plugin 覆盖,当我尝试使用它时,我看到的是我的虚拟值。 (我测试使用它的唯一方法是在 maven-help-plugin 评估目标中,但也许它在以其他方式使用它时有效?)为了能够使用动态设置的值,在我的特定构建配置中我取消选中 "Use project settings" 框并删除虚拟 属性,如以下屏幕截图所示:

这开始成为一个非常烦人的解决方法,就好像你有很多 Maven 构建配置并且喜欢它们都默认为相同的 运行ner 设置的能力,你现在有在每个配置中复制您想要的 "real" 设置,并在项目设置对话框中使用默认值 "dummy" 值,以便 IDEA 知道它不应该处理引用 属性 作为一个错误。这还要求您通过构建配置 运行 所有 Maven 命令,而不是通过其他方式,例如在 "Maven Projects" 工具 window 中双击生命周期。尽管如果您的构建配置很少,那么这些是您在 IDEA 中 运行 Maven 的唯一方式,并且编辑 pom.xml 文件时的红色已经够烦人了,也许这种解决方法是一个可以接受的权衡你.

进一步的步骤

由于 IDEA 的内置功能似乎并没有真正涵盖动态生成的属性,我认为解决它的唯一真正方法是说服 JetBrains 这样做,除非有某种方法可以将功能添加到第三方插件(现在已经超出了我的专业范围)。我建议对我提到的 JIRA 跟踪系统中的其中一张票进行投票和评论,或者如果您认为您的问题足够不同(可能确实如此),则创建您自己的票。此外,您可能需要联系 JetBrains 支持,特别是如果您有他们的付费订阅。虽然我怀疑他们有很多优先事项需要处理(就像我们所有人一样),但我也怀疑更多的人要求某样东西会增加它排在他们待办事项列表首位的可能性。友善地要求很少有伤害。

因为它工作正常。我认为这可能是一些缓存或者可能是小错误,对提供一些信息没有重大影响。所以我想建议你一些选择

建议一:

您可以重建您的项目然后检查

Build > Rebuild Project

建议2:

您可以清除 ide 的缓存

  1. File -> invalidate caches
  2. 然后Restart application

建议三:

有时一些愚蠢的技巧可能会解决问题。

  1. 右击代码编辑器
  2. 将鼠标悬停在 Maven 上并展开
  3. 点击重新导入

建议4:

有一些方法可以解决这个问题,也可以讨论版本之间发生的情况。你可以通过

IntelliJ inspection gives "Cannot resolve symbol" but still compiles code

建议5:

您可以尝试一下 Michael Wróbel 的博客Cannot resolve symbol XYZ in IntelliJ although maven builds sources properly

建议6:

您还可以 disable reading pom.xml 了解 IntelliJ Idea 中的每个小改动: Intellij IDEA and Maven, disable reading pom.xml on every small change, even without a save

尝试文件->设置->编辑器->检查->取消选中 "Maven Model Inspection" 并应用。

问题询问如何停用验证,因为未修复的 IntelliJ 错误导致动态 pom.xml 变量中语法“${dynamic.variable}”的错误。

相反,这里有一个 bug 的解决方法,所以错误的错误通知消失了,maven 仍然接受变量,每个人都很高兴:

按此顺序更改变量语法(不是开玩笑): 1.“${dynamic.variable}” 2.“{dynamic.variable}” 3.“{$dynamic.variable}”

IntelliJ 现在会接受它是正确的,maven 也会毫无问题地解析和接受动态变量。这显然是一个未记录的 maven 语法,出于某种原因,它已在 IntelliJ IDE.

中作为正确且唯一的语法实现。

我希望这对每个人都有帮助,尽管它没有回答实际提出的问题,但消除了提问的原因。

玩得开心:)

恕我直言,none 的 SkyWalkers 解决方案对我有用。

但是下面这个对我有用:

只需在 属性 行上方添加:

<!--suppress UnresolvedMavenProperty -->

所以你最终会得到:

<!--suppress UnresolvedMavenProperty -->
<git.version>${git.commit.time}.${git.commit.id.abbrev}</git.version>