使用Java中的import语句自动删除显式包声明

时间:2010-01-26 20:50:50

标签: java eclipse refactoring import packages

我有一个由其他人创建的项目,其中包含数千个类文件,并且对于任何类的每个引用都明确键入了包名。看起来代码是逆向工程的。是否有一个很好的Java工具可以重构代码,以便从类引用中删除显式类型的包前缀并移入import语句。

提前谢谢。

修改

我认为一个例子会有所帮助。我想把进口放在最顶层,我不在乎有多少进口。

javax.swing.JButton button1 = new javax.swing.JButton();

想象一下上面的代码,但在成千上万的类文件中成千上万行代码中绝对无处不在。我希望能够删除所有的前缀,只是有一个很好的导入javax.swing.JButton;在每个类文件的顶部。

8 个答案:

答案 0 :(得分:8)

我不知道这个用例的工具,但几个月前我不得不做类似的事情。

  • 编写脚本或使用正则表达式执行搜索替换以删除显式类型的包前缀。

  • 让eclipse使用“组织导入”完成剩下的工作。 CTRL-1

提示:为避免歧义,请使用不超过所需库的类路径设置。 对于大约800个课程,我在2小时内完成。

  • 或者找一个值得做这个工作的人。

编辑:您应该知道在Prefeneces / Java / Editor / Save Actions中,可以将组织导入配置为保存操作。

答案 1 :(得分:5)

对于单一类型,eclipse提供“添加导入”操作(Shift + Ctrl + M)。它完全符合您的要求 - 具有很大的限制:您必须将光标放在类型上,它只会影响该“选定”事件。

但也许这个动作可以用在脚本/全局方法中。 JDT插件可以爬过AST并在它找到的每种类型上调用此操作。

答案 2 :(得分:2)

This thread说:

  

选择包浏览器视图,右键单击您的项目,选择源然后组织导入。将你的叔叔丢掉 - 删除所有不需要的进口

为了更好地格式化:

Right click project > Source > Organize imports

现在,剩下的就是找到一种从代码中剥离完全限定名称的方法。你可能会想到一些正则表达式。看看this library - 看起来很有帮助。 This article也应该有用。

答案 3 :(得分:2)

我使用Michael Ernst的Eclipse plugin做你想做的事。它会将java.util.Collection等引用转换为Collection,并在文件顶部添加import java.util.Collection;

与使用" Source - >实际上是一回事。添加导入"对于完全限定的引用,除了它允许您一次为整个.java文件执行此操作。

更好的是,它允许您批量处理在Package Explorer中选择的所有.java文件。只需右键单击选择,然后选择"来源 - >清洁合格的类型声明"形成上下文菜单。

Eclipse更新站点:http://cqtp.sourceforge.net/eclipse/

答案 4 :(得分:1)

IntelliJ Idea具有基于每个文件执行此操作的工具。你也可以批量做,但我不知道如何。

尝试30天的评估,您可能会对导入清理功能感到高兴。

答案 5 :(得分:1)

我对轴生成的文件有同样的问题,我写了一个小的groovy脚本来做这件事。我没有做任何事情(你必须在运行之后在eclipse中使用组织导入),而且我没有很好地测试它,所以要小心使用它。它也仅限于小写包名和驼峰类名,但它可能是一个很好的起点

def replaceExplicitPackageNamesInFile(File javaFile){
 eol = org.codehaus.groovy.tools.Utilities.eol()

 newFile = ""
 explicitImportExpr = /([^\w])(([a-z0-9]+\.)+)([A-Z][a-zA-Z0-9]+)/
 imports = ""
 javaFile.eachLine { 
  line = it.replaceAll(explicitImportExpr, {
   Object [] match ->
   imports += "import ${match[2]+match[-1]};${eol}"
   match[1]+match[-1]
  })
  newFile += line+"${eol}" 
 }
 newFile2 = ""
 newFile.eachLine { line ->
  newFile2 +=
   line.replaceAll(/(^\s*package.*$)/, {
    Object [] match ->
    match[0] + eol + imports
   } ) + eol
 }
 javaFile.setText(newFile2)
}

def replaceExplicitPackageNamesInDir(File dir){
 dir.eachFileRecurse {
  if (it.isFile() && it.name ==~ /.*\.java\z/){
   println "Processing ${it.absolutePath - dir.absolutePath}"
   replaceExplicitPackageNamesInFile(it)
  }
 }
}

答案 6 :(得分:0)

您可能需要替换所有javax.swing.。然后组织进口。

答案 7 :(得分:0)

我已经能够通过在目标文件上运行下面的sed命令来删除接口中的所有显式包名,然后在eclipse中重新组织导入:

sed -e 's/java\.[^ ]*\.//g;s/com\.[^ ]*\.//g'