Runtime Enhancement without <class> entries in persistence.xml fails while attempting to process non-Entity classes -------------------------------------------------------------------------------------------------------------------
Key: OPENJPA-97 URL: https://issues.apache.org/jira/browse/OPENJPA-97 Project: OpenJPA Issue Type: Bug Components: jpa Reporter: Kevin Sutter Priority: Minor When using dynamic Runtime Enhancement (-javaagent) and not having the explicit set of classes defined in persistence.xml, the processing gets sick once in a while. It starts off fine with the appropriate warning... 160 my persistence unit INFO [main] openjpa.Enhance - You have enabled runtime enhancement, but have not specified the set of persistent classes. OpenJPA must look for metadata for every loaded class, which might increase class load times significantly. It then starts parsing (and processing) every package and class that gets loaded... 210 my persistence unit INFO [main] openjpa.MetaData - Parsing class "org.eclipse.jdt.internal.junit.runner.RemoteTestRunner". 210 my persistence unit INFO [main] openjpa.MetaData - Parsing package "org.eclipse.jdt.internal.junit.runner.RemoteTestRunner". 230 my persistence unit INFO [main] openjpa.MetaData - Parsing class "org.eclipse.jdt.internal.junit.runner.MessageSender". 230 my persistence unit INFO [main] openjpa.MetaData - Parsing class "org.eclipse.jdt.internal.junit.runner.IVisitsTestTrees". 230 my persistence unit INFO [main] openjpa.MetaData - Parsing class "org.eclipse.jdt.internal.junit.runner.IListensToTestExecutions". : : But, it also hits "warnings" similar to the following: 530 my persistence unit WARN [main] openjpa.Enhance - An exception was thrown while attempting to perform class file transformation on "$Proxy3": <0|false|0.0.0> org.apache.openjpa.util.GeneralException: $Proxy3 at org.apache.openjpa.enhance.PCClassFileTransformer.needsEnhance(PCClassFileTransformer.java:179) at org.apache.openjpa.enhance.PCClassFileTransformer.transform(PCClassFileTransformer.java:117) at sun.instrument.TransformerManager.transform(TransformerManager.java:141) at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:174) at java.lang.reflect.Proxy.defineClass0(Native Method) at java.lang.reflect.Proxy.getProxyClass(Proxy.java:515) at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:592) at com.ibm.oti.reflect.AnnotationHelper.getAnnotation(AnnotationHelper.java:34) at com.ibm.oti.reflect.AnnotationHelper.getDeclaredAnnotations(AnnotationHelper.java:50) at com.ibm.oti.reflect.Method.getDeclaredAnnotations(Method.java:31) at java.lang.reflect.Method.getDeclaredAnnotations(Method.java:704) at java.lang.reflect.AccessibleObject.getAnnotations(AccessibleObject.java:191) at com.ibm.oti.reflect.Method.getAnnotation(Method.java:20) at java.lang.reflect.Method.getAnnotation(Method.java:693) at org.junit.internal.runners.TestIntrospector.getTestMethods(TestIntrospector.java:28) at org.junit.internal.runners.TestClassMethodsRunner.<init>(TestClassMethodsRunner.java:27) at org.junit.internal.runners.TestClassRunner.<init>(TestClassRunner.java:20) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:67) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:521) at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:26) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:24) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:34) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:24) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:445) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) Caused by: java.lang.ClassNotFoundException: $Proxy3 at java.lang.Class.forName(Class.java:160) at org.apache.openjpa.enhance.PCClassFileTransformer.needsEnhance(PCClassFileTransformer.java:171) ... 29 more There are similar ClassNotFoundExceptions for the following classes that were loaded (in my test scenario): sun.reflect.GeneratedMethodAccessor1 sun.reflect.GeneratedConstructorAccessor1 sun.reflect.GeneratedConstructorAccessor2 sun.reflect.GeneratedConstructorAccessor3 sun.reflect.GeneratedConstructorAccessor4 $Proxy7 $Proxy8 $Proxy9 Since these are obviously not Entities, maybe we should just eat these exceptions. That is, assume that any errors that happen during the parsing phase just indicate that they are not Entities and continue on. Currently, the "warning" message and call stack look a bit more drastic than what they really are. BTW, the rest of the runtime enhancement worked just fine. It parsed several hundred class files as they were being loaded. It found the one class file that I was interested in and successfully enhanced it. So, the processing worked okay. It's just kind of messy. Kevin -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: https://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira