Автоматически удалять явные объявления пакетов с операторами импорта в Java - PullRequest
19 голосов
/ 26 января 2010

У меня есть проект, созданный другими, который включает тысячи файлов классов и имена пакетов, явно напечатанные для каждой ссылки на любой из их классов. Похоже, код был переработан. Есть ли хороший инструмент для Java, который реорганизует код, так что явно типизированные префиксы пакетов удаляются из ссылок на классы и перемещаются в операторы импорта.

Заранее спасибо.

EDIT:

Я думаю, что пример поможет. Я хочу, чтобы импорт был на вершине, и мне все равно, сколько там импорта.

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

Представьте код, приведенный выше, но абсолютно везде, в тысячах и тысячах строк кода среди тысяч файлов классов. Я хотел бы иметь возможность удалить все префиксы и просто иметь хороший импорт javax.swing.JButton; вверху каждого файла класса.

Ответы [ 8 ]

8 голосов
/ 27 января 2010

Я не знаю инструмент для этого варианта использования, но мне пришлось сделать нечто подобное несколько месяцев назад.

  • Напишите скрипт или выполните поиск вместо регулярного выражения, чтобы избавиться от явно типизированных префиксов пакетов.

  • Чем позволяет eclipse делать все остальное, используя «упорядочить импорт». Ctrl-1

Подсказка: чтобы избежать двусмысленности, настройте classpath не более чем на необходимые библиотеки. Примерно за 800 занятий я закончил за 2 часа.

  • Или попросите кого-нибудь, кто заслужил это сделать эту работу.

РЕДАКТИРОВАТЬ: Вы должны знать, что в Prefeneces / Java / Editor / Save Actions, организация импорта импорта может быть настроена как действие сохранения.

5 голосов
/ 27 января 2010

Для одного типа eclipse предлагает действие «Добавить импорт» (Shift + Ctrl + M). Он делает именно то, что вы хотите - с большим, большим ограничением: вы должны поместить курсор на тип, и это повлияет только на это «выбранное» вхождение.

Но, возможно, это действие можно использовать в скриптовом / глобальном методе. Плагин JDT может сканировать AST и вызывать это действие для каждого найденного типа.

2 голосов
/ 23 марта 2016

Я использую Eclipse-плагин от Michael Ernst, который делает то, что вы хотите. Он преобразует ссылки, такие как java.util.Collection в Collection с добавлением import java.util.Collection; вверху файла.

Это фактически то же самое, что и использование «Source -> Add Import» для полной ссылки, за исключением того, что оно позволяет вам делать это сразу для всего файла .java.

Более того, он позволяет пакетно обрабатывать все файлы .java, выбранные в проводнике пакетов. Просто щелкните правой кнопкой мыши на выделении и выберите «Источник -> Очистить квалифицированные объявления типов» из контекстного меню.

Сайт обновлений Eclipse: http://cqtp.sourceforge.net/eclipse/

2 голосов
/ 26 января 2010

Эта тема говорит:

выберите представление проводника пакетов, щелкните правой кнопкой мыши по вашему проекту, выберите источник, затем организуйте импорт Bobs ваш дядя - все нежелательные импорта удаляются

Чтобы лучше отформатировать:

Right click project > Source > Organize imports

Теперь осталось найти способ убрать полностью квалифицированные имена из кода. Вы можете подумать о каком-то регулярном выражении. Взгляните на эту библиотеку - она ​​кажется полезной. Эта статья также должна быть полезной.

1 голос
/ 02 декабря 2010

У меня была такая же проблема с файлами, сгенерированными осями, и я написал для этого небольшой скриптовый скрипт. Я не делаю все (вы должны использовать упорядочить импорт в 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)
  }
 }
}
1 голос
/ 27 января 2010

IntelliJ Idea имеет инструменты, позволяющие сделать это для каждого файла отдельно. Вы также можете сделать это оптом, но я не знаю как.

Попробуйте 30-дневную оценку, и вы, вероятно, будете удовлетворены не только функциями очистки импорта.

0 голосов
/ 15 мая 2013

Мне удалось удалить все явные имена пакетов в интерфейсах, выполнив приведенную ниже команду sed для целевых файлов, а затем реорганизовав импорт в eclipse:

sed -e 's/java\.[^ ]*\.//g;s/com\.[^ ]*\.//g'
0 голосов
/ 27 января 2010

Возможно, вам нужно заменить все javax.swing.. Затем организуйте импорт.

...