[External] : Re: anomaly with apidiff output

Jonathan Gibbons jjg3 at pobox.com
Wed Mar 12 16:13:24 UTC 2025


If you use `--jdk-build` you typically don't need to set any other 
javac-like options, including `--module-source-path`. `--jdk-build` will 
automatically use the source files in the `src.zip` in the given build. 
The only reason that may not be enough would be if you are wanting to 
compare any classes whose sourcs is not in src.zip -- yes, some files 
might be omitted in certain situations, but that's a different, more 
complicated story.

-- Jon


On 3/11/25 2:20 PM, Stuart Marks wrote:
>
>
> On 3/9/25 5:28 PM, Jonathan Gibbons wrote:
>> With respect, you're way off base here.
>>
>> apidiff uses the declarations in the source and class files to 
>> perform a structural comparison using the Language Model API (JSR269) 
>> available to `javac` plugins and extension classes. Having determined 
>> the declarations to be compared, and having compared the underlying 
>> elements, it will then optionally in addition try and locate the 
>> generated API documentation to run a comparison of the HTML 
>> description generated by javadoc.
>>
>> There is not sufficient information in the HTML files to fully 
>> reverse engineer the Language Model elements that can otherwise be 
>> obtained using the `javac` front end. 
>
> OK, fair, I remember you saying this, and the docs imply that the 
> sources and class files are required. That said, since apidiff seemed 
> to accept the javadoc HTML output, I figured I'd give it a try, and it 
> looked like it allllmost worked....
>
> But I understand that making it work in this mode (using only HTML as 
> input) is probably untenable in the general case, and that's fine. 
> Previously, you had said:
>
>> If you do not provide the necessary options, the tool will fall back 
>> to using the platform classes. Maybe there is a way to enhance the 
>> command-line analysis to warn when the set of given options look at 
>> lest superficially insufficient.
>
> Yes, it seems like that would be good.
>
> ***
>
> Anyway, that aside, I took your advice and instead ran apidiff, 
> providing it with sources and class files. I did two full JDK builds 
> that differed only in the spec changes to AbstractStringBuilder, which 
> would produce changes only in the javadoc output of StringBuilder and 
> StringBuffer. The command line was something like this:
>
> $ apidiff --api old --jdk-build jdk-tmp-a/build/macosx-aarch64 \
>     --module-source-path jdk-tmp-a/open/src/java.base/share/classes/ \
>     --api new --jdk-build jdk-tmp-b/build/macosx-aarch64 \
>     --module-source-path jdk-tmp-b/open/src/java.base/share/classes/ \
>     --include 'java.base/java.lang.*' --output-directory apidiff.out
>
> And the output was pretty much the same as previously. That is, I got 
> a nice report showing differences in StringBuffer and StringBuilder. 
> StringBuffer had the correct differences in four methods, and 
> StringBuilder was missing some method declarations (both changed and 
> unchanged) and showed diffs only in the toString() method.
>
> For reference, here's the previous output:
>
>     https://cr.openjdk.org/~smarks/misc/sb.apidiff/
>
> I could upload the new output but it's essentially the same to my eye.
>
> Before going further, is this the right way to invoke apidiff?
>
> s'marks
>


More information about the apidiff-dev mailing list