Java Getriebe

Java und NetBeans

The following options were not recognized by any processor

Dokumentationen sind toll. Vorausgesetzt sie erzählen dir von sich aus, was du wissen willst oder musst. Beim Thema „Annotation Processing“ habe ich noch keine wirklich gute Dokumentation gefunden. Viele Dinge muss man sich aus unterschiedlichen Stellen zusammen suchen oder mühsam aus den JavaDocs erraten. Das ganze auch noch in deutsch zu bekommen, kann man glaube ich sowieso vergessen. Umso schöner ist es, wenn man dann doch noch Mal etwas neues entdeckt.

Den eigenen Processor zu debuggen ist nicht unbedingt einfach ((Wieder so etwas, was nicht wirklich gut dokumentiert ist)). Deswegen gehe ich meistens hin und lasse mir diverse Debugausgaben über den Messager der processingEnv machen und mülle mir damit die Compilerausgabe zu. Damit dies einfacher geht, gibt bei mir es eine einfache Hilfsmethode

1
2
3
4
public final void log(String format, Object... args) {
  String message = String.format(format, args);
  processingEnv.getMessager().printMessage(Kind.OTHER, message);
}

Die Methode ist in so Fern klasse, da ich so am Ende meiner Tests die Messager Zeile einfach auskommentieren kann und so wieder Ruhe in der Konsole ist.

Auskommentieren, einkommentieren, wieder auskommentieren ist auf Dauer natürlich auch nicht so toll und so hilft der Zweizeiler

1
2
    if(!isDebug())
      return;

am Anfang der Methode aus. An dieser isDebug() Methode habe ich ’ne Weile gefeilt. Viel ausprobiert und jetzt eine „Lösung“ gefunden, die mir ganz gut zusagt: Optionen für den Processor.

Der javac Compiler bietet die Option „-A“ an, für den in der Kommandozeilenhilfe nur lapidar „-Akey[=value] Options to pass to annotation processors“ steht. Auch die Dokuseite bei Oracle schreibt nur „-Akey[=value] Options to pass to annotation processors. These are not interpreted by javac directly, but are made available for use by individual processors. key should be one or more identifiers separated by „.“. „. Juhu.

Ein Test mit „-AMeinProcessor.debug=true“ ergibt die Warnmeldung

warning: The following options were not recognized by any processor: '[MeinProcessor.debug]'

Das klingt schon sehr nach der Fehlermeldung „No Processor claimed the annotation …“ wenn man vergessen hat die Annotation @SupportedAnnotationTypes an seinen Processor dran zu pappen. Und siehe da, die Codevervollständigung der IDE zeigt eine Annotation @SupportedOptions an.

Von da aus ist es ein leichtes die isDebug() Methode zu schreiben, zumal in processingEnv die Methode getOptions() existiert:

1
2
3
4
5
6
public boolean isDebug()
{
  String option = processingEnv.getOptions().
      get(getClass().getSimpleName() + ".debug");
  return option == null ? false : Boolean.getBoolean(option);
}

Zu den ganzen anderen Annotations der eigenen Processor Klasse kommt noch eine Zeile hinzu:

1
2
3
@SupportedOptions("MeinProcessor.debug")
public class MeinProcessor extends BasicProcessor
{

Damit brauche ich während meiner Arbeiten am Processor selbst das Argument „-AMeinProcessor.debug=true“ dem Compiler mitgeben und ich bekomme die volle Dröhnung in der Konsole und ansonsten ist alles ruhig.