Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
481 views
in Technique[技术] by (71.8m points)

jakarta ee - JavaEE + Glassfish - BufferUnderflowException

I have a very simple Java EE application with some beans that use JMS to communicate. When I try to deploy and debug my application, I get this

Informazioni:   visiting unvisited references
Grave:   Unknow type constant pool 18 at position38
Grave:   Unknow type constant pool 0 at position39
Grave:   Unknow type constant pool 0 at position40
Grave:   Unknow type constant pool 105 at position43
Grave:   Unknow type constant pool 116 at position44
Grave:   Unknow type constant pool 101 at position45
Grave:   Unknow type constant pool 32 at position46
Grave:   Unknow type constant pool 108 at position47
Grave:   Unknow type constant pool -30 at position48
Grave:   Unknow type constant pool -128 at position49
Grave:   Unknow type constant pool -103 at position50
Grave:   Unknow type constant pool 105 at position51
Grave:   Unknow type constant pool 110 at position52
Grave:   Unknow type constant pool 110 at position53
Grave:   Unknow type constant pool 111 at position54
Grave:   Unknow type constant pool 118 at position55
Grave:   Unknow type constant pool 97 at position56
Grave:   Unknow type constant pool 116 at position57
Grave:   Unknow type constant pool 105 at position58
Grave:   Unknow type constant pool 118 at position59
Grave:   Unknow type constant pool 97 at position60
Grave:   Unknow type constant pool 32 at position61
Grave:   Unknow type constant pool 116 at position62
Grave:   Unknow type constant pool 101 at position63
Grave:   Unknow type constant pool 99 at position64
Grave:   Unknow type constant pool 110 at position65
Grave:   Unknow type constant pool 111 at position66
Grave:   Unknow type constant pool 108 at position67
Grave:   Unknow type constant pool 111 at position68
Grave:   Unknow type constant pool 103 at position69
Grave:   Unknow type constant pool 105 at position70
Grave:   Unknow type constant pool 97 at position71
Grave:   Unknow type constant pool 32 at position72
Grave:   Unknow type constant pool 68 at position73
Grave:   Unknow type constant pool 111 at position74
Grave:   Unknow type constant pool 119 at position75
Grave:   Unknow type constant pool 110 at position76
Grave:   Unknow type constant pool 108 at position77
Grave:   Unknow type constant pool 111 at position78
Grave:   Unknow type constant pool 97 at position79
Grave:   Unknow type constant pool 100 at position80
Grave:   Unknow type constant pool 32 at position81
Grave:   Unknow type constant pool 66 at position82
Grave:   Unknow type constant pool 111 at position83
Grave:   Unknow type constant pool 111 at position84
Grave:   Unknow type constant pool 115 at position85
Grave:   Unknow type constant pool 116 at position86
Grave:   Unknow type constant pool 101 at position87
Grave:   Unknow type constant pool 114 at position88
Grave:   Unknow type constant pool 44 at position89
Grave:   Unknow type constant pool 32 at position90
Grave:   Unknow type constant pool 112 at position91
Grave:   Unknow type constant pool 111 at position92
Grave:   Unknow type constant pool 116 at position93
Grave:   Unknow type constant pool 114 at position94
Grave:   Unknow type constant pool 97 at position95
Grave:   Unknow type constant pool 105 at position96
Grave:   Unknow type constant pool 32 at position97
Grave:   Unknow type constant pool 97 at position98
Grave:   Unknow type constant pool 117 at position99
Grave:   Unknow type constant pool 109 at position100
Grave:   Unknow type constant pool 101 at position101
Grave:   Unknow type constant pool 110 at position102
Grave:   Unknow type constant pool 116 at position103
Grave:   Unknow type constant pool 97 at position104
Grave:   Unknow type constant pool 114 at position105
Grave:   Unknow type constant pool 101 at position106
Grave:   Unknow type constant pool 32 at position107
Grave:   Unknow type constant pool 115 at position108
Grave:   Unknow type constant pool 105 at position109
Grave:   Unknow type constant pool 103 at position110
Grave:   Unknow type constant pool 110 at position111
Grave:   Unknow type constant pool 105 at position112
Grave:   Unknow type constant pool 102 at position113
Grave:   Unknow type constant pool 105 at position114
Grave:   Unknow type constant pool 99 at position115
Grave:   Unknow type constant pool 97 at position116
Grave:   Unknow type constant pool 116 at position117
Grave:   Unknow type constant pool 105 at position118
Grave:   Unknow type constant pool 118 at position119
Grave:   Unknow type constant pool 97 at position120
Grave:   Unknow type constant pool 109 at position121
Grave:   Unknow type constant pool 101 at position122
Grave:   Unknow type constant pool 110 at position123
Grave:   Unknow type constant pool 116 at position124
Grave:   Unknow type constant pool 101 at position125
Grave:   Unknow type constant pool 32 at position126
Grave:   Unknow type constant pool 108 at position127
Grave:   Unknow type constant pool 97 at position128
Grave:   Unknow type constant pool 32 at position129
Grave:   Unknow type constant pool 118 at position130
Grave:   Unknow type constant pool 101 at position131
Grave:   Unknow type constant pool 108 at position132
Grave:   Unknow type constant pool 111 at position133
Grave:   Unknow type constant pool 99 at position134
Grave:   Unknow type constant pool 105 at position135
Grave:   Unknow type constant pool 116 at position136
Grave:   Unknow type constant pool -61 at position137
Grave:   Unknow type constant pool -96 at position138
Grave:   Unknow type constant pool 32 at position139
Grave:   Unknow type constant pool 100 at position140
Grave:   Unknow type constant pool 105 at position141
Grave:   Unknow type constant pool 32 at position142
Grave:   Unknow type constant pool 100 at position143
Grave:   Unknow type constant pool 111 at position144
Grave:   Unknow type constant pool 119 at position145
Grave:   Unknow type constant pool 110 at position146
Grave:   Unknow type constant pool 108 at position147
Grave:   Unknow type constant pool 111 at position148
Grave:   Unknow type constant pool 97 at position149
Grave:   Unknow type constant pool 100 at position150
Grave:   Unknow type constant pool 32 at position151
Grave:   Unknow type constant pool 100 at position152
Grave:   Unknow type constant pool 101 at position153
Grave:   Unknow type constant pool 105 at position154
Grave:   Unknow type constant pool 32 at position155
Grave:   Unknow type constant pool 100 at position156
Grave:   Unknow type constant pool 97 at position157
Grave:   Unknow type constant pool 116 at position158
Grave:   Unknow type constant pool 105 at position159
Grave:   Unknow type constant pool 32 at position160
Grave:   Unknow type constant pool 99 at position161
Grave:   Unknow type constant pool 111 at position162
Grave:   Unknow type constant pool 109 at position163
Grave:   Unknow type constant pool 98 at position164
Grave:   Unknow type constant pool 105 at position165
Grave:   Unknow type constant pool 110 at position166
Grave:   Unknow type constant pool 97 at position167
Grave:   Unknow type constant pool 110 at position168
Grave:   Unknow type constant pool 100 at position169
Grave:   Unknow type constant pool 111 at position170
Grave:   Unknow type constant pool 32 at position171
Grave:   Unknow type constant pool 87 at position172
Grave:   Unknow type constant pool 105 at position173
Grave:   Unknow type constant pool 45 at position174
Grave:   Unknow type constant pool 70 at position175
Grave:   Unknow type constant pool 105 at position176
Grave:   Unknow type constant pool 32 at position177
Grave:   Unknow type constant pool 101 at position178
Grave:   Unknow type constant pool 32 at position179
Grave:   Unknow type constant pool 52 at position180
Grave:   Unknow type constant pool 71 at position181
Grave:   Unknow type constant pool 32 at position182
Grave:   Unknow type constant pool 76 at position183
Grave:   Unknow type constant pool 84 at position184
Grave:   Unknow type constant pool 69 at position185
Grave:   Unknow type constant pool 46 at position186
Grave:   Unknow type constant pool 103 at position188
Grave:   Unknow type constant pool 110 at position189
Grave:   Unknow type constant pool 105 at position190
Grave:   Unknow type constant pool 32 at position191
Grave:   Unknow type constant pool 115 at position192
Grave:   Unknow type constant pool 105 at position193
Grave:   Unknow type constant pool 116 at position194
Grave:   Unknow type constant pool 117 at position195
Grave:   Unknow type constant pool 97 at position196
Grave:   Unknow type constant pool 122 at position197
Grave:   Unknow type constant pool 105 at position198
Grave:   Unknow type constant pool 111 at position199
Grave:   Unknow type constant pool 110 at position200
Grave:   Unknow type constant pool 101 at position201
Grave:   Unknow type constant pool 32 at position202
Grave:   Unknow type constant pool 105 at position203
Grave:   Unknow type constant pool 108 at position204
Grave:   Unknow type constant pool 32 at position205
Grave:   Unknow type constant pool 116 at position206
Grave:   Unknow type constant pool 117 at position207
Grave:   Unknow type constant pool 111 at position208
Grave:   Unknow type constant pool 32 at position209
Grave:   Unknow type constant pool 71 at position210
Grave:   Unknow type constant pool 97 at position211
Grave:   Unknow type constant pool 108 at position212
Grave:   Unknow type constant pool 97 at position213
Grave:   Unknow type constant pool 120 at position214
Grave:   Unknow type constant pool 121 at position215
Grave:   Unknow type constant pool 32 at position216
Grave:   Unknow type constant pool 83 at position217
Grave:   Unknow type constant pool 53 at position218
Grave:   Unknow type constant pool 32 at position219
Grave:   Unknow type constant pool 115 at position220
Grave:   Unknow type constant pool 97 at position221
Grave:   Unknow type constant pool 114 at position222
Grave:   Unknow type constant pool -61 at position223
Grave:   Unknow type constant pool -96 at position224
Grave:   Unknow type constant pool 32 at position225
Grave:   Unknow type constant pool 112 at position226
Grave:   Unknow type constant pool 114 at position227
Grave:   Unknow type constant pool 111 at position228
Grave:   Unknow type constant pool 116 at position229
Grave:   Unknow type constant pool 101 at position230
Grave:   Unknow type constant pool 116 at position231
Grave:   Unknow type constant pool 116 at position232
Grave:   Unknow type constant pool 111 at position233
Grave:   Unknow type constant pool 32 at position234
Grave:   Unknow type constant pool 100 at position235
Grave:   Unknow type constant pool 97 at position236
Grave:   Unknow type constant pool 32 at position237
Grave:   Unknow type constant pool 97 at position238
Grave:   Unknow type constant pool 99 at position239
Grave:   Unknow type constant pool 113 at position240
Grave:   Unknow type constant pool 117 at position241
Grave:   Unknow type constant pool 97 at position242
Grave:   Unknow type constant pool 44 at position243
Grave:   Unknow type constant pool 32 at position244
Grave:   Unknow type constant pool 112 at position245
Grave:   Unknow type constant pool 105 at position246
Grave:   Unknow type constant pool 111 at position247
Grave:   Unknow type constant pool 103 at position248
Grave:   Unknow type constant pool 103 at position249
Grave:   Unknow type constant pool 105 at position250
Grave:   Unknow type constant pool 97 at position251
Grave:   Unknow type constant pool 44 at position252
Grave:   Unknow type constant pool 32 at position253
Grave:   Unknow type constant pool 112 at position254
Grave:   Unknow type constant pool 111 at position255
Grave:   Unknow type constant pool 108 at position256
Grave:   Unknow type con

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I encountered the same problem.

I tracked the problem to the jar glassfish/modules/dol.jar (sources). The class com.sun.enterprise.deployment.annotation.introspection.ConstantPoolInfo within this jar is responsible for testing classes on relevant annotations while deployment.

Problem:

The class does this by byte-wise reading and interpreting a special part of the .class files: the constant pool (JVM spec). The pool contains "values such as numbers of all sorts, strings, identifier names, references to classes and methods, and type descriptors" (Wiki). This includes the class names of annotations.
The problem is, that the possible content of the constant pool increased with Java 7 and some additional entry types were added to support script languages with the JVM. Those entries (Method handle, Method type and InvokeDynamic (ids 15, 16 and 18)) are not supported by ConstantPoolInfo yet. When reading and checking the type identifier byte of one of those constant pool entries, the class simply logs the warning "Unknow [sic] type constant pool x at position i" and proceeds processing with the next byte, missing to skip bytes belonging to the current type's data structure (they are not relevant anyway). This leads to a complete mess up, as the next byte which should have been skipped is interpreted as type identifier.
In some situations, the wrongly interpreted byte leads to the execution of the code for the "UTF 8/ASCII"-entry case, with interprets the next two bytes as the length of a String in the constant pool and then wants to read that String. And this is where the BufferUnderflowException comes from: The input source containing the constant pool's data may not hold as may bytes as requested.

Where and when:

There was no problem with this when using Java 7 code, as the usual developer/compiler did not produce byte code which needed the additional constant pool entry types.
With Java 8 this changed: Lambdas and methdod references make use of it.

For some reason I did not examine, the problem does not happen with lambdas in war-modules but only with ejb-modules. Probably, the introspection of the class files is not done there - at least not based on ConstantPoolInfo.

Solution:

I opened a bug report: https://java.net/jira/browse/GLASSFISH-21510.

I don't have a solution other than to refrain from using lambdas/method references (or anything that compiles to invokedynamic bytecode) in ejb modules.

Refactoring the code until it only produces warnings and no exception may help but I don't consider it a clean solution. It may break again with any code change or jdk update. Apart from that, the inspection of the class is still broken and may cause other problems.

[TL;DR]
Remove lambdas/method references from ejb-projects.
[/TL;DR]


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...