【问题标题】:Intellij IDEA editor: classpath orderIntellij IDEA 编辑器:类路径顺序
【发布时间】:2012-01-18 18:07:47
【问题描述】:

我试图为此寻找解决方案,但没有任何乐趣:在 Intellij IDEA 中,我设置了一组模块,因此我拥有以下内容:

  • 我的 Web 项目(所有模块依赖项设置为“运行时”)
  • 我的 Web 项目依赖项 #1(+ 将 JAR 复制到 MWP 的 /WEB-INF/lib 的工件)
  • 我的 Web 项目依赖项 #2(+ 将 JAR 复制到 MWP 的 /WEB-INF/lib 的工件)

Dependency#1 有一个类 org.acme.foo,但 MWP 也是如此,并且定义不同(哦,高兴)。它构建良好 - MWP 中的所有代码都正确构建了 MWP 中的类,而不是 Dependency#1。

但是...在它的编辑器中,Intellij 给了我红色的波浪线,因为它更喜欢引用 Dependency#1 中的类及其不兼容的定义。

忽略确实不应该存在此类/包冲突的事实,谁能帮我推动 Intellij 查看本地模块中的类,而不是依赖项中的类?

编辑:我使用的是最新的 Intellij 11。

编辑:对于任何发现这个问题的人,这些麻烦在 Intellij 12+ 中消失了

【问题讨论】:

    标签: java intellij-idea


    【解决方案1】:

    我遇到了这个问题,并且正在使用 Vladimir 的答案(因此我赞成),但不幸的是,我发现我必须继续重新编辑 .iml 文件,因为它不断被重写。经过一番挖掘,我找到了如何永久更改它:

    导航到文件 -> 项目结构 -> 模块 -> -> 依赖项选项卡

    IntelliJ 将按照它们在类路径中列出的顺序将依赖项添加到类路径中。要移动它们,只需突出显示要移动的依赖项,然后使用底部工具栏上的向上和向下箭头即可。

    【讨论】:

    • 那么,这就是答案?
    • 嗨。在你回答之后回到这个永恒......生活等等......你所描述的在 Intellij 12+ 中完美运行,但在 11 中没有。
    • 这是否适用于项目总执行顺序(即您在 Eclipse 的启动器类路径选项卡中看到的执行顺序)?据我所知,Intellij 只使用每个模块的执行顺序,所以如果您的项目中有很多模块,您无法确定执行顺序,对吧?
    【解决方案2】:

    我在 IntelliJ 11(Mac OS X 版本)中遇到了同样的问题。

    我手动编辑了我的项目的 .iml 文件并以正确的顺序重新排列了依赖项:我将包含正确版本的 .jar 文件的 orderEntry 元素放在顶部。

    希望这会有所帮助。

    【讨论】:

    • 谢谢 - 在放弃 Intellij 并回到 Eclipse 之后,我才刚刚回到这个问题:截止日期压力。本周再次尝试使用相同的项目,发现问题已在 Leda EAP 中消失。这次对依赖项进行排序正常工作。
    【解决方案3】:

    在我的例子中,它在 Eclipse 中运行良好,但在 IntelliJ 中发生了。原因确实是工具根据不同的机制加载库/罐子:

    • Eclipse:.classpath 文件
    • IntelliJ:*.iml 文件

    我有一堆 libs/jars 在一个目录中。该目录包含在 *.iml 文件中,如下所示 <orderEntry type="library" name="external-libs" level="project" /> 有 2 个库/罐子有冲突(在我的情况下,两者都包含“org.joda.time.DateTime”)。但是 2 个 DateTimes 有不同的功能。我必须指定其中一个应该在另一个之前加载。

    解决方案:

    1. 转到“文件->项目结构->依赖项”
    2. 按底部的“+”按钮以包含我要首先加载的 lib/jar。
    3. 使用向上/向下按钮将刚刚包含的 lib/jar 移动到冲突目录/jars/libs 上方。
    4. 重建项目。

    查看屏幕截图。 joda-time-2.4.jar 添加在 external-libs 上方以控制加载顺序。

    【讨论】:

      【解决方案4】:

      我有一个类似的问题正在尝试解决。

      我发现了两种我知道会发生这种情况的情况,并找到了解决其中一种的方法。

      场景 1) 你的类是指类路径上的一个类,它比 jar 中的类更靠前,但是在 import 语句中,import 语句的格式为

      import com.company.classes.to.use.*
      

      通过增加它们,IDE 似乎从同一个 jar 位置拾取了该包中的所有类。通过将它们拆分为单独的导入类语句,IDE 将分别提取它们。

      场景 2) 您为被覆盖的类使用菊花链方法。

      something.getSomethingElse().getAnotherThing().getYetAnotherThing();
      

      如果 getSomethingElse() 返回一个不在类中的对象(因此您不必导入它),那么您仍然会收到错误。 (添加导入会使该行变灰,因为它识别出它没有被使用,所以它没有帮助)。反正我不会容忍这种方法。

      编辑:明显的替代方法是重构代码以将行分解为

      ObjectToImport obj = something.getSomethingElse();
      result = obj.getAnotherThing.getYetAnotherThing();
      

      然后导入临时变量...

      显然这并不理想,你不应该为了你的 IDE 而重构你的代码,但是必须要这么做,那些红线让我很恼火。

      我希望这些帮助。如果您找到了更好的解决方案,请分享!

      问候, M

      【讨论】:

      • 谢谢 - 在放弃 Intellij 并回到 Eclipse 之后,我才刚刚回到这个问题:截止日期压力。本周再次尝试使用相同的项目,发现问题已在 Leda EAP 中消失。这次对依赖项进行排序正常工作。
      • 我认为您误解了 import 的作用。它只是一个语法简写,仅此而已。它不会影响类路径上出现的 JAR 或类似的东西。它可以让您输入ObjectToImport 而不是com.company.classes.to.use.ObjectToImport,从而帮助您节省时间并使代码更具可读性。
      • 谢谢弗兰斯,但我不知道。有问题的不是 import 做什么,或者 java 做什么,而是 Intellij 在做什么。当然这是五年前的事了,所以我相信它不会再受此困扰了。
      猜你喜欢
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多