Sun’s tool for generating HTML documentation on classes by extracting
comments from the Java source code files. The tool is spelled javadoc.exe
all lower case, and the documents produced are spelled Javadoc.
You used to see JavaDoc and JavaDOC,
but Sun has standardised on Javadoc
Javadoc Tags
The comments look like this:
| Class Javadoc Tags |
Method Javadoc Tags |
|
|
Javadoc tags are for /** comments only. Don’t
use them in or
comments.
Canonical Javadoc Tag Order
You should keep @block tags within Javadoc comments in the following canonical
order:
| Canonical Order of Javadoc tags |
| tag |
In Class
Comment |
In Method
Comment |
| @author |
|
|
| @inheritDoc |
|
|
| @override |
|
|
| @param |
|
|
| @return |
|
|
| @throws |
|
|
| @version |
|
|
| @see |
|
|
| @since |
|
|
| @serial |
|
|
| @serialData |
|
|
| @serialField |
|
|
| @deprecated |
|
|
| @custom tags |
|
|
Sun does not officially define the order of order of: @author,
@inheritDoc, @override
or @custom tags. Neither javac.exe
not javadoc.exe issue error or warning messages if your
tags are out of order. The main reason to keep them in order is same reason you
the phone book is sorted alphabetically — to make it easier to find what
you are looking for.
Generating Javadoc
You can generate the HTML with javadoc MyClass.java.
the -notimestamp option stops it from timestaming the
results. Timestamping creates false deltas which will burden a version control
system. If you want private methods also documented use:
javadoc.exe -breakiterator -charset "UTF-8" -private MyClass.java
If you run out of RAM, expand the virtual memory space with:
javadoc.exe -breakiterator -charset "UTF-8" -J-mx64m -J-ms64m...
if that does not work try:
javadoc.exe -breakiterator -J-mx64000000 -J-ms64000000...
-breakIterator use the newer way of computing where
the first sentence of your Javadoc ends.
-charset control the encoding of the generated files.
This will create Javadoc of everything in the current directory and put it in a
subdirectory of this one called javadoc. Without the -d, the Javadoc will all be
muddled in with your source.
javadoc.exe *.java -d javadoc -breakiterator
Praise
If you a have used C++, and found it so
difficult to discover what a method does or a type is, you will love Javadoc.
You can easily find the documentation you need, and it is right in the source
where it is kept up to date. Creating html Javadoc on your own unfinished code
can help you see how the classes interact or rapidly find the method you are
after. The Javadoc utility also acts as a lint on your Javadoc helping you get
all the parameter names correct and complete.
Browsing Javadoc
Familiarise yourself with all the useful cross referencing information Javadoc
generates.
The USE button is amazing. It will tell you the place
other classes extend, implement, or use this class. It can help you figure out
what you can do with one of these objects, or how you create one when there is
no constructor.
The TREE button shows you the class hierarchy, what
inherits from what.
The INDEX button shows you all the fields and methods
in the entire package an alphabetical order.
The OVERVIEW button shows you a short description of
all the packages in the universe.
The FIELD, CONSTR and METHOD
buttons let you jump right to that section for the current class.
Gotchas
- the separator for elements of the -sourcepath and the -exclude
options are the : whereas the separator for elements
of the -classpath option is the ;.
- Javadoc needs the same classpath that was used to compile the source. It can’t
see any special jars added to javac.exe via -cp.
- Make sure you have freshly compiled and that there are no old stray class files
before you run Javadoc.
- Contrary to the documentation, you can’t produce Javadoc on source in jar
files. You have to expand them first. Similarly you can’t produce Javadoc
from jars of class files, not even rudimentary Javadoc. Javadoc.exe
is much pickier than Javac.exe about classes
being named precisely to match their directories and *.java names, including
case.
Bugs
Javadoc generates invalid anchor names that contain spaces, commas and
parentheses. If you link to them, you can replace the spaces with %20, but then
Opera and IE will not work. Netscape, Mozilla and Firefox will however.
Documenting a Package
Here is a how you document the package as a whole. Create a file called package-info.java
in the same directory as the other *.java files in the
package. Note the lower case and the dash. This is a deliberately illegitimate
class name. Eclipse won’t let you create it unless you tell Eclipse it as
a common file, not a class.
Make sure your Javadoc for the package as a whole comes right before the package
statement. Then run your Javadoc generate on the entire package as usual. Note
that this is not not a /**
comment and it contains no Javadoc. Note also the package comment contains no @tags.
Yuch
Something has always disgusted me about Javadoc — that you are supposed to
embed unreadable HTML markup in your Java source program comments. This makes
them often unusable for those who need them most. If you don’t use
entities and tags, the generated Javadoc HTML looks like a solid block of black
mush.
Here is a classic example of what sort of a mess you source code looks like:
Would it not be so much nicer if could be coded like this in plain text Unicode:
Even when you perfectly encode your HTML entities and tags in your javadoc
comments, the HTML that javadoc.exe generates is
somewhat rank.
I suggest the following improvements in descending order of importance:
- Include a utf-8 charset declaration in the
generated HTML.
- Clean up the code generator so the HTML it generates passes validation, provided
the Javadoc comments themselves are well-formed HTML.
- For a Javadoc comment without embedded HTML tags, treat them as if they had been
enclosed in <pre> … </pre>
- Validate the HTML in Javadoc tags and complain about it if it is wrong.
- If the encoding of the generated HTML is embedded as utf-8,
then there is no need for accented character entities in the generated HTML.
There is no need for entities either in the Javadoc. You could encode awkward
characters in your in your comments with or without entities.
- That leaves a handful of truly awkward characters: <
> and &.
Are they meant as HTML tag delimiters or literally? What we need is a more
readable convention to tell the two meanings apart. I suggest we commandeer some
obscure Unicode characters such as \u227a
≺ which looks much like < and \u227b
≻ which looks much like >.
They won’t render in most fonts, because that does not matter. That is
just the way they are stored in Java source
when you meant literal < and >
not embedded html tag delimiters. The IDE can optionally display them as
ordinary < and >
but in a special colour, or use a font that supports them. Javadoc will convert
them to < and >.
All existing Javadoc that uses HTML tags and entities will continue to work
unmodified. If fonts are available that display them, these obscure variants
will work even unmodified. They seem to render OK in my browser with tiresias
pcfont z font.
I will leave as an exercise for the reader to select a suitable proxy character
for & and to ponder whether any other awkward
characters need this special treatment. My guts tell me in is unecessary to
treat " specially.
- Define a canonical format for Javadoc comments and have IDEs reformat as a
matter of course when source code is tidied. This would include collapsing
multiple blank lines to one, aligning the stars etc.
- More clearly document what sort of HTML you are and are not allowed to embed in
kosher Javadoc comments.
- Teach IDEs the conventions so they warn you right away of malformed HTML in
Javadoc comments, and Javac treats them as warnings. This format might even
become part of the JLS. (While we are at it, start gently enforcing naming
conventions as informational messages.)
- IDE tools to let you view the embedded Javadoc comments as Unicode chars,
minimally encoded entities (just crucial) or fully encoded entities (even
entities that did not strictly need encoding). Internally the data would be
stored in the source file as Unicode/utf-8, and
rendered HTML, as they would look to someone browsing the Javadoc. This is
purely a display rendering option. The source program does not change.
- Javadoc was a lashup to demonstrate the concept of embedding program
documentation in programs, and using it to generate cross-indexed highly
readable documentation. It has been a resounding success. It is one of the main
reasons Java has done so well. It is time to take second look at it and polish
it so that it becomes an utterly integral to all programs, not just those
authored by the fastidious.
- Even if no one salutes, it is possible partically fix the the problems with text
processors that massage the Java source, and massage the Javadoc output. All you
need is a font that supports some proxy characters, and a keyboard macro tool or
keyboard firmware to generate them.
Tips
Before you write reams of Javadoc, look at some vaguely related topics, examples,
and generate some HTML to learn some of the fine points.
- @author and @version
are not officially permitted on individual methods, just classes and interfaces.
- There is no @copyright tag. Don’t include
copyright information on the @author tag. Embed
it in an ordinary comment at the very top before
the package statement. You can ensure your
copyright is displayed on all generated Javadoc by embedding it in your package
template.
- Javadoc may include HTML tags. Make sure you use entities <
and > for <
and > HTML tags have no special meaning in
ordinary comments. They won’t help beautifiers reflow your comments nicely.
- Javadoc contains only information for clients of your classes and methods.
Don’t include implementation trivia or version history.
- Sun has documented all the methods in the standard class libraries. This is your
main source of information about how to use the standard classes.
- Generated Javadoc in JDK 1.2+ is quite different
from 1.1, and easier to navigate. Javadoc now automatically re-uses doc comments
for some methods. If a method in a class (C) or interface (I) has no comment or
tags, Javadoc will instead use the comment and tags from a method it either
overrides or implements, if any. For a method in class C, it does this by
searching recursively through all interfaces that class C implements, then
through all superclasses of C. This saves hours of propagating Javadoc comments.
- Java has no Eiffellian preconditions. The biggest problems are with Strings. Can
this method accept a null? Can it accept an empty string? can it accept a blank
string consisting only of whitespace chars (e.g. <
33)? I suggest the following convention to inch us toward precondition Nirvana.
The USE Link
I had been using Javadoc for years and never noticed the USE
link at the top of some pages. If you click, it will tell you what other classes use
this class, e.g. have factory methods to construct these Objects,
have methods that use them as parameters, or that modify return modified
versions of them.
While you are there, explore the other useful Javadoc cross reference
information. docs\technotes\guides\javadoc
Learning More
Sun’s JDK Tool Guide to
javadoc.exe : available:
Sun’s JDK Technote Guide on
Doclets : available:
Sun’s JDK Guide to
com.sun.javadoc Doclet API : available:
Sun’s JDK Tool Guide to
fine points : available:
For an example of how not to write Javadoc see this classic Sun example.
Sun’s Javadoc on
Example of Bad Javadoc : available:
It tells you the obvious yet never tells you what
anything is for, and it fails to point you to a place to learn the arcane HTTP
header field vocabulary.