即使在本地再次创建文件后,IntelliJ Idea也会保持链接到库文件

时间:2015-09-14 14:30:53

标签: java intellij-idea

我在依赖项下有一个类BaseLoginDialog,需要修改它,因为它不可扩展。出于这个原因,我在我的项目模块下创建了另一个文件BaseLoginDialog,其中包含与原始BaseLoginDialog相同的包路径。在我自己的本地BaseLoginDialog中添加一些新方法后,我不能在我的项目中的任何地方使用它们,而IDEA没有抱怨未声明的方法。但是,项目仍然编译,并且方法在运行时可以正常工作。如果我单击导入以浏览到该文件,IntelliJ仍然链接到旧文件,但它似乎正确编译与新文件。

我该如何解决此问题?在任何地方始终都有错误行和红色标记会使编码时感到困惑。

一些背景: 该项目使用Gradle进行依赖和编译。使用Gradle和IntelliJ运行操作进行编译和运行时,只会错误地显示错误,这是一个问题。

Grade文件将所需的库添加为依赖项。即使Gradle同时包含源文件和类文件,打开通过Gradle导入的文件仍会链接到类文件。为了解决这个问题,我还在库下添加了所需的文件作为源代码。

任何帮助将不胜感激,谢谢!

编辑: 切换到在项目上使用Maven仓库,现在我不再需要另外添加库了,但这个问题仍然存在。

2 个答案:

答案 0 :(得分:2)

如果应用程序的类路径中存在两个具有相同名称和包的类,则它是包含在命令行的第一个依赖项中的一个类。

在IntelliJ中,您可以重新排序依赖项,因此可以将本地依赖项放在另一个库之前。但是,我不确定这是否适用于gradle项目。

但我认为这不是一个好习惯吗?为什么不能将额外的方法放在子类中,例如EnhancedLoginDialog,并使用那个?

或者,如果原始库是开源的,请将其分叉,进行更改并将其安装为自定义版本,例如: dialogs-1.0-CUSTOM-1.jar,并在您的项目中使用此版本。当你在它的时候,为库的维护者创建一个pull请求,在下一个版本中包含你的修复: - )

答案 1 :(得分:0)

我已经解决了这个问题。

我复制到本地文件的文件是BaseLoginDialog。显示错误的文件是我的NewLoginDialog,其扩展LoginDialog,扩展了BaseLoginDialog。似乎当IntelliJ进入我的NewLoginDialog时,它看到我已经扩展LoginDialog。因此,它跳转到库文件并找到LoginDialog extends BaseLoginDialog,现在当它找到BaseLoginDialog时,它会使用库文件并忽略我BaseLoginDialog的本地副本。

基本上,一旦IntelliJ分支到一个库中,如果它已经可以在库中找到它,它在查找其他文件时不会移回。

要解决这个问题,我还简单地在本地复制LoginDialog,即使它是相同的(简单地分支它并且没有改变任何东西)。现在,IntelliJ在我的本地文件中找到LoginDialog,因此也在本地找到BaseLoginDialog

希望这有助于将来遇到同样问题的人。