Tab Auto Completion für Apache Maven unter Kubuntu

Auf der Apache Maven Seite findet sich eine kurze Anleitung wie man unter der Bash eine Tab Auto Completion für Apache Maven 2 einrichten kann. Eine Anleitung für die Einrichtung der Completion für Linux, Windows und Mac läßt sich hier finden.

Allerdings werden in den Beschreibungen nur fixe Werte für die Tab Completion angegeben, man muss also alle Plugins genau kennen, die man über die Tab Auto Completion zur Verfügung stellen will. Ich habe das ganze etwas erweitert, so dass alle im Maven Repository verfügbaren Plugins (unterhalb von org/apache/maven/plugins) verwendet werden können. Momentan sieht eine Ausgabe auf meinem System so aus:

kkoehler@halo:~$ mvn [tab] [tab]
antrun:run                                   plugin:helpmojo
checkstyle:check                             plugin:report
checkstyle:checkstyle                        plugin:updateRegistry
checkstyle:help                              plugin:xdoc
clean                                        project-info-reports:cim
clean:clean                                  project-info-reports:dependencies
compile                                      project-info-reports:dependency-convergence
compiler:compile                             project-info-reports:dependency-management
compiler:testCompile                         project-info-reports:help
deploy                                       project-info-reports:index
eclipse:add-maven-repo                       project-info-reports:issue-tracking
eclipse:clean                                project-info-reports:license
eclipse:configure-workspace                  project-info-reports:mailing-list
eclipse:eclipse                              project-info-reports:plugin-management
eclipse:install-plugins                      project-info-reports:plugins
eclipse:m2eclipse                            project-info-reports:project-team
eclipse:make-artifacts                       project-info-reports:scm
eclipse:myeclipse                            project-info-reports:summary
eclipse:myeclipse-clean                      release:branch
eclipse:rad                                  release:clean
eclipse:rad-clean                            release:perform
eclipse:to-maven                             release:prepare
help:active-profiles                         release:rollback
help:all-profiles                            resources:copy-resources
help:describe                                resources:help
help:effective-pom                           resources:resources
help:effective-settings                      resources:testResources
help:evaluate                                site
help:expressions                             site:attach-descriptor
help:help                                    site:deploy
help:system                                  site:jar
install                                      site:run
install:install                              site:site
install:install-file                         site:stage
jar:jar                                      site:stage-deploy
jar:sign                                     source:aggregate
jar:sign-verify                              source:jar
jar:test-jar                                 source:test-jar
package                                      surefire:test
plugin:addPluginArtifactMetadata             test
plugin:descriptor

Entsprechend ist die Ausgabe bei "halben" Kommandos:

kkoehler@halo:~$ mvn help [tab] [tab]
help:active-profiles     help:evaluate
help:all-profiles        help:expressions
help:describe            help:help
help:effective-pom       help:system
help:effective-settings

Die Anpassungen hierzu waren minimal. Ich musste "nur" ein kleines Progrämmchen schreiben, das alle Plugin Metainformationen ausliest und von dort die entsprechenden Goals als Liste ausgibt. Da das Suchen und Parsen der Plugins eventuell recht lange dauern kann, wird in der Anwendung die Liste gechacht und nur einmal am Tag neu generiert. Somit läuft das ganze wirklich flott!

Programmiert ist alles in Java und zur Startzeitoptimierung mit gcj noch nativ übersetzt. Ob das wirklich was bringt weiß ich allerdings nicht, ich habs nicht gemessen ;-).

Mein Skript unter '/etc/bash_completion.d' sieht jetzt so aus:

#!/bin/bash

_m2_make_goals()
{
  plugin=$1
  mojos=$2
  for mojo in $mojos
  do
    export goals="$goals $plugin:$mojo"
  done
}

_m2_complete()
{
  local cur goals

  COMPREPLY=()
  cur=${COMP_WORDS[COMP_CWORD]}
  goals='clean compile test install package deploy site help:effective-pom '
  goals+=`/usr/bin/mavenBashComplete -list`
  cur=`echo $cur | sed 's/\\\\//g'`
  COMPREPLY=($(compgen -W "${goals}" ${cur} | sed 's/\\\\//g') )
}

complete -F _m2_complete -o filenames mvn

Wer die Anwendung selbst benutzen möchte findet hier das Jar File mit der Anwendung . Über folgenden Befehl läßt sich die Anwendung starten:

java -jar maven-bash-completion.jar

In der vorliegenden Version wird im Home Verzeichnis des aktuellen Benutzers unter '.m2/repository/org/apache/maven/plugins/' nach den Plugins gesucht. Die Cache Datei wird als '.m2_bash_complete_cache' im Home Verzeichnis abgelegt. Wer Änderungen am Quellcode machen möchte kann sich gerne an mich wenden !

Ich habe auch noch eine zweites Skript in Bearbeitung, das sämtliche Plugins des aktuellen Projektes mit aufnimmt. Ist aber noch in Arbeit...