Maven launches copy each module's class directory into a snapshot and put
the snapshot on the classpath in place of the original. The originals came
from `module.join("target/classes")`, which on Windows reads
`...\app\target/classes`, while JDT LS reports `...\app\target\classes`.
Compared as text, the original was never removed, so every resource was on
the classpath twice; MyBatis then failed with "XML fragments parsed from
previous mappers already contains value", and any classpath* scan saw
duplicates. Mixed-language builds deduplicated their outputs the same way.
Launch class directories are joined per component, and classpath entries
are compared by a key that ignores the verbatim prefix, the separator,
trailing separators and, on Windows, case.