如何通过编程找到所有未使用的导入?

9
在我的情况下,有两个原因需要这样做:
  • 有时人们会错误地导入MacBook JDK中存在但在Linux中不存在的类。这会导致CI服务器(基于Linux的盒子)构建失败。虽然这种情况并不经常发生,但当它发生时,我认为应该有一些更聪明的方法来提前发现。
  • 未使用的导入会触发IDE /代码分析中的警告。不时有人需要花时间清理这些东西。即使只是在IDE中单击右键,您仍然需要提交更改并确保构建的一切正常。

我很好奇是否有任何办法可以通过编程方式找到未使用的导入(比如从单元测试中),并且如果有任何未使用的导入则在本地失败。

也许因为未使用的导入而使构建失败听起来很严厉,但如果它节省了团队的时间,则有意义(我也很想听听对此的看法)。

更新:

我遵循了yegor256的建议,将Checkstyle任务与最初的Sun代码约定之一(未使用的导入是其中之一)结合起来,并使其在发现违规行为时中断构建。

经过一周的试用,我们的代码库中没有未使用的导入,令人惊讶的是,没有关于此规则的任何投诉(顺便说一句,Checkstyle非常快:分析约100KLoc只需不到一秒钟)。

至于使用IDE进行这种分析:是的,这是一个不错的选择,但将此类检查作为自动化构建的一部分运行更好。


1
顺便提一下,现代大多数IDE都有“修复导入”命令样式,可以清理导入。 - Will Hartung
请注意,这不会强制执行检查,而将其集成到构建工具中会执行检查,并且您不会有一个未使用输入的单个提交。 - Kalle Richter
6个回答

11

1
是的,您的CI构建脚本可以调用Checkstyle、PMD或FindBugs插件。同样的构建脚本可以在本地机器上运行,以检测这些问题并确保在下一次提交之前进行修复。 - asgs

5
如果您正在使用Eclipse IDE或IntelliJ IDEA,您可以将它们配置为:
1a. 在保存或提交之前组织导入/删除未使用的导入(请参阅清理偏好设置)
1b. 将“未使用的导入”警告切换为错误(请参阅错误设置)
2a. 配置不包含com.*内容的jre 2b. 配置来自jre的专有api使用警告为错误
不过,在构建服务器上仍然需要检查一下。在这种情况下,像配置CheckStyle这样更复杂的东西仍然是必要的。

我们同时使用Eclipse和IntelliJ。清理偏好设置——是在项目级别还是IDE级别进行的?我之所以问是因为项目设置存储在Mercurial中,但IDE设置对每个开发人员都是唯一的。 - Petro Semeniuk
我已经有一段时间没有使用IDEA了,不太确定。在Eclipse中,您可以使用项目特定的设置覆盖全局设置。因此,如果您想共享它们,在项目级别指定它们是可以的。 - Christian

1
我很好奇是否有办法通过编程方式(比如从单元测试中)找到未使用的导入,并在本地构建失败,如果有任何未使用的导入项。

我使用IntelliJ来组织导入,这将删除所有未使用的导入。您可以使用一个快捷键从代码库的顶部开始执行此操作,以更正所有导入。(它还具有超过700种其他类型的静态检查和修复)
也许因为未使用的导入而导致构建失败听起来有些严厉,但如果它能为团队节省时间,那么这样做是有意义的(也很想听听您的意见)。
我让IntelliJ检查格式化和组织导入的代码,因此问题从一开始就不会出现。 ;)

谢谢Peter。Christian建议了同样的解决方案。在我的情况下,我们有20多人的团队正在使用相同的代码库,除非它们在项目级别(源代码控制下的项目设置)或使构建失败,否则不可能支持相同的代码标准(包括我自己)。 - Petro Semeniuk
我不明白让构建失败而不修复问题如何有所帮助。无论如何,代码最终都必须被修复。我会让它自动化。 - Peter Lawrey
如果将构建失败作为连续集成机制中的“红旗”使用,而不修复问题,这将有所帮助。 - yegor256
@Peter,我的意思是一旦删除了所有未使用的导入,就可以引入构建失败机制以避免回归。 - Petro Semeniuk
@yegor256,+1。我觉得我们意见一致。 - Petro Semeniuk

0

我看到很多评论都在用这个IDE或那个IDE。但是我的朋友们都试图理解它们之间的区别。编程和使用IDE是不同的。

如果我想让一个过程变得程序化,那么IDE的建议就没有用了。可能有人会问这个问题,因为他正在构建完整的流程,而这一步是其中的一部分。在CI正在工作的不同机器和操作系统上打开IDE会如何帮助他呢?

我也在类似的方向上构建一个工具。我已经实现了一定程度的自动化打开IDE并关闭它,并修复源代码。但是在Linux中打开相同的东西对我来说可能是一个问题。

在回答之前了解别人的观点真的非常重要。


1
你的评论完全正确 - 但它应该是一条注释,而不是一个答案,因为它没有回答(或尝试回答)这个问题。(我确实同意你的观点!) - Max von Hippel

0
在计算机科学中,分析代码而不执行的过程被称为“静态代码分析”。尝试使用一个集成开发环境(IDE),我正在使用Eclipse,它会用黄色下划线标记所有未使用的导入、未使用的变量或方法...

0

这些问题不是无关的吗?如果你只导入本地JDK中存在的类,这些导入就会被使用(只是未满足)。对于任何一个问题,我建议在IDE中解决它,这样问题就会在编写代码时被检测到,而不是在提交之前(检测越早,修复就越容易...)。

在Eclipse中,您可以通过访问规则来防止未满足的导入,并通过启用适当的保存操作来自动修复导入。如果您将这些设置提交到版本控制中,您可以轻松地与团队共享。


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