redhat-developer / redhat-developer/vscode-java
Multi-Release JARs (MRJARs) pick the wrong class on higher Java versions
Nessuno ha ancora preso questa issue.
- Lingua principale
- TypeScript
- Stelle
- 2.3k
- Fork
- 546
- Merge medio
- 20h 1m
- PR unite (30g)
- 11
Descrizione
Libraries in the classpath with a Multi-Release structure work fine when using the lowest allowed Java version. However, when using a higher version that provides a replacement class, VSCode loads the lower version instead of the replacement. Another interesting thing is that when looking at the library on the Java Project Explorer using a higher Java version, classes with a replacement show duplicates, but they all switch back to the lowest when opened.
Environment
- Operating System: Windows 11 - 22H2 (build 22621.2283)
- JDK version: v20.0.2 (Gradle Java Toolchain for 11 and 17)
- Visual Studio Code version: v1.82.2
- Java extension version: v1.22.1
Steps To Reproduce
- Add a Multi-Release JAR dependency to a project.
- For these steps, I'm using Maybe for Java, which is a library of my authoring. This way, I know the
Eitherinterface has a replacement for Java 17, which makes the interface sealed, plus it uses record classes for the implementations. - This means that on Java 11, you could make any class implement
Either. But on Java 17, trying to implementEithershould show a compilation error.
- For these steps, I'm using Maybe for Java, which is a library of my authoring. This way, I know the
- Make sure to use the lowest allowed Java version for the library (e.g., Java 11)
- Use the Java Project Explorer to ensure the MRJAR lib has the
META-INF/versionsfolder with replacement classes - Import a class with replacement (e.g.,
import io.github.joselion.maybe.utils.Either;) - Go to the definition of the imported class. It should show its lowest version (e.g., interface without sealed keyword and no records)
- Switch to a higher Java version (e.g., Java 17)
- Using Gradle and the Java Toolchain can be useful
- You may need to run the
Java: Clean Java Language Servercommand
- Use the Java Project Explorer to verify the
META-INFdirectory does not containversionsanymore - Go to the definition of the imported class again. It still shows the lowest version (e.g., it should show a sealed interface and records instead)
Sample project: java-sandbox.zip
Logs: Nothing is logged during the process
Current Result
MRJAR references the lowest version class when using a higher Java version
Expected Result
MRJAR references should use the matching class based on the current Java version.
Additional Information
I'm willing to help with a PR if someone can point me in the right direction. Knowing where and how this should be handled will be of great help 🙂
I'm also adding some screenshots of the Java Project Explorer with an MRJAR dependency expanded.
With Java 11:
With Java 17:
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Riproduci il problema con il java-sandbox.zip collegato, il Maybe for Java MRJAR e le toolchain Java 11 e 17. Inizia con Java Project Explorer e il comando Java: Clean Java Language Server, quindi traccia il modo in cui viene selezionata la definizione della classe importata dopo il cambio di versione. Il lavoro è completato quando viene mostrata la classe MRJAR corrispondente alla versione Java corrente.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- java, typescript, vscode
- Ambito
- developer-experience, tooling
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 38/100