2015-03-22 16 views
18

Próbuję uruchomić Dagger 2 oraz Lombok w moim projekcie Java. Najpierw Lombok musi uciec, ale czy rzeczywiście wydaje się być przypadkowy. Na początku podejrzewałam, że mogę określić kolejność poszczególnych pozycji słoików biblioteki w ścieżce klasy, ale ta kolej najwyraźniej zostanie zignorowana.Określanie kolejności procesorów adnotacji

Czy istnieje sposób, aby określić kolejność ich uruchomienia, czy też po prostu muszę żyć, nie mogąc połączyć dwóch punktów dostępowych?

Mam wyprodukowany SSCCE test case.

Prosty git clone & mvn compile wystarcza do wykazania problem - jeśli komentarz linii 18 i usuń wiersze 20-21 w App.java, będzie to skompilować, chociaż oznaczenie Lombok w linii 18 tworzy identyczną konstruktora. Problem polega na tym, że Lombok wydaje się działać po Sztyletie.

Odpowiedz

12

Po wielu badaniach i rozmowie z jednym z programistów Lombok, okazuje się, że ponieważ javac ładuje klasy w oparciu o hashCode(), kolejność procesorów adnotacji działających w tym scenariuszu jest zasadniczo losowa, a co gorsza , losowe pomiędzy wieloma przebiegami. Obecnie nie wydaje się, aby rozwiązanie tego problemu.

Poszedłem z lombok-maven plugin i delomboking całość, co nie jest doskonałe i nieco hacky, ale przynajmniej daje wynik pracy. W nadziei, że pomoże to przyszłym pracownikom Google, zaprosiłem do repozytorium numer working version.

+1

Osobiście upuściłem Lombok z powodu tych wad i próbowałem przenieść się do framew obsługiwanych przez Javaca lub powrócić do zwykłej Java. Dla obiektów wartości używam @AutoValue. Eksperymentuję też z Groovy.Idealnie chciałbym, aby AspectJ tkał pracę z przetwarzaniem adnotacji (taki jak obecny w Dagger i AutoValue), ale wszedł na https://bugs.eclipse.org/bugs/show_bug.cgi?id=462782. –

+0

Czy pojawiły się jakieś nowe prace nad tym problemem .. Może być kotlin ułatwi życie, ale to nadal oznacza wiele refaktoryzacji w kodzie –

+0

Dziennik zmian [Lombok v1.16.12] (https://projectlombok.org/changelog) sugeruje, że wykonano pracę, aby wesprzeć/poprawić działanie zarówno Lombok, jak i Daggera, ale nie miałem okazji wypróbować tego. – Torque

9

Idealnie kolejność nie powinna mieć znaczenia. Procesory adnotacji powinny tworzyć tylko pliki - za każdym razem, gdy tworzony jest plik, rozpoczyna się kolejna runda przetwarzania, a inny procesor ma szansę ponownie zrobić swoje rzeczy z nowym plikiem. W tym przypadku kolejność nie ma większego znaczenia, więc nie sądzę, że istnieje oficjalny sposób na wymuszenie zamówienia procesorów. Problem polega na tym, że procesor Lombok manipuluje istniejącymi plikami zamiast tworzyć nowe, czego nie powinien robić. Niektóre kompilatory mogą mieć opcję zamawiania procesorów lub używania kolejności, w której procesory są ładowane lub pojawiają się w argumentach wiersza poleceń, ale to zależy od implementacji kompilatora.

Możesz spróbować spojrzeć na Sztylety i Lombok's build process i sprawdzić, które procesory są tam wywoływane. Następnie jawnie skonfiguruj te procesory w swojej macierzy w poprawnej kolejności i przetestuj różne kompilatory i sprawdź, czy któreś z nich uruchomiło je w tej kolejności.

Jeśli to konieczne, możesz podzielić proces kompilacji i uruchomić Lombok z -proc:only najpierw, a potem kolejny krok kompilacji bez Lombok i bez nadpisywania manipulowanych plików (jeśli to możliwe, nigdy tego nie próbowałem).

5

Możliwe jest określenie kolejności procesorów adnotacji w javacu przy użyciu flagi -processor. Jednak nie otrzymałem kompilacji nawet z tym zestawem parametrów. Podejrzewam, że sztylet bezpośrednio analizuje kod źródłowy lub że API procesora adnotacji planuje procesor adnotacji w tej samej rundzie, a modyfikacje lombok nie są propagowane.

Myślę, że obecnie najbardziej niezawodnym rozwiązaniem jest użycie numeru delombok w celu wymuszenia zamówienia.

Ujawnienie: Jestem programistą Lombok.

Powiązane problemy