|
| 1 | +# Guice Upgrade Analyse für eclipse.jdt.ls - Java 21+ Kompatibilität |
| 2 | + |
| 3 | +## Zusammenfassung |
| 4 | + |
| 5 | +eclipse.jdt.ls nutzt **Guice 5.1.0** transitiv über **M2E 2.9.1 → Maven 3.9.11**. Guice 5.1.0 verwendet `sun.misc.Unsafe`, was in Java 21+ Warnungen erzeugt und in zukünftigen Java-Versionen entfernt wird. |
| 6 | + |
| 7 | +## Aktueller Dependency-Pfad |
| 8 | + |
| 9 | +``` |
| 10 | +eclipse.jdt.ls |
| 11 | + └── org.eclipse.m2e.maven.runtime (optional dependency) |
| 12 | + └── M2E 2.9.1 (von https://download.eclipse.org/technology/m2e/releases/2.9.1) |
| 13 | + └── Apache Maven 3.9.11 |
| 14 | + └── Guice 5.1.0 (transitiv) |
| 15 | +``` |
| 16 | + |
| 17 | +**Definiert in:** `org.eclipse.jdt.ls.target/org.eclipse.jdt.ls.tp.target:15` |
| 18 | + |
| 19 | +## Wichtige Erkenntnisse |
| 20 | + |
| 21 | +### 1. jdt.ls verwendet kein Guice direkt |
| 22 | + |
| 23 | +✅ **Keine direkten Guice/javax.inject Imports in jdt.ls Code gefunden** |
| 24 | +- Guice wird nur intern von M2E verwendet |
| 25 | +- jdt.ls nutzt nur M2E's öffentliche API |
| 26 | +- **Vorteil:** Ein Guice-Upgrade würde keinen jdt.ls Code betreffen |
| 27 | + |
| 28 | +### 2. Das Problem: sun.misc.Unsafe Warnungen |
| 29 | + |
| 30 | +``` |
| 31 | +WARNING: A terminally deprecated method in sun.misc.Unsafe has been called |
| 32 | +WARNING: sun.misc.Unsafe::staticFieldBase has been called by |
| 33 | + com.google.inject.internal.aop.HiddenClassDefiner |
| 34 | +WARNING: Please consider reporting this to the maintainers of |
| 35 | + com.google.inject.internal.aop.HiddenClassDefiner |
| 36 | +WARNING: sun.misc.Unsafe::staticFieldBase will be removed in a future release |
| 37 | +``` |
| 38 | + |
| 39 | +**Betrifft:** Java 21+ (besonders Java 25) |
| 40 | +**Quelle:** Maven Issue [#10312](https://github.com/apache/maven/issues/10312), [#11387](https://github.com/apache/maven/issues/11387) |
| 41 | + |
| 42 | +## Upgrade-Optionen Analyse |
| 43 | + |
| 44 | +### Option 1: Guice Configuration Flag (EMPFOHLEN) ✅ |
| 45 | + |
| 46 | +**Lösung:** `-Dguice_custom_class_loading=CHILD` |
| 47 | + |
| 48 | +**Implementierung:** |
| 49 | +Maven hat diesen Fix in PR #10992 implementiert. Die Lösung ist bereits in Maven 3.9.12 (geplant) enthalten. |
| 50 | + |
| 51 | +**Vorteile:** |
| 52 | +- ✅ Keine Code-Änderungen nötig |
| 53 | +- ✅ Keine Dependency-Upgrades |
| 54 | +- ✅ Kompatibel mit bestehendem Setup |
| 55 | +- ✅ Bereits von Maven getestet und als offizieller Fix akzeptiert |
| 56 | + |
| 57 | +**Nachteile:** |
| 58 | +- ⚠️ System-Property muss gesetzt werden |
| 59 | +- ⚠️ Guice bleibt auf Version 5.1.0 |
| 60 | + |
| 61 | +**Umsetzung für jdt.ls:** |
| 62 | +- JVM-Argument in Launch-Konfigurationen hinzufügen |
| 63 | +- In `launch/*.ini` Dateien einfügen |
| 64 | +- In Test-Konfigurationen (`org.eclipse.jdt.ls.tests/pom.xml`) einfügen |
| 65 | + |
| 66 | +--- |
| 67 | + |
| 68 | +### Option 2: M2E Upgrade auf neuere Version |
| 69 | + |
| 70 | +**Status:** M2E 2.9.1 ist aktuell die neueste stabile Version (September 2025) |
| 71 | + |
| 72 | +**Maven-Versionen:** |
| 73 | +- M2E 2.9.1 → Maven 3.9.11 → Guice 5.1.0 |
| 74 | +- M2E 2.9.2 (in Entwicklung) → Maven ? → Guice ? |
| 75 | + |
| 76 | +**Vorteile:** |
| 77 | +- ✅ Erhält auch andere M2E-Bugfixes und Verbesserungen |
| 78 | + |
| 79 | +**Nachteile:** |
| 80 | +- ❌ Keine neuere M2E-Version verfügbar, die das Problem löst |
| 81 | +- ❌ Maven 3.9.12 noch nicht released |
| 82 | +- ⚠️ Wartepfad unsicher |
| 83 | + |
| 84 | +**Empfehlung:** Monitoring fortsetzen, wenn M2E auf Maven 3.9.12+ upgradet |
| 85 | + |
| 86 | +--- |
| 87 | + |
| 88 | +### Option 3: Guice 6.0 Upgrade |
| 89 | + |
| 90 | +**Guice 6.0 Features:** |
| 91 | +- ✅ Behält `javax.inject` Support |
| 92 | +- ✅ Fügt `jakarta.inject` Support hinzu |
| 93 | +- ✅ Java 21+ kompatibel (nutzt ASM 9.5) |
| 94 | +- ✅ Entfernt sun.misc.Unsafe Nutzung |
| 95 | + |
| 96 | +**Status in Maven:** |
| 97 | +❌ Maven hat KEIN Guice 6.0 Upgrade geplant |
| 98 | +- Maven Issue [MNG-8027](https://issues.apache.org/jira/browse/MNG-8027) dokumentiert, dass Maven nicht auf jakarta migriert |
| 99 | +- Maven downgraded Guice sogar auf 5.1.0 in PR #2472 |
| 100 | +- Maven 4.0.0-rc-4 verwendet auch noch Guice 5.1.0 |
| 101 | + |
| 102 | +**Nachteile:** |
| 103 | +- ❌ Erfordert eigenes M2E maven.runtime Bundle zu bauen |
| 104 | +- ❌ Hoher Wartungsaufwand |
| 105 | +- ❌ Maven upstream nicht aligned |
| 106 | + |
| 107 | +**Empfehlung:** ⚠️ NICHT EMPFOHLEN wegen Wartungsaufwand |
| 108 | + |
| 109 | +--- |
| 110 | + |
| 111 | +### Option 4: Guice 7.0 Upgrade |
| 112 | + |
| 113 | +**Guice 7.0 Changes:** |
| 114 | +- ❌ Entfernt `javax.inject` Support |
| 115 | +- ✅ Nur `jakarta.inject` Support |
| 116 | +- ⚠️ Breaking Changes für alle Consumers |
| 117 | + |
| 118 | +**Status:** |
| 119 | +- ❌ Maven migriert nicht zu jakarta (MNG-8027) |
| 120 | +- ❌ Würde M2E und alle Plugins brechen |
| 121 | +- ❌ Massive Breaking Changes im gesamten Ecosystem |
| 122 | + |
| 123 | +**Empfehlung:** ❌ NICHT PRAKTIKABEL |
| 124 | + |
| 125 | +--- |
| 126 | + |
| 127 | +## Empfohlene Lösung |
| 128 | + |
| 129 | +### Kurzfristig (SOFORT): Guice Configuration Flag |
| 130 | + |
| 131 | +**1. System-Property in JVM-Argumenten setzen:** |
| 132 | + |
| 133 | +```bash |
| 134 | +-Dguice_custom_class_loading=CHILD |
| 135 | +``` |
| 136 | + |
| 137 | +**2. Wo einbauen:** |
| 138 | +- `launch/jdt-ls.sh` und `launch/jdt-ls.bat` |
| 139 | +- Test-Konfiguration in `org.eclipse.jdt.ls.tests/pom.xml` |
| 140 | +- CI/CD Pipelines (.github/workflows/) |
| 141 | + |
| 142 | +**3. Dokumentation in README.md hinzufügen** |
| 143 | + |
| 144 | +### Mittelfristig (3-6 Monate): M2E 2.10+ Upgrade |
| 145 | + |
| 146 | +- ⏱️ Warten auf M2E mit Maven 3.9.12+ Support |
| 147 | +- 📊 Monitoring: https://download.eclipse.org/technology/m2e/releases/ |
| 148 | +- ✅ Dann Target Platform auf neue M2E-Version updaten |
| 149 | + |
| 150 | +## Implementierung |
| 151 | + |
| 152 | +### Dateien zum Ändern: |
| 153 | + |
| 154 | +1. **launch/jdt-ls.sh** - Füge JVM-Argument hinzu |
| 155 | +2. **launch/jdt-ls.bat** - Füge JVM-Argument hinzu |
| 156 | +3. **org.eclipse.jdt.ls.tests/pom.xml** - Füge zu `tycho.testArgLine` hinzu |
| 157 | +4. **README.md** - Dokumentiere Java 21+ Kompatibilität |
| 158 | +5. **.github/workflows/** - Prüfe CI/CD Konfigurationen |
| 159 | + |
| 160 | +### Testing: |
| 161 | + |
| 162 | +```bash |
| 163 | +# Mit Java 21 |
| 164 | +export JAVA_HOME=/path/to/java-21 |
| 165 | +mvn clean verify -Dguice_custom_class_loading=CHILD |
| 166 | + |
| 167 | +# Mit Java 25 |
| 168 | +export JAVA_HOME=/path/to/java-25 |
| 169 | +mvn clean verify -Dguice_custom_class_loading=CHILD |
| 170 | +``` |
| 171 | + |
| 172 | +## Referenzen |
| 173 | + |
| 174 | +- Maven Issue #10312: https://github.com/apache/maven/issues/10312 |
| 175 | +- Maven Issue #11387: https://github.com/apache/maven/issues/11387 |
| 176 | +- Maven PR #10992: https://github.com/apache/maven/pull/10992 |
| 177 | +- Guice 6.0 Docs: https://github.com/google/guice/wiki/Guice600 |
| 178 | +- M2E Releases: https://download.eclipse.org/technology/m2e/releases/ |
| 179 | + |
| 180 | +## Zusammenfassung |
| 181 | + |
| 182 | +| Lösung | Aufwand | Effektivität | Empfehlung | |
| 183 | +|--------|---------|--------------|------------| |
| 184 | +| Guice Config Flag | Niedrig | Hoch | ✅ **EMPFOHLEN** | |
| 185 | +| M2E Upgrade | Niedrig | Mittel | ⏱️ Später | |
| 186 | +| Guice 6.0 | Hoch | Mittel | ⚠️ Nicht empfohlen | |
| 187 | +| Guice 7.0 | Sehr Hoch | N/A | ❌ Nicht praktikabel | |
| 188 | + |
| 189 | +**Fazit:** Die `-Dguice_custom_class_loading=CHILD` Konfiguration ist die beste Lösung: einfach, effektiv, und von Maven offiziell als Fix übernommen. |
0 commit comments