Skip to content

Commit 1c49c3a

Browse files
committed
Add comprehensive Guice upgrade analysis for Java 21+ compatibility
Analysis of Guice 5.1.0 sun.misc.Unsafe warnings on Java 21+ and evaluation of upgrade options: - Guice config flag (RECOMMENDED) - M2E/Maven upgrades - Guice 6.0/7.0 migration assessment Recommendation: Use -Dguice_custom_class_loading=CHILD flag as official Maven fix (PR #10992)
1 parent c57d72c commit 1c49c3a

1 file changed

Lines changed: 189 additions & 0 deletions

File tree

GUICE_UPGRADE_ANALYSIS.md

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
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

Comments
 (0)