我尝试使用带有java 8的aspectj 1.8.9加载struts 2应用程序,但由于Stackmap验证错误导致编织失败 - 从AspectJ 1.8.7升级到1.8.8 / 1.8.9时, - noverify 标志停止工作,我在下面得到了例外情况:
SEVERE:com / opensymphony / xwork2 / config / impl / AbstractMatcher org.aspectj.weaver.BCException:无法找到用于生成堆栈图的Asm(寻找' aj.org.objectweb.asm.ClassReader')。需要使用编织代码生成Stackmap,以避免在Java 1.7或更高版本运行时上验证错误 当编织类型com.opensymphony.xwork2.config.impl.AbstractMatcher时 编织课时 编织的时候 在org.aspectj.weaver.bcel.LazyClassGen.getJavaClassBytesIncludingReweavable(LazyClassGen.java:703)
如何解决这个问题?我尝试使用-verfiy,但它不再起作用了。
更新:
NullPointerException
中的 org.aspectj.weaver.bcel.asm.StackMapAdder.getCommonSuperClass()
会导致上述错误。
为避免NullPointerException
我对课程进行了以下更改:
protected String getCommonSuperClass(final String type1, final String type2) {
ResolvedType resolvedType1 = world.resolve(UnresolvedType.forName(type1.replace('/', '.')));
ResolvedType resolvedType2 = world.resolve(UnresolvedType.forName(type2.replace('/', '.')));
if (resolvedType1.isAssignableFrom(resolvedType2)) {
return type1;
}
if (resolvedType2.isAssignableFrom(resolvedType1)) {
return type2;
}
if (resolvedType1.isInterface() || resolvedType2.isInterface()) {
return "java/lang/Object";
} else {
do {
resolvedType1 = resolvedType1.getSuperclass();
// ************* My start fix *****************
if (resolvedType1 == null){
return "java/lang/Object";
}
// ************* My end fix *******************
if (resolvedType1.isParameterizedOrGenericType()) {
resolvedType1 = resolvedType1.getRawType();
}
} while (!resolvedType1.isAssignableFrom(resolvedType2));
return resolvedType1.getRawName().replace('.', '/');
}
}
它修复了错误但我无法判断是否存在任何其他副作用。
请参阅 - https://bugs.eclipse.org/bugs/show_bug.cgi?id=514062(这是完全相同的问题)