[External] : Re: JDK 17 EA build 26 - javadoc tool now writes message to STDERR instead of STDOUT?
Jonathan Gibbons
jonathan.gibbons at oracle.com
Tue Jun 15 16:16:03 UTC 2021
Jaikiran,
Both javac and javadoc provide various entry points. Some of those entry
points take a single stream that is used for all output. You may find
those helpful.
-- Jon
On 6/15/21 9:07 AM, Jaikiran Pai wrote:
> Thank you for these details, Jon. I'll bring this up for discussion on
> our Ant dev list to decide how we deal with this change to take into
> account various JDK versions and difference in their behaviour.
>
> Thank you also for creating that JBS issue to address the part where
> some diagnostic messages are still ending up in STDOUT.
>
> -Jaikiran
>
> On 15/06/21 8:11 pm, Jonathan Gibbons wrote:
>> Jaikiran,
>>
>> This was an intentional change, as part of an effort to align javadoc
>> diagnostics and use of streams with javac.
>>
>> The general policy is that STDOUT should be used when the command and
>> options specify to generate output ... such as the command-line help
>> generated by the `--help` option or the version info generated by
>> `--version`. STDERR should be used for diagnostics and other
>> incidental "chatty" logging messages like `Generating <file>...`
>>
>> The purpose is that STDOUT may be used to pipe output to other
>> commands and should not be "polluted" by diagnostics and logging
>> messages. This is generally described here:
>> https://urldefense.com/v3/__https://en.wikipedia.org/wiki/Standard_streams__;!!GqivPVa7Brio!IDCS8t1LzsWEUK5PutT48IIehxxhhuuBPoUejOQ5chac2rS8qEJ2pvtvhkz5tFqOjqXtlw$
>>
>> -- Jon
>>
>> On 6/14/21 9:55 PM, Jaikiran Pai wrote:
>>> While testing the Apache Ant project with the latest released JDK 17
>>> EA (build 26)[1], we have run into an unexpected test failure in our
>>> project. The test is pretty simple. It launches the javadoc task and
>>> passes it a Java source file which has javadoc content which is
>>> expected to raise a warning message. Something like:
>>>
>>> package test;
>>>
>>> /**
>>> * This is a test class.
>>> */
>>> public class Foo {
>>> /**
>>> * With a test method.
>>> * @param baz wrong parameter name should cause warning.
>>> */
>>> public void foo(String bar) {}
>>>
>>> }
>>>
>>> The test then expects the javadoc tool/command to print a message of
>>> the form "1 warning" to the STDOUT of the launced javadoc process.
>>> Of course, other log messages are also logged to that STDOUT by the
>>> tool.
>>>
>>> In JDK version 8, 11 and even 16, this all works as expected and the
>>> test passes. However, this latest JDK 17 EA, it fails because it
>>> doesn't find this message on the STDOUT of the process. I looked
>>> into this in a bit more detail and it looks like the javadoc
>>> command/tool is now writing this message to the STDERR of the
>>> process. Not just that, it also looks like the tool is now writing a
>>> lot other messages to STDERR, which previously were written to STDOUT.
>>>
>>> To give you can example, if you directly run the javadoc command
>>> from JDK 16 and JDK 17 EA build against the above trivial code, you
>>> will see that in JDK 16, the following were logged to STDOUT:
>>>
>>> Loading source file Foo.java...
>>> Constructing Javadoc information...
>>> Building index for all the packages and classes...
>>> Standard Doclet version 16+36-2231
>>> Building tree for all the packages and classes...
>>> Generating ./test/Foo.html...
>>> Generating ./test/package-summary.html...
>>> Generating ./test/package-tree.html...
>>> Generating ./overview-tree.html...
>>> Building index for all classes...
>>> Generating ./allclasses-index.html...
>>> Generating ./allpackages-index.html...
>>> Generating ./index-all.html...
>>> Generating ./index.html...
>>> Generating ./help-doc.html...
>>> 1 error
>>> 1 warning
>>>
>>> and JDK 16 STDERR only had:
>>>
>>> Foo.java:9: error: @param name not found
>>> * @param baz wrong parameter name should cause warning.
>>> ^
>>> Foo.java:11: warning: no @param for bar
>>> public void foo(String bar) {}
>>>
>>>
>>> Now in JDK 17 EA, the same command generates the following STDOUT:
>>>
>>> Loading source file Foo.java...
>>> Constructing Javadoc information...
>>>
>>> and this STDERR:
>>>
>>> Building index for all the packages and classes...
>>> Standard Doclet version 17-ea+26-2439
>>> Building tree for all the packages and classes...
>>> Generating ./test/Foo.html...
>>> Foo.java:9: error: @param name not found
>>> * @param baz wrong parameter name should cause warning.
>>> ^
>>> Foo.java:11: warning: no @param for bar
>>> public void foo(String bar) {}
>>> ^
>>> Generating ./test/package-summary.html...
>>> Generating ./test/package-tree.html...
>>> Generating ./overview-tree.html...
>>> Building index for all classes...
>>> Generating ./allclasses-index.html...
>>> Generating ./allpackages-index.html...
>>> Generating ./index-all.html...
>>> Generating ./index.html...
>>> Generating ./help-doc.html...
>>> 1 error
>>> 1 warning
>>>
>>> Given the kind of content now being generated in STDERR, it looks
>>> more like a bug than an intentional change, but I wanted to check
>>> here first before filing a JBS issue. Is this an intentional change?
>>>
>>> [1]
>>> https://urldefense.com/v3/__https://jdk.java.net/17/__;!!GqivPVa7Brio!IDCS8t1LzsWEUK5PutT48IIehxxhhuuBPoUejOQ5chac2rS8qEJ2pvtvhkz5tFoPOSiZYg$
>>>
>>> -Jaikiran
>>>
>>>
More information about the javadoc-dev
mailing list