<div dir="ltr">This is somewhat related to: <a href="http://mail.openjdk.java.net/pipermail/compiler-dev/2016-November/010544.html">http://mail.openjdk.java.net/pipermail/compiler-dev/2016-November/010544.html</a><br><div><br></div>Starting in 9, javac uses canonical paths in isNameCompatible. So if a source file is a symlink, it reports errors if the symlink target (rather than the user-supplied path) doesn't match the public class name:<div><br></div><div><div>$ echo 'public class Hello {}' > SOURCE</div><div>$ ln -s SOURCE Hello.java</div><div>$ javac Hello.java</div><div>Hello.java:1: error: class Hello is public, should be declared in a file named Hello.java</div></div><div><br></div><div>The diagnostic is confusing because it still uses the user-supplied path, but I'm more interested in whether isNameCompatible should be using canonical paths.</div><div><br></div><div>For what it's worth I prefer the previous behaviour, because our build system uses symlinks extensively and the symlink target is a hash of the content instead of a valid Java file name.</div></div>