Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JDK11: BAD LDC: 17 (Dynamic Class-File Constants) #282

Closed
harshilps opened this issue Oct 16, 2019 · 31 comments
Closed

JDK11: BAD LDC: 17 (Dynamic Class-File Constants) #282

harshilps opened this issue Oct 16, 2019 · 31 comments

Comments

@harshilps
Copy link

#270 I thought that the PR/merge would make javassist fully compatible with Dynamic Class-File Constants(https://openjdk.java.net/jeps/309). When running junit tests using powermock on the Java 11 I get this error: "BAD LDC 17". Here Javassist and Mockito is used as a dependency of PowerMock.
I am using the following versions.

  1. Javassist 3.26.0-GA
  2. PowerMock 2.0.2
  3. JDK 11
  4. Mockito 2.28.0
@valfirst
Copy link

I've faced with this issue as well, here is an exception stack trace:

...
Caused by: java.lang.RuntimeException: bad LDC: 17
	at javassist.bytecode.stackmap.Tracer.doLDC(Tracer.java:267)
	at javassist.bytecode.stackmap.Tracer.doOpcode0_53(Tracer.java:167)
	at javassist.bytecode.stackmap.Tracer.doOpcode(Tracer.java:73)
	at javassist.bytecode.stackmap.MapMaker.make(MapMaker.java:195)
	at javassist.bytecode.stackmap.MapMaker.make(MapMaker.java:172)
	at javassist.bytecode.stackmap.MapMaker.make(MapMaker.java:116)
	at javassist.bytecode.MethodInfo.rebuildStackMap(MethodInfo.java:458)
	at javassist.bytecode.MethodInfo.rebuildStackMapIf6(MethodInfo.java:440)
	at javassist.expr.ExprEditor.doit(ExprEditor.java:118)
	at javassist.CtClassType.instrument(CtClassType.java:1541)
	at org.powermock.core.transformers.javassist.InstrumentMockTransformer.transform(InstrumentMockTransformer.java:41)
	at org.powermock.core.transformers.javassist.AbstractJavaAssistMockTransformer.transform(AbstractJavaAssistMockTransformer.java:40)
	at org.powermock.core.transformers.support.DefaultMockTransformerChain.transform(DefaultMockTransformerChain.java:43)
	at org.powermock.core.classloader.MockClassLoader.transformClass(MockClassLoader.java:184)
	at org.powermock.core.classloader.javassist.JavassistMockClassLoader.defineAndTransformClass(JavassistMockClassLoader.java:102)
	... 106 more

@harshilps
Copy link
Author

Did you get around solving it? or like do you have any fix for this issue?

@chibash
Copy link
Member

chibash commented Oct 17, 2019

I'll check this.

@harshilps
Copy link
Author

harshilps commented Nov 26, 2019

I'll check this.

Any update on a fix?

@chibash
Copy link
Member

chibash commented Nov 27, 2019

Not yet, but I'm working on this.

@tiagorico
Copy link

Any update on this?

@chibash
Copy link
Member

chibash commented Dec 23, 2019

Is there anyone who kindly writes a Java source file that is compiled into a class file including the bytecode ldc with CONSTANT_Dynamic?

chibash added a commit that referenced this issue Dec 23, 2019
@chibash
Copy link
Member

chibash commented Dec 23, 2019

Can anyone check javassist.jar available from master/HEAD?
I hope it will fix the bug.

@SurpSG
Copy link

SurpSG commented Dec 23, 2019

Hi @chibash
Seems, the issue is fixed with javassist.jar from master/HEAD

@chibash
Copy link
Member

chibash commented Dec 23, 2019

Great, thanks to @SurpSG

@harshilps
Copy link
Author

@chibash Are there any plans to release a new version with this feature any time soon?

@chibash
Copy link
Member

chibash commented Dec 24, 2019

Until the end of this year?

@harshilps
Copy link
Author

Not particularly before the end of this year just in general.

@valfirst
Copy link

@chibash do you have plans to release a new version in the near future?

@andreimozgo
Copy link

@chibash @valfirst Could you please release a new version?

@valfirst
Copy link

@andreimozgo I'm just a contributor, I can't release it, I'm waiting for release as you and anybody else 😄

@chibash
Copy link
Member

chibash commented Mar 17, 2020

Sorry for my silence. I'll release within a day.

@chibash
Copy link
Member

chibash commented Mar 18, 2020

I have done. The new release will be available soon from maven (but I must ask someone else to upload).

@lewe518
Copy link

lewe518 commented Mar 19, 2020

@chibash Could you please upload the new version to mvnrepository ?

@chibash
Copy link
Member

chibash commented Mar 19, 2020

I don't have an access permission.

@chibash
Copy link
Member

chibash commented Mar 19, 2020

Now it's on maven.

@bergerst
Copy link

So can this issue be closed?

@chibash chibash closed this as completed May 12, 2020
@arturkii
Copy link

arturkii commented Jun 10, 2020

Did anybody find working versions combination? i try to migrate to java 11 and have the same issue.
i use:
JDK 11
mockito-core : 2.28.1
powermock-module-junit4: 2.0.2
powermock-api-mockito2: 2.0.2
javassist: 3.26.0-GA

still have
java.lang.IllegalStateException: Failed to transform class with name <someclass>. Reason: bad LDC: 17 Caused by: java.lang.RuntimeException: bad LDC: 17

tried to play with versions in different cases have different exception.

@valfirst
Copy link

@Artke I recommend to use PowerMock 2.0.6 and higher

@arturkii
Copy link

tried with higher versions
PowerMock 2.0.6
Mockito 3.3.3
javassist 3.27.0-GA
still have
java.lang.IllegalStateException: Failed to transform class with name <name>. Reason: bad LDC: 17 Caused by: java.lang.RuntimeException: bad LDC: 17

@valfirst
Copy link

@Artke could you please make sure you don't have another version of javassist in classpath? also could you post the full exception stacktrace?

@arturkii
Copy link

arturkii commented Jun 10, 2020

@valfirst powermock-module-junit4:2.0.7 has javassist 3.27.0-GA within itself so i deleted my extra dependency. so now i have
PowerMock 2.0.6
Mockito 3.3.3
Java 11
... and new exception

	at jdk.internal.reflect.GeneratedSerializationConstructorAccessor6.newInstance(Unknown Source)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:48)
	at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:73)
	at org.mockito.internal.creation.instance.ObjenesisInstantiator.newInstance(ObjenesisInstantiator.java:19)
	at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMock(SubclassByteBuddyMockMaker.java:47)
	at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:25)
	at org.powermock.api.mockito.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:41)
	at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:35)
	at org.mockito.internal.MockitoCore.mock(MockitoCore.java:63)
	at org.mockito.Mockito.mock(Mockito.java:1908)
	at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMethodInvocationControl(DefaultMockCreator.java:108)
	at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.doCreateMock(DefaultMockCreator.java:61)
	at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMock(DefaultMockCreator.java:53)
	at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.mock(DefaultMockCreator.java:40)
	at org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:181)
	at org.powermock.api.extension.listener.AnnotationEnabler.standardInject(AnnotationEnabler.java:98)
	at org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod(AnnotationEnabler.java:55)
	at org.powermock.tests.utils.impl.PowerMockTestNotifierImpl.notifyBeforeTestMethod(PowerMockTestNotifierImpl.java:82)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:308)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298)
	at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
	at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
	at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
	at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117)
	at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
	at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: java.lang.IllegalStateException: Failed to transform class with name org.apache.hadoop.fs.FileSystem$Cache. Reason: org.apache.hadoop.fs.FileSystem$Cache$Key class is frozen
	at org.powermock.core.classloader.javassist.JavassistMockClassLoader.defineAndTransformClass(JavassistMockClassLoader.java:119)
	at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:174)
	at org.powermock.core.classloader.MockClassLoader.loadClassByThisClassLoader(MockClassLoader.java:102)
	at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass1(DeferSupportingClassLoader.java:147)
	at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:98)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:315)
	at javassist.runtime.Desc.getClassObject(Desc.java:72)
	at javassist.runtime.Desc.getClassType(Desc.java:181)
	at javassist.runtime.Desc.getType(Desc.java:151)
	at javassist.runtime.Desc.getType(Desc.java:107)
	at org.apache.hadoop.fs.FileSystem.<clinit>(FileSystem.java:103)
	... 42 more
Caused by: java.lang.RuntimeException: org.apache.hadoop.fs.FileSystem$Cache$Key class is frozen
	at javassist.CtClassType.checkModify(CtClassType.java:321)
	at javassist.CtBehavior.setModifiers(CtBehavior.java:178)
	at org.powermock.core.transformers.javassist.ConstructorsMockTransformer.transform(ConstructorsMockTransformer.java:64)
	at org.powermock.core.transformers.javassist.ConstructorsMockTransformer.transform(ConstructorsMockTransformer.java:51)
	at org.powermock.core.transformers.javassist.AbstractJavaAssistMockTransformer.transform(AbstractJavaAssistMockTransformer.java:40)
	at org.powermock.core.transformers.support.DefaultMockTransformerChain.transform(DefaultMockTransformerChain.java:43)
	at org.powermock.core.classloader.MockClassLoader.transformClass(MockClassLoader.java:184)
	at org.powermock.core.classloader.javassist.JavassistMockClassLoader.defineAndTransformClass(JavassistMockClassLoader.java:102)
	... 54 more

FileSystem.Cache.Key class its the field of tested FileSystem.class @PrepareForTest({FileSystem.class, CheckStatusStep.class})

any idea why its frozen?

@harshilps
Copy link
Author

@Artke It has worked for me by using the following combination/versions:

Javassist 3.27.0-GA
PowerMock 2.0.2
JDK 11
Mockito 2.28.0

@valfirst
Copy link

@Artke this should help: powermock/powermock#475 (comment)

@lighTQ
Copy link

lighTQ commented Jul 30, 2020

I add this for my testClass it solved the problem,you should try it again. may be can solve your problem.

@SuppressStaticInitializationFor("org.apache.hadoop.fs.FileSystem")
@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.management.*") // resolve classloader conflict

  • PowerMockit 2.02
  • JDK 1.8

@vikaskhengare
Copy link

Hi All,

We are trying to migrate the code from JDK 8 to 11. Old code was using old versions of javassist, powermock and mockito.

Now we are trying with following combination,
javassist - 3.27.0-GA
powermock - 2.0.2
mockito - 2.28.2
JDK - 11

While doing this, we got following error,
java.lang.IllegalStateException: Failed to transform class with name com.mycompany.constant.MyConstants. Reason: com.mycompany.constant.MyConstants$SomeEnum class is frozen

java.lang.IllegalStateException: Failed to transform class with name com.mycompany.constant.MyConstants. Reason: com.mycompany.constant.MyConstants$SomeEnum class is frozen
	at org.powermock.core.classloader.javassist.JavassistMockClassLoader.defineAndTransformClass(JavassistMockClassLoader.java:119)
	at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:174)
	at org.powermock.core.classloader.MockClassLoader.loadClassByThisClassLoader(MockClassLoader.java:102)
	at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass1(DeferSupportingClassLoader.java:147)
	at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:98)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	at com.cisco.config.base.logger.ConfigLiteLoggerFactory.isDownloadSessionLoggerEnabled(ConfigLiteLoggerFactory.java:195)
	at com.cisco.config.base.logger.ConfigLiteLogger.getLogger(ConfigLiteLogger.java:453)
	at com.cisco.config.base.logger.ConfigLiteLogger.error(ConfigLiteLogger.java:413)
	at com.cisco.config.meraki.resource.FinalResponseResource.getDoneResponse(FinalResponseResource.java:70)
	at com.cisco.config.meraki.resource.test.FinalResponseResourceTest.getDoneResponseTest(FinalResponseResourceTest.java:97)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
	at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
	at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:88)
...
...
Caused by: java.lang.RuntimeException: com.mycompany.constant.MyConstants$SomeEnum class is frozen
	at javassist.CtClassType.checkModify(CtClassType.java:321)
	at javassist.CtBehavior.setModifiers(CtBehavior.java:178)
	at org.powermock.core.transformers.javassist.ConstructorsMockTransformer.transform(ConstructorsMockTransformer.java:64)
	at org.powermock.core.transformers.javassist.ConstructorsMockTransformer.transform(ConstructorsMockTransformer.java:51)
	at org.powermock.core.transformers.javassist.AbstractJavaAssistMockTransformer.transform(AbstractJavaAssistMockTransformer.java:40)
	at org.powermock.core.transformers.support.DefaultMockTransformerChain.transform(DefaultMockTransformerChain.java:43)
	at org.powermock.core.classloader.MockClassLoader.transformClass(MockClassLoader.java:184)
	at org.powermock.core.classloader.javassist.JavassistMockClassLoader.defineAndTransformClass(JavassistMockClassLoader.java:102)

Does anyone know why do we get this error and how to resolve it?

What do class frozen means?

Thanks in advance!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests