2015-02-25 13 views
9

Napisałem custom taglet library o nazwach, które rozpoczynają z kropką: .codelet, .codelet.and.out, itp. Jest kompilowany z JDK 7.JDK 1.7 umożliwia niestandardowe znaki z nazwami * począwszy * z kropką. JDK 1.8 zabrania tego?

Podczas generowania JavaDoc przy użyciu 1.7 javadoc.exe, działa dobrze. Ale podczas generowania go z JDK 8, to nie dlatego,

C:\...\Temp.java:5: error: no tag name after @ 
* {@.codelet mypkg.Temp}` 

Gdybym zmienić kod korzystając się taglet (nie sam kod taglet) do {@codelet mypkg.Temp}:

C:\...\Temp.java:5: error: unknown tag: codelet 
* {@codelet mypkg.Temp} 
Note: Custom tags that were not seen: @.codelet 
1 error 

Zmiana nazwy w kod źródłowy tagletu ma być cod.elet (code.let nie jest dobry, ponieważ code jest już istniejącą nazwą tagletu) i przy użyciu tej nowej nazwy działa.

Dokumentacja narzędzie JavaDoc dla -tag option (w dolnej części) stwierdza:

Unikanie konfliktów: Jeśli chcesz stworzyć własną przestrzeń nazw, a następnie można użyć kropka oddziela konwencji nazewnictwa podobne do tego używanego w pakietach: com.mycompany.todo. Oracle będzie nadal tworzyć standardowe tagi, których nazwy nie zawierają kropek. Każdy utworzony znacznik zastąpi zachowanie znacznika o tę samą nazwę zdefiniowaną przez Oracle. Jeśli utworzysz tag lub taglet @todo, zawsze będzie to samo zachowanie, które zdefiniujesz, nawet jeśli Oracle później utworzy standardowy tag o tej samej nazwie.

Brakuje mi tu czegoś? Czy to nieudokumentowana zmiana, która po prostu jest do bani? Ponieważ wymaga to całkiem dużej zmiany w mojej bibliotece, jeśli tak jest.

FYI: Taglet overview docs

+1

Powiedziałbym, że to prawdopodobnie nieudokumentowana zmiana. Myślę, że założenie jest takie, że identyfikatory Java w ogóle nie zaczynają się od kropki.Na przykład nazwy pakietów, AFAIK, nie mogą rozpoczynać się od kropki. Prawdopodobnie był to błąd, który był dozwolony w poprzednich wersjach. Czy nie możesz zmienić nazwy tagletu na "codelet", czy w najgorszym przypadku "aliteralmind.codelet"? – GreyBeardedGeek

+0

Jest to publicznie dostępna biblioteka używana przez tysiące programistów java na całym świecie (pozwól mi śnić). Obecne i niedługo stare nazwy tagletów muszą być przestarzałe, a nowo utworzone nazwy tagów muszą zostać utworzone, aby je zastąpić. Nie łamanie mózgu, ale bardzo czasochłonne. To duży ból. To * jest * zalecane dla użytych kropek, aby uniknąć konfliktów z przyszłymi tagletami Sun, więc zamierzam pójść z 'cod.elet' (dreszczem). – aliteralmind

+1

Duży ból, którego można uniknąć, stosując się do tego, co cytowałeś: "użyj konwencji nazw oddzielonej kropkami podobnej do tej używanej w pakietach". Nic nie wspiera założenia, że ​​wiodące kropki powinny działać. W końcu nie rozumiem, dlaczego w ogóle używałeś kropek w swoich nazwiskach. Przestrzenie nazw miały rozwiązać potencjalne niejasności, które działają tylko wtedy, gdy deweloperzy wybierają unikalne przestrzenie nazw, ale jeśli nie wybierzesz unikalnej przestrzeni nazw, nie musisz ich używać ... – Holger

Odpowiedz

4

Więc jestem brakuje czegoś tutaj?

Cóż, część dokumentacji, którą cytowany mówi tak:

"... wtedy można użyć oddzielonych kropkami konwencję nazewnictwa podobną do tej stosowanej w pakietach: com.mycompany.todo "

Zauważ, że mówi" konwencja nazewnicza ", a nie" nazwy z kropkami w nich ".

Należy zauważyć, że jest napisane "podobny do tego, który był używany w przypadku pakietów". Jeśli spróbujesz użyć ".mypackage" jako nazwy pakietu, kompilator powie "Nie ma mowy!".

Moje czytanie jest takie, że nazwa znacznika ".codelet" nie spełnia kryteriów określonych w dokumentacji. Tak więc stało się tak, że wersja Java 8 z wersji javadoc została zmieniona w celu ścisłego egzekwowania reguł nazewnictwa tagletów. To niefortunne z twojej perspektywy, ale ostatecznie problem tkwi w komentarzach do javadoc, a nie w narzędziu.