我们有一个以例外情况结束的包裹,例如:
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中的错误还是有一些设置来纠正这种行为?
答案 0 :(得分:7)
这是因为exception
包中有一个名为a.b.c
(小写“e”)的类和一个名为a.b.c.exception
的包。
它会导致名称冲突,因为如果您有代码a.b.c.exception.doSomething();
- 这是否意味着您要在doSomething()
类中调用静态a.b.c.exception
方法?或者它是否意味着有一个名为a.b.c.exception.doSomething
的类,你试图调用它的构造函数?
坚持使用Java命名约定 - 将所有小写包装起来,以大写字母开头并以驼峰形式开头 - 你永远不会看到这个问题。
========== EDIT ==========
这是此错误应显示的唯一合法原因...
它不必直接在您的项目中,它可能在您的项目所依赖的另一个项目或库中。这应该显示构建路径或项目中任何位置出现的类:在Eclipse工具栏中点击Flashlight查找按钮 - >选择“Java搜索” - >在搜索字段中输入a.b.c.exception - >选择'区分大小写' - >在“搜索”中选择“类型” - >确保为“搜索范围”选择了所有选项。
您使用的是生成类的任何工具吗?他们可以将它们放入项目的构建目录中吗?当您看到错误时,如果您转到项目的构建目录,然后进入a / b / c /目录,您会看到“异常”的.class文件吗?
当然Eclipse总体上可能有一个错误(虽然我希望Eclipse 3.4中会有一个bug报告,如果它是......你就能找到更多的抱怨),你的Eclipse安装可能是以某种方式打破(其他人可以在Eclipse 3.4中打开你的项目吗?你能在另一个目录中安装一个干净的Eclipse 3.4吗?错误是否出现在那里?),或者你的项目可能会以某种方式混乱(创建一个新项目除了JDK之外没有依赖项,在新项目中创建abcexception包,在项目中创建一个类import a.b.c.exception.*;
并查看是否发生错误。)。
答案 1 :(得分:4)
在Java中,您不能拥有与包名相同的类名。
这意味着JDT包必须仅在3.4
中强制执行该规则例如,请参阅bug 63668。
正如Nate评论:
名为Exception的类不会阻止您创建包例外 案件重要。
还要记住,课程的全名包括其所在的课程。
因此a.b.SomeClass
(类名称)与x.y.SomeClass
(包名称)不同 这里没有名字冲突。类名和包名必须在case和package中匹配才会导致此错误。
答案 2 :(得分:1)
我在我继承的庞大代码库中遇到了类似的问题。事实证明,冲突是由JavaDoc链接中的部分限定类名引起的。
为了解释,Eclipse告诉我,我有a.b.c.d的包/类型冲突。在编译a.b.c.d.London时。对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链接起作用。
答案 3 :(得分:1)
我知道这听起来很傻,而且可能太简单了,但我通过以下方式解决了这个完全相同的错误信息:
无法告诉你为什么会这样,但确实如此,Eclipse当场就停止发脾气。
安全打字和快速编码。
-Goodge
答案 4 :(得分:0)
我改变了eclipse中的一个编译选项,问题就消失了。 在工作区属性下: Java编译器 - >错误/警告 - > 将“未使用的导入”从“警告”更改为“忽略”。
答案 5 :(得分:0)
如果您有一个Foo类,则不能使用以Foo结尾的包,例如com.my.Foo。
此外,如果您使用maven样式,则您的项目中的资源类似于src / main / resources
资源中的文件夹也有一个包样式,而且,您也不能拥有包含类名称的文件夹。
根据建议的惯例开发Jenkins插件时,您肯定会遇到此问题 如果您遵循Jenkins约定,并且在包x.y中的名为MyBuilder的类中创建构建器,那么您还应该将.jelly放在名为x.y.MyBuilder的资源文件夹中。这将导致上述问题 但是,如果您将资源文件夹命名为x.y.myBuilder(注意小写' m'在myBuilder中),与推荐的约定不同,该插件仍将按预期工作