Daniel Bleisteiner

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning." – Rick Cook from “The Wizardry Compiled”

WELD-000119… Type [unknown] not found

Ich habe wohl kein Glück! Heute laufe ich unerwartet in diesen für mich neuen Fehler rein:

2019-12-20 10:49:39,691 ERROR [FmP6bSrAhKKqjqCEjJcyJ3DBXl39Dg5ioGPD5QT2] [daniel @ TEST] [TEST] [default task-88] [CustomExceptionHandler] Inconsistent stackmap frames at branch target 55
Exception Details:
  Location:
    eu/ecg/eurekaplus/converter/DateTimeConverter.checkDate(Ljava/util/Date;Ljava/lang/String;Ljavax/faces/context/FacesContext;Ljavax/faces/component/UIComponent;)Ljava/lang/Object; @55: aload_2
  Reason:
    Type uninitialized 41 (current frame, stack[12]) is not assignable to uninitialized 28 (stack map, stack[12])
  Current Frame:
    bci: @47
    flags: { }
    locals: { 'eu/ecg/eurekaplus/converter/DateTimeConverter', 'java/util/Date', 'java/lang/String', 'javax/faces/context/FacesContext', 'javax/faces/component/UIComponent', 'java/lang/String' }
    stack: { uninitialized 17, uninitialized 17, uninitialized 21, uninitialized 21, 'javax/faces/application/FacesMessage$Severity', uninitialized 28, uninitialized 28, 'eu/ecg/eurekaplus/converter/DateTimeConverter', 'java/lang/String', '[Ljava/lang/Object;', '[Ljava/lang/Object;', integer, uninitialized 41, uninitialized 41, 'java/lang/String' }
  Stackmap Frame:
    bci: @55
    flags: { }
    locals: { 'eu/ecg/eurekaplus/converter/DateTimeConverter', 'java/util/Date', 'java/lang/String', 'javax/faces/context/FacesContext', 'javax/faces/component/UIComponent', 'java/lang/String' }
    stack: { uninitialized 17, uninitialized 17, uninitialized 21, uninitialized 21, 'javax/faces/application/FacesMessage$Severity', uninitialized 28, uninitialized 28, 'eu/ecg/eurekaplus/converter/DateTimeConverter', 'java/lang/String', '[Ljava/lang/Object;', '[Ljava/lang/Object;', integer, uninitialized 28, uninitialized 28 }
  Bytecode:
    0x0000000: 2ab6 005b 3a05 2bc7 008d 2ab6 005f 9900
    0x0000010: 54bb 0063 59bb 0065 59b2 0067 bb00 6b59
    0x0000020: 2a12 6d04 bd00 6f59 03bb 006b 5919 05c6
    0x0000030: 0008 1905 a700 042c b800 71b7 0075 1276
    0x0000040: b600 78b6 007c 53b6 007f b800 71b7 0075
    0x0000050: 2ab6 0083 b600 78b6 007c 01b7 0086 b700
    0x0000060: 89bf bb00 6359 2a12 6d04 bd00 6f59 03bb
    0x0000070: 006b 5919 05c6 0008 1905 a700 042c b800
    0x0000080: 71b7 0075 1276 b600 78b6 007c 53b6 007f
    0x0000090: b700 8cbf 2ab4 0029 c600 6a2b 2ab4 0029
    0x00000a0: b600 8d9c 005f 2a12 9105 bd00 6f59 0319
    0x00000b0: 05c6 0008 1905 a700 042c 5359 042a b400
    0x00000c0: 27c7 0011 2a2d 1904 2ab4 0029 b600 93a7
    0x00000d0: 0007 2ab4 0027 53b6 007f 3a06 2ab6 005f
    0x00000e0: 9900 18bb 0063 59bb 0065 59b2 0067 1906
    0x00000f0: 01b7 0086 b700 89bf bb00 6359 1906 b700
    0x0000100: 8cbf 2ab4 0036 c600 7c2b 2ab4 0036 b600
    0x0000110: 8d9e 0071 2ab6 005f 9900 3cbb 0063 59bb
    0x0000120: 0065 59b2 0067 2a12 9705 bd00 6f59 0319
    0x0000130: 05c6 0008 1905 a700 042c 5359 042a b400
    0x0000140: 362a b400 1eb8 0099 53b6 007f 01b7 0086
    0x0000150: b700 89bf bb00 6359 2a12 9705 bd00 6f59
    0x0000160: 0319 05c6 0008 1905 a700 042c 5359 042a
    0x0000170: b400 362a b400 1eb8 0099 53b6 007f b700
    0x0000180: 8cbf 2bb0                              
  Stackmap Table:
    full_frame(@55,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Uninitialized[#17],Uninitialized[#17],Uninitialized[#21],Uninitialized[#21],Object[#161],Uninitialized[#28],Uninitialized[#28],Object[#1],Object[#61],Object[#163],Object[#163],Integer,Uninitialized[#28],Uninitialized[#28]})
    full_frame(@56,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Uninitialized[#17],Uninitialized[#17],Uninitialized[#21],Uninitialized[#21],Object[#161],Uninitialized[#28],Uninitialized[#28],Object[#1],Object[#61],Object[#163],Object[#163],Integer,Uninitialized[#28],Uninitialized[#28],Object[#61]})
    same_frame(@98)
    full_frame(@125,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Uninitialized[#98],Uninitialized[#98],Object[#1],Object[#61],Object[#163],Object[#163],Integer,Uninitialized[#111],Uninitialized[#111]})
    full_frame(@126,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Uninitialized[#98],Uninitialized[#98],Object[#1],Object[#61],Object[#163],Object[#163],Integer,Uninitialized[#111],Uninitialized[#111],Object[#61]})
    same_frame(@148)
    full_frame(@185,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Object[#1],Object[#61],Object[#163],Object[#163],Integer})
    full_frame(@186,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Object[#1],Object[#61],Object[#163],Object[#163],Integer,Object[#61]})
    full_frame(@210,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Object[#1],Object[#61],Object[#163],Object[#163],Integer})
    full_frame(@214,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Object[#1],Object[#61],Object[#163],Object[#163],Integer,Object[#61]})
    append_frame(@248,Object[#61])
    chop_frame(@258,1)
    full_frame(@313,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Uninitialized[#283],Uninitialized[#283],Uninitialized[#287],Uninitialized[#287],Object[#161],Object[#1],Object[#61],Object[#163],Object[#163],Integer})
    full_frame(@314,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Uninitialized[#283],Uninitialized[#283],Uninitialized[#287],Uninitialized[#287],Object[#161],Object[#1],Object[#61],Object[#163],Object[#163],Integer,Object[#61]})
    same_frame(@340)
    full_frame(@363,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Uninitialized[#340],Uninitialized[#340],Object[#1],Object[#61],Object[#163],Object[#163],Integer})
    full_frame(@364,{Object[#1],Object[#89],Object[#61],Object[#85],Object[#87],Object[#61]},{Uninitialized[#340],Uninitialized[#340],Object[#1],Object[#61],Object[#163],Object[#163],Integer,Object[#61]})
    same_frame(@386)

Wie schon berichtet, musste ich kürzlich meinen iMac neu aufsetzen… und wie es so ist, kommen dabei in er Regel natürlich die jeweils neuesten Updates mit. Liegt es an der Java Runtime? Oder am neueren Eclipse? Ich tippe ja auf letzteres… denn das habe ich heute noch mal frisch aktualisiert – auf 2019-12. Das hätte ich vielleicht lassen sollen. Eclipse bringt u.a. einen eigenen Java Compiler mit – und ich kann mir gut vorstellen, dass genau dort das Problem liegt.

Beim Start der JBoss EAP – in meinem Fall noch v7.1.6 – kommt seit heute unter anderem auch diese seltsame INFO beim hochfahren:

2019-12-20 10:47:41,954 INFO  [] [ @ ] [] [Weld Thread Pool -- 5] [Bootstrap] WELD-000119: Not generating any bean definitions from eu.ecg.eurekaplus.converter.DateTimeConverter because of underlying class loading error: Type [unknown] not found.  If this is unexpected, enable DEBUG logging to see the full error.

Offensichtlich fehlen der von Eclipse generierten Class-Datei hier essentielle Bestandteile.

Ich werde mir also mal mit einem manuellen Build helfen.

McCoy:Eureka2020 daniel$ mvn package
...
McCoy:Eureka2020 daniel$ cp Eureka2020-ear/target/Eureka2020.ear /Users/daniel/ECG/JBoss-EAP-7.1.6/standalone/deployments 
McCoy:Eureka2020 daniel$ /Users/daniel/ECG/JBoss-EAP-7.1.6/bin/standalone.sh 
...

Und siehe da… der WELD-000119 bleibt aus! Das manuell erstellte EAR ist sauber… die Klassen fehlerfrei kompiliert.

Damit steht der Eclipse-eigene Java Compiler als Ursache fest.

Vorsicht beim Update… es könnte auch Dich treffen.

Ein paar neue Details…

Inzwischen (13.01.2020) weiß ich etwas genauer, worüber der Compiler zu stolpern scheint. Folgendes Stück Code ist für den Fehler verantwortlich:

this.findSaveMessage("converter.date.invalid",  (label != null ? label : value)  + ": ")  + this.getDetailsToError()

Sobald ich den String etwas anders zusammensetze, verschwindet der Fehler:

this.findSaveMessage("converter.date.invalid",  (label != null ? label : value)) + ": "   + this.getDetailsToError()

Eigentlich sollte das aber nicht notwendig sein. Die aufgerufene Methode verwendet einen Object... Parameter – möglicherweise ist das ein Teil des Problems:

protected String findSaveMessage(String key, Object... params) {
    String msg = this.getCustomMessage(); // Diese kennt keine Parameter!
    if (msg != null && !msg.trim().isEmpty()) return msg;
    return BetterMessages.instance().format(key, params);
}

Ich werde noch versuchen, daraus einen kleinen reproduzierbaren Test zu basteln. Dann kann ich das ggf. auch bei Eclipse offiziell als Bug einreichen.

Bug Report

Ich habe den Bug nun auch offiziell eingereicht: https://bugs.eclipse.org/bugs/show_bug.cgi?id=559094