cmpich
November 9, 2020, 4:51pm
1
I am using this ant target to enhance my bytecode for Hibernate so I can use lazy attribute loading:
<target name="instrument" depends="compile">
<taskdef name="enhance" classname="org.hibernate.tool.enhance.EnhancementTask">
<classpath refid="extended.classpath"/>
<classpath path="${classbin.dir}"/>
</taskdef>
<enhance base="${classbin.dir}" dir="${classbin.dir}/org/zfin/publication" failOnError="false" enableLazyInitialization="true"
enableDirtyTracking="false"
enableAssociationManagement="false"
enableExtendedEnhancement="false">
</enhance>
</target>
but it outputed
[enhance] Unable to enhance class: Publication.class
indicating that it is not working. It enhanced other classes in that directory but not this one. Is there any more info why it could not enhance that class? What could be the reason?
beikov
November 10, 2020, 3:16pm
2
It should log out the stack trace that would help you understand why it fails. Maybe you have to enable printing the stack trace somehow?
cmpich
November 10, 2020, 3:53pm
3
Good idea. I debugged into it a bit more and stumbled over this line in the byte-buddy (1.8.17)) library’s class ClassVisitor
public void visitNestHostExperimental(final String nestHost) {
if (api < Opcodes.ASM7_EXPERIMENTAL) {
throw new UnsupportedOperationException();
}
if (cv != null) {
cv.visitNestHostExperimental(nestHost);
}
}
for some reason the variable ‘api’ is set to a value that it is turned into an UnsupportedOperationException.
cmpich
November 10, 2020, 4:11pm
4
So, that method
visitNestHostExperimental()
is called in the ClassReader (of byte-buddy) class when evaluating this variable
String attributeName = readUTF8(currentAttributeOffset, charBuffer)
to the string NestHost
.
cmpich
November 10, 2020, 7:27pm
5
I figured it out: There is a bug in byte-buddy 1.8.17. Once I upgraded to 1.10.18 the byte code enhancement worked for all my classes!
I wonder if the 5.3.7 release of hibernate should be changed to use the upgraded byte-buddy library.
beikov
November 10, 2020, 8:58pm
6
Well, the latest 5.3 release is 5.3.18 so were clearly using an old version and should update Hiberante in general. The latest version uses bytebuddy 1.9.11