我在依赖项下有一个类BaseLoginDialog
,需要修改它,因为它不可扩展。出于这个原因,我在我的项目模块下创建了另一个文件BaseLoginDialog
,其中包含与原始BaseLoginDialog
相同的包路径。在我自己的本地BaseLoginDialog
中添加一些新方法后,我不能在我的项目中的任何地方使用它们,而IDEA没有抱怨未声明的方法。但是,项目仍然编译,并且方法在运行时可以正常工作。如果我单击导入以浏览到该文件,IntelliJ仍然链接到旧文件,但它似乎正确编译与新文件。
我该如何解决此问题?在任何地方始终都有错误行和红色标记会使编码时感到困惑。
一些背景: 该项目使用Gradle进行依赖和编译。使用Gradle和IntelliJ运行操作进行编译和运行时,只会错误地显示错误,这是一个问题。
Grade文件将所需的库添加为依赖项。即使Gradle同时包含源文件和类文件,打开通过Gradle导入的文件仍会链接到类文件。为了解决这个问题,我还在库下添加了所需的文件作为源代码。
任何帮助将不胜感激,谢谢!
编辑: 切换到在项目上使用Maven仓库,现在我不再需要另外添加库了,但这个问题仍然存在。
答案 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
。
希望这有助于将来遇到同样问题的人。