为什么Gradle在更新库的版本时不能正确更新IDEA项目?

为什么Gradle在更新库的版本时不能正确更新IDEA项目?,gradle,dependencies,Gradle,Dependencies,还有更多的格拉德尔建造地狱,我无法理解。在我们的顶级依赖项中,我们有: joda_time: [ 'joda-time:joda-time:2.3' ], 在项目库中有: $ find .idea/libraries/*joda_time* .idea/libraries/Gradle__joda_time_joda_time_2_3.xml 因此,今天我尝试更新它: joda_time: [ 'joda-time:joda-time:2.9' ], 然后我

还有更多的格拉德尔建造地狱,我无法理解。在我们的顶级依赖项中,我们有:

  joda_time: [
    'joda-time:joda-time:2.3'
  ],
在项目库中有:

$ find .idea/libraries/*joda_time*
.idea/libraries/Gradle__joda_time_joda_time_2_3.xml
因此,今天我尝试更新它:

  joda_time: [
    'joda-time:joda-time:2.9'
  ],
然后我运行gradle idea,它似乎成功了,但如果我查看库,它仍然有以前的版本:

$ find .idea/libraries/*joda_time*
.idea/libraries/Gradle__joda_time_joda_time_2_3.xml
它到底在干什么?我甚至可以看到它已经下载并缓存了jar文件,但该项目仍然引用旧版本

更新:

看起来我看到的是,它为更高版本添加了一个新的依赖项。因此,在每个模块的相同.iml文件中,我有一个对项目库的引用:

<orderEntry type="library" name="Gradle: joda-time:joda-time:2.3" level="project" />
但是我单独直接引用了jar文件:

<orderEntry type="module-library">
  <library>
    <CLASSES>
      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/joda-time/joda-time/2.3/56498efd17752898cfcc3868c1b6211a07b12b8f/joda-time-2.3.jar!/" />
    </CLASSES>
    <JAVADOC>
      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/joda-time/joda-time/2.3/5290263bb45387985d253240686ca6fb2bb85b14/joda-time-2.3-javadoc.jar!/" />
    </JAVADOC>
    <SOURCES>
      <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/joda-time/joda-time/2.3/ecd8588d8ce0963eb443de31d5fea29e3205f160/joda-time-2.3-sources.jar!/" />
    </SOURCES>
  </library>
</orderEntry>
当我将gradle文件更改为想要2.9时,gradle只更新其中一个文件,而不删除另一个文件

我觉得这很奇怪,因为Gradle应该是拥有依赖关系的人。然后,它应该从文件中删除依赖项,并在每次重新生成文件时用自己的依赖项替换它们。否则,每次有人更新任何东西,就会出现类似这样的问题

因此,我想我现在可以看到两种解决方法:

尝试使用module.iml.beforeMerged在XML合并到新的依赖项之前清除其内容

放弃干净利落的工作,让ideaModule任务依赖于cleanIdeaModule


当然,我仍然想知道它为什么这样做,所以我将把问题留给大家。

一旦我看到这样一个问题,原因是它是miltimodule项目,而根项目没有应用idea插件。可能这里也有类似的情况,确实如此。所以现在我将apply plugin:idea从子项目转移到了所有项目。这会在顶层创建一个.iml,这不是我们真正想要的,但似乎也无法解决问题/实际上,将它应用于所有项目会带来另一个问题,即它将一个.iml文件重命名为错误的名称,因为它试图避免与项目根目录下的文件发生名称冲突,因为项目名称和一个模块名称匹配。所以我现在就把这个变化拿出来。。。