Eclipse 3.4(Ganymede)软件包与类型发生冲突。

5
我们有一个以异常(exception)结束的包,例如:
package a.b.c.exception;

我们的代码库在使用eclipse 3.3版本时没有问题,但是当我们切换到eclipse 3.4版本后,就出现了与这个包相关的错误。
"The package a.b.c.exception collides with a type"

当我将包名称重构为a.b.c.exceptions时,没有任何问题。这是由于Eclipse 3.4中的一个错误,还是有一些设置可以纠正这种行为?

它与什么类型相碰撞? - Thorbjørn Ravn Andersen
这就是我不知道的,而且Eclipse没有概述任何特定类型。 - Monis Iqbal
感谢Nate和VonC对问题的回答并指出正确的方向,因为似乎这是一个与Java相关的问题,但正如我所说,我们已经在Eclipse 3.2、3.3上使用这个工作区3年了,但只有当我们升级到3.4时才出现了这个问题。 - Monis Iqbal
6个回答

8
这是因为你在 a.b.c 包中有一个名为 exception(小写“e”)的类和一个名为 a.b.c.exception 的包。这会导致名称冲突,因为如果你有代码 a.b.c.exception.doSomething(),那么这是要调用 a.b.c.exception 类中的静态 doSomething() 方法吗?还是意味着有一个名为 a.b.c.exception.doSomething 的类,你正在尝试调用它的构造函数?
遵循 Java 命名约定 - 所有小写的包,以大写字母开头并驼峰式命名的类 - 你就不会遇到这个问题。
==========编辑==========
这是唯一的合法原因,导致出现此错误...
它不一定直接出现在你的项目中,它可以存在于其他项目或库中,这应该显示在任何构建路径或项目中类的任何位置:点击 Eclipse 工具栏中的手电筒图标 -> 选择“Java 搜索” -> 在搜索字段中输入 a.b.c.exception -> 选择“区分大小写” -> 在“搜索”中选择“类型” -> 确保所有选项都被选中“搜索”。
你是否使用任何生成类的工具?他们是否将它们放入您项目的生成目录中?当你看到错误时,如果你进入项目的生成目录,并进入 a/b/c/ 目录,你会看到一个名为 'exception' 的 .class 文件吗?
当然,Eclipse 一般可能存在错误(虽然我期望在 Eclipse 3.4 中会有一个错误报告,如果是这样的话,你应该能够找到更多的投诉...),你的 Eclipse 安装可能以某种方式损坏(其他人能否在 Eclipse 3.4 中打开你的项目?你能在另一个目录中进行干净的 Eclipse 3.4 安装吗?错误是否出现?),或者你的项目可能已经出了问题(创建一个没有依赖项的新项目,除了 JDK,创建 a.b.c.exception 包在你的新项目中,在你的项目中创建一个类来导入 a.b.c.exception.*;,看看是否出现错误)。

没有名为exception或Exception的类存在于该包或任何其他地方。我们非常严格地遵循Java规范 :) - Monis Iqbal
看到你的评论(以及这个答案)后,我同意。更准确了。+1 - VonC
Nate/VonC,您认为这个理论仍然能够解释我所陈述的问题吗? - Monis Iqbal
1
Nate,感谢你解释了可能性。我找不到与此包冲突的类型。然而,当我在另一个工作区创建了相同名称的包时,它可以正常工作。 同样,在这种情况下,当我开始进行清洁构建我的工作区时,错误消失了,但最后当构建完成时,错误再次出现。你认为有没有办法找到与我的包冲突的类型的位置? - Monis Iqbal

4
在Java中,不能使用与包名相同的类名。这意味着JDT包必须仅在3.4版本中强制执行该规则。例如,请参见bug 63668

正如 Nate 的评论所述:

一个名为 Exception 的类并不能防止你创建包 exception
大小写很重要

还要记住,类的完整名称包括它所在的包。
因此,a.b.SomeClass(类名)与x.y.SomeClass(包名)不同。
这里不会有名称冲突。

类名和包名必须在大小写和包上匹配才会导致此错误。

请参见他更准确的答案


这个包中的类有不同的名称。 包名是a.b.c.exception。 这个包中的类有:ABCException、DEFException、GHIException。 或者你是说因为Java有一个类/类型叫做Exception,所以我不能创建一个名为“exception”的包? - Monis Iqbal
@Monis:后者,Java 中的类 Exception 应该阻止你创建一个名为 exception 的包。 - VonC
我不同意,因为我有另一个包x.y.exception,它不会出现这种类型冲突的问题。 - Monis Iqbal
一个名为Exception的类不会阻止你创建exception包。大小写很重要。同时记住,一个类的完整名称包括它所在的包。因此,a.b.SomeClass(类名)与x.y.SomeClass(包名)是不同的。这里不会有名称冲突。类名和包名必须在大小写和包中匹配才会导致此错误。 - Nate
好的,同意。那么问题的指向是什么?在我看来,它似乎与3.4有关。 - Monis Iqbal
正是我想要的。谢谢伙计。 - Lalit Sharma

2

我知道这听起来很傻,可能太简单了,但我通过以下方式解决了完全相同的错误信息:

  • 删除导致错误消息的整个包名称行。
  • 保存.java文件(这会在同一行上触发新的错误,指出“声明的包”“与预期的包不匹配”),这应该是正常的。
  • 在同一行上重新输入原始包名称。
  • 保存.java文件。

我无法告诉你为什么这样做有效,但它确实有效,Eclipse立即停止抛出异常。

安全打字和快速编码。

-Goodge


这似乎是一个 Eclipse 的 bug,而提到的人已经修复了错误。实际上,尽管错误显示在那里,编译器仍然工作正常。 - Hanash Yaslem

1

我在继承的一份庞大代码库中遇到了类似的问题。结果发现,这是由于JavaDoc链接中存在部分限定的类名导致的。

换句话说,Eclipse告诉我在编译a.b.c.d.London时,出现了a.b.c.d包/类型冲突。在代码中进行a.b.c.d的Java搜索后,我发现Eclipse认为a.b.c.Paris中的JavaDoc注释与其匹配。JavaDoc注释包含{@link d.NewYork}。当我将其更改为{@link a.b.c.d.NewYork}时,编译错误得到解决。

值得注意的是,NewYork未被导入Paris类中,因为它仅出现在JavaDoc注释中。这也使其缩写形式无法解析,无法通过单击注释中的链接来工作。将其改为绝对引用也可以使JavaDoc链接起作用。


0
我在Eclipse中更改了一个编译选项,问题就消失了。 在工作区属性下: Java编译器->错误/警告-> 将“未使用的导入”从“警告”更改为“忽略”。

虽然这解决了我面临的问题,但我无法确定为什么只有这个特定的包首先出现错误。还有许多其他没有立即类的包。 - Monis Iqbal

0
如果您有一个叫做Foo的类,则不能有以Foo结尾的包,例如com.my.Foo。
另外,如果您使用maven样式,在项目中的资源位于src/main/resources之类的位置
您的资源文件夹也具有包样式,并且在那里,您也不能有一个包含您的类名的文件夹。
当按照推荐的惯例开发Jenkins插件时,您肯定会遇到这个问题。
如果您遵循Jenkins惯例,并在名为MyBuilder的类中创建构建器,则还应将.jelly放置在名为x.y.MyBuilder的资源文件夹中。 这将导致上述问题。
但是,如果您将资源文件夹命名为x.y.myBuilder(请注意myBuilder中的小写字母'm'),不像推荐的惯例一样,插件仍将按您预期的方式工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接