I wanted to upgrade the LDAP API version of my application to pick up https://issues.apache.org/jira/browse/DIRAPI-219. Unfortunately, I hit some problems, namely:
java.lang.IllegalAccessError: tried to access field org.apache.directory.api.ldap.codec.osgi.DefaultLdapCodecService.controlFactories from class org.apache.directory.api.ldap.codec.standalone.StandaloneLdapApiService I tracked this down to upgrading from M21 to M22 (i.e. my code works with M21, doesn't work with M22), where it looks like DefaultLdapCodecService is now a superclass of StandaloneLdapApiService. StackOverflow suggests this can be caused by different class loaders: http://stackoverflow.com/questions/3386662/illegalaccesserror-accessing-a-protected-method/3387520#3387520 Has anyone seen this? Is there a suggested workaround? FWIW I was able to get my application to work by adding: DefaultLdapCodecService dlcs = new DefaultLdapCodecService(); LdapApiServiceFactory.initialize(dlcs); before the problematic line: ds = new DefaultDirectoryService(); but I'm not sure what the implication of using DefaultLdapCodecService compared to StandaloneLdapApiService (which is what gets loaded if you don't manually initialize the LdapApiServiceFactory. The application is Hadoop MiniKdc, see here: https://github.com/apache/hadoop/blob/e3496499ecb8d220fba99dc5ed4c99c8f9e33bb1/hadoop-common-project/hadoop-minikdc/src/main/java/org/apache/hadoop/minikdc/MiniKdc.java#L324 Here's the entire stack trace (this is running in maven surefire): java.lang.IllegalAccessError: tried to access field org.apache.directory.api.ldap.codec.osgi.DefaultLdapCodecService.controlFactories from class org.apache.directory.api.ldap.codec.standalone.StandaloneLdapApiService at org.apache.directory.api.ldap.codec.standalone.StandaloneLdapApiService.<init>(StandaloneLdapApiService.java:148) at org.apache.directory.api.ldap.codec.standalone.StandaloneLdapApiService.<init>(StandaloneLdapApiService.java:142) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at java.lang.Class.newInstance0(Class.java:374) at java.lang.Class.newInstance(Class.java:327) at org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory.initialize(LdapApiServiceFactory.java:127) at org.apache.directory.api.ldap.codec.api.LdapApiServiceFactory.getSingleton(LdapApiServiceFactory.java:89) at org.apache.directory.server.core.DefaultDirectoryService.<init>(DefaultDirectoryService.java:150) at org.apache.hadoop.minikdc.MiniKdc.initDirectoryService(MiniKdc.java:335) at org.apache.hadoop.minikdc.MiniKdc.start(MiniKdc.java:327) at org.apache.hadoop.minikdc.KerberosSecurityTestcase.startMiniKdc(KerberosSecurityTestcase.java:49) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:254) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:149) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
