# Search plugin with custom query getting IllegalAccessError

**URL:** <https://discuss.elastic.co/t/search-plugin-with-custom-query-getting-illegalaccesserror/273221>\
**Category:** Elasticsearch\
**Created:** [May 17, 2021, 8:55pm UTC](https://discuss.elastic.co/t/search-plugin-with-custom-query-getting-illegalaccesserror/273221 "2021-05-17T20:55:00Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![elelliot](https://avatars.discourse-cdn.com/v4/letter/e/e56c9b/32.png) [@elelliot](https://discuss.elastic.co/u/elelliot)\
**Post date:** [May 17, 2021, 8:55pm UTC](https://discuss.elastic.co/t/search-plugin-with-custom-query-getting-illegalaccesserror/273221/1 "2021-05-17T20:55:00Z")

</div>

I'm having an issue with installing a custom query in my elasticsearch plugin. For my use case, I have a custom query `PayloadPhraseQuery` that uses many of the other existing Lucene phrase query code.

However when I run do a search using that query I get this error. From what I find and read online, this has to do with the fact that my `PayloadPhraseQuery` is loaded from a different class loader from `PhraseWeight`, so that even if they are both in the same package, the former can't access the latter.

I don't fully understand the nuances of the JVM and Java so I might be missing something as well.

```auto
    java.lang.IllegalAccessError: class org.apache.lucene.search.PayloadPhraseQuery$1 cannot access its abstract superclass org.apache.lucene.search.PhraseWeight (org.apache.lucene.search.PayloadPhraseQuery$1 is in unnamed module of loader java.net.FactoryURLClassLoader @55bf35e5; org.apache.lucene.search.PhraseWeight is in unnamed module of loader 'app')
    	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
    	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
    	at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:514)
    	at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:422)
    	at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:416)
    	at java.base/java.security.AccessController.doPrivileged(AccessController.java:691)
    	at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:415)
    	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
    	at java.base/java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:855)
    	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    	at org.apache.lucene.search.PayloadPhraseQuery$Builder.build(PayloadPhraseQuery.java:104)
    	at org.elasticsearch.index.query.MatchPayloadPhraseQueryBuilder.buildPhraseQuery(MatchPayloadPhraseQueryBuilder.java:145)
    	at org.elasticsearch.index.query.MatchPayloadPhraseQueryBuilder.doToQuery(MatchPayloadPhraseQueryBuilder.java:124)
    	at org.elasticsearch.index.query.AbstractQueryBuilder.toQuery(AbstractQueryBuilder.java:103)
    	at org.elasticsearch.index.query.BoolQueryBuilder.addBooleanClauses(BoolQueryBuilder.java:324)
    	at org.elasticsearch.index.query.BoolQueryBuilder.doToQuery(BoolQueryBuilder.java:308)
    	at org.elasticsearch.index.query.AbstractQueryBuilder.toQuery(AbstractQueryBuilder.java:103)
    	at org.elasticsearch.index.query.BoolQueryBuilder.addBooleanClauses(BoolQueryBuilder.java:324)
    	at org.elasticsearch.index.query.BoolQueryBuilder.doToQuery(BoolQueryBuilder.java:310)
    	at org.elasticsearch.index.query.AbstractQueryBuilder.toQuery(AbstractQueryBuilder.java:103)
    	at org.elasticsearch.index.query.BoolQueryBuilder.addBooleanClauses(BoolQueryBuilder.java:324)
    	at org.elasticsearch.index.query.BoolQueryBuilder.doToQuery(BoolQueryBuilder.java:310)
    	at org.elasticsearch.index.query.AbstractQueryBuilder.toQuery(AbstractQueryBuilder.java:103)
    	at org.elasticsearch.index.query.NestedQueryBuilder.doToQuery(NestedQueryBuilder.java:298)
    	at org.elasticsearch.index.query.AbstractQueryBuilder.toQuery(AbstractQueryBuilder.java:103)
    	at org.elasticsearch.index.query.QueryShardContext.lambda$toQuery$1(QueryShardContext.java:353)
    	at org.elasticsearch.index.query.QueryShardContext.toQuery(QueryShardContext.java:365)
    	at org.elasticsearch.index.query.QueryShardContext.toQuery(QueryShardContext.java:352)
    	at org.elasticsearch.search.SearchService.parseSource(SearchService.java:844)
    	at org.elasticsearch.search.SearchService.createContext(SearchService.java:681)
    	at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:631)
    	at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:428)
    	at org.elasticsearch.search.SearchService.access$200(SearchService.java:135)
    	at org.elasticsearch.search.SearchService$2.lambda$onResponse$0(SearchService.java:395)
    	at org.elasticsearch.search.SearchService.lambda$runAsync$0(SearchService.java:411)
    	at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:44)
    	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:695)
    	at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    	at java.base/java.lang.Thread.run(Thread.java:832)

```

What would be the suggested thing to do here? I can get around this by duplicating the abstract superclasses I need, but that solution seems hamfisted to me.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [June 14, 2021, 8:55pm UTC](https://discuss.elastic.co/t/search-plugin-with-custom-query-getting-illegalaccesserror/273221/2 "2021-06-14T20:55:51Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
