#7505: Let lsp.client display completions provided by CompletionCollector

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 5505f9a..8f40bbb 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -891,9 +891,9 @@
 #        run: ant $OPTS -f java/ant.grammar test
 
       # TODO next are JDK 21+ incompatibe steps
-#      - name: java/java.mx.project
-#        if: ${{ matrix.java == '17' }}
-#        run: .github/retry.sh ant $OPTS -f java/java.mx.project test
+      - name: java/java.mx.project
+        if: ${{ matrix.java == '17' }}
+        run: .github/retry.sh ant $OPTS -f java/java.mx.project test
 
       - name: java/gradle.java
         if: ${{ matrix.java == '17' }}
diff --git a/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautEntity.java b/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautEntity.java
index 977775b..9b677bd 100644
--- a/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautEntity.java
+++ b/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautEntity.java
@@ -104,7 +104,7 @@
 
     @NbBundle.Messages({
         "MSG_NoDbConn=No database connection found",
-        "MSG_NoDdSupport=No database support libraries found for {0}",
+        "MSG_NoDdSupport=No Micronaut Data support libraries found for {0}",
         "MSG_NoProject=No project found for {0}",
         "MSG_NoSourceGroup=No source group found for {0}",
         "MSG_SelectTables=Select Database Tables",
diff --git a/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolFinder.java b/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolFinder.java
index ba9a5a2..a7390b0 100644
--- a/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolFinder.java
+++ b/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolFinder.java
@@ -62,6 +62,7 @@
 import javax.tools.JavaFileObject;
 import org.netbeans.api.editor.mimelookup.MimeRegistration;
 import org.netbeans.api.java.classpath.ClassPath;
+import org.netbeans.api.java.project.JavaProjectConstants;
 import org.netbeans.api.java.source.ClassIndex;
 import org.netbeans.api.java.source.ClasspathInfo;
 import org.netbeans.api.java.source.CompilationController;
@@ -69,6 +70,8 @@
 import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.project.FileOwnerQuery;
 import org.netbeans.api.project.Project;
+import org.netbeans.api.project.ProjectUtils;
+import org.netbeans.api.project.SourceGroup;
 import org.netbeans.modules.parsing.api.Snapshot;
 import org.netbeans.modules.parsing.spi.Parser;
 import org.netbeans.modules.parsing.spi.indexing.Context;
@@ -106,7 +109,7 @@
     private static final String MANAGEMENT_DELETE_ANNOTATION = "io.micronaut.management.endpoint.annotation.Delete";
     private static final String MANAGEMENT_SELECTOR_ANNOTATION = "io.micronaut.management.endpoint.annotation.Selector";
 
-    private final Map<Project, Boolean> map = new WeakHashMap<>();
+    private final Map<FileObject, Boolean> map = new WeakHashMap<>();
     private final Map<ClasspathInfo, List<ClassSymbolLocation>> cache = new WeakHashMap<>();
 
     @Override
@@ -135,15 +138,21 @@
         if (p == null) {
             return false;
         }
-        Boolean ret = map.get(p);
-        if (ret == null) {
-            ClassPath cp = ClassPath.getClassPath(p.getProjectDirectory(), ClassPath.COMPILE);
-            cp.addPropertyChangeListener(WeakListeners.propertyChange(this, cp));
-            ret = cp.findResource("io/micronaut/http/annotation/HttpMethodMapping.class") != null
-                    || cp.findResource("io/micronaut/management/endpoint/annotation/Endpoint.class") != null;
-            map.put(p, ret);
+        for (SourceGroup sg : ProjectUtils.getSources(p).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA)) {
+            if (sg.contains(cc.getFileObject())) {
+                FileObject root = sg.getRootFolder();
+                Boolean ret = map.get(root);
+                if (ret == null) {
+                    ClassPath cp = ClassPath.getClassPath(root, ClassPath.COMPILE);
+                    cp.addPropertyChangeListener(WeakListeners.propertyChange(this, cp));
+                    ret = cp.findResource("io/micronaut/http/annotation/HttpMethodMapping.class") != null
+                            || cp.findResource("io/micronaut/management/endpoint/annotation/Endpoint.class") != null;
+                    map.put(root, ret);
+                }
+                return ret;
+            }
         }
-        return ret;
+        return false;
     }
 
     public static List<SymbolLocation> scan(CompilationController cc, boolean selectEndpointAnnotation) {
@@ -588,8 +597,23 @@
                 for (AnnotationMirror ann : ee.getAnnotationMirrors()) {
                     String method = getEndpointMethod((TypeElement) ann.getAnnotationType().asElement());
                     if (method != null) {
-                        String name = '@' + path + getId(ee) + " -- " + method;
-                        ret.add(new ClassSymbolLocation(name, fo, mth.getKind().name(), getSignatures(mth)));
+                        List<String> ids = new ArrayList<>();
+                        for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : ann.getElementValues().entrySet()) {
+                            if ("value".contentEquals(entry.getKey().getSimpleName()) || "uri".contentEquals(entry.getKey().getSimpleName())) {
+                                ids.add((String) entry.getValue().getValue());
+                            } else if ("uris".contentEquals(entry.getKey().getSimpleName())) {
+                                for (AnnotationValue av : (List<AnnotationValue>) entry.getValue().getValue()) {
+                                    ids.add((String) av.getValue());
+                                }
+                            }
+                        }
+                        if (ids.isEmpty()) {
+                            ids.add(getId(ee));
+                        }
+                        for (String id : ids) {
+                            String name = '@' + path + id + " -- " + method;
+                            ret.add(new ClassSymbolLocation(name, fo, mth.getKind().name(), getSignatures(mth)));
+                        }
                     }
                 }
             }
diff --git a/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolSearcher.java b/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolSearcher.java
index c3cb17f..5dfec78 100644
--- a/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolSearcher.java
+++ b/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolSearcher.java
@@ -34,7 +34,9 @@
 import java.util.stream.Collectors;
 import javax.swing.Icon;
 import javax.swing.text.StyledDocument;
+import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.project.JavaProjectConstants;
+import org.netbeans.api.java.queries.UnitTestForSourceQuery;
 import org.netbeans.api.java.source.ClasspathInfo;
 import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.lsp.Diagnostic;
@@ -127,7 +129,8 @@
         Set<SymbolDescriptor> symbols = new HashSet<>();
         for (SourceGroup sg : ProjectUtils.getSources(project).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA)) {
             try {
-                FileObject cacheRoot = getCacheRoot(sg.getRootFolder().toURL());
+                FileObject root = sg.getRootFolder();
+                FileObject cacheRoot = getCacheRoot(root.toURL());
                 if (cacheRoot != null) {
                     cacheRoot.refresh();
                     Enumeration<? extends FileObject> children = cacheRoot.getChildren(true);
@@ -138,13 +141,18 @@
                         }
                     }
                 }
+                if (UnitTestForSourceQuery.findUnitTests(root).length > 0) {
+                    ClassPath bootCP = ClassPath.getClassPath(root, ClassPath.BOOT);
+                    ClassPath execCP = ClassPath.getClassPath(root, ClassPath.EXECUTE);
+                    ClasspathInfo cpInfo = ClasspathInfo.create(bootCP != null ? bootCP : ClassPath.EMPTY, execCP != null ? execCP : ClassPath.EMPTY, null);
+                    for (MicronautSymbolFinder.ClassSymbolLocation loc : MicronautSymbolFinder.getSymbolsFromDependencies(cpInfo, textForQuery)) {
+                        symbols.add(new SymbolDescriptor(loc.getName(), loc.getFile(), loc.getKind(), loc.getSignatures()));
+                    }
+                }
             } catch (IOException ex) {
                 Exceptions.printStackTrace(ex);
             }
         }
-        for (MicronautSymbolFinder.ClassSymbolLocation loc : MicronautSymbolFinder.getSymbolsFromDependencies(ClasspathInfo.create(project.getProjectDirectory()), textForQuery)) {
-            symbols.add(new SymbolDescriptor(loc.getName(), loc.getFile(), loc.getKind(), loc.getSignatures()));
-        }
         return symbols;
     }
 
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/execute/AbstractGradleExecutor.java b/extide/gradle/src/org/netbeans/modules/gradle/execute/AbstractGradleExecutor.java
index c1188eb..f682d53 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/execute/AbstractGradleExecutor.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/execute/AbstractGradleExecutor.java
@@ -284,7 +284,9 @@
 
         @Override
         public void repeatExecution() {
-            //TODO: Implement
+            if (config.getExecFlags().contains(RunConfig.ExecFlag.REPEATABLE)) {
+                RunUtils.executeGradle(config, null);
+            }
         }
 
         @Override
diff --git a/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProvider.java b/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProvider.java
index 7793d06..0bfc6bf 100644
--- a/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProvider.java
+++ b/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProvider.java
@@ -94,8 +94,18 @@
     private Map<FileObject, ClassPath> file2ClassPath = new WeakHashMap<>();
     private Map<FileObject, ClassPath> file2ModulePath = new WeakHashMap<>();
 
+    static boolean isSupportedFile(FileObject file) {
+        return SingleSourceFileUtil.isSingleSourceFile(file)
+                // MultiSourceRootProvider assumes it can convert FileObject to
+                // java.io.File, so filter here
+                && Objects.equals("file", file.toURI().getScheme());
+    }
+
     @Override
     public ClassPath findClassPath(FileObject file, String type) {
+        if (! isSupportedFile(file)) {
+            return null;
+        }
         switch (type) {
             case ClassPath.SOURCE: return getSourcePath(file);
             case ClassPath.COMPILE:
diff --git a/java/java.file.launcher/test/unit/src/org/netbeans/modules/java/file/launcher/SingleSourceFileUtilTest.java b/java/java.file.launcher/test/unit/src/org/netbeans/modules/java/file/launcher/SingleSourceFileUtilTest.java
index 5ad96c0..9bbd0d5 100644
--- a/java/java.file.launcher/test/unit/src/org/netbeans/modules/java/file/launcher/SingleSourceFileUtilTest.java
+++ b/java/java.file.launcher/test/unit/src/org/netbeans/modules/java/file/launcher/SingleSourceFileUtilTest.java
@@ -82,4 +82,38 @@
             }
         }
     }
+
+    @Test
+    public void testSsSingleSourceFile() throws IOException {
+        File vcsDemoDir = null;
+        File supportedFile = null;
+        File unsupportedFile = null;
+        File unsupportedFile2 = null;
+        try {
+            vcsDemoDir = Files.createTempDirectory("vcs-dummy").toFile();
+            supportedFile = Files.createTempFile("dummy", ".java").toFile();
+            unsupportedFile = new File(vcsDemoDir, "dummy.java");
+            unsupportedFile2 = Files.createTempFile("dummy", ".non-java").toFile();;
+            FileUtil.createData(unsupportedFile);
+
+            assertTrue(SingleSourceFileUtil.isSingleSourceFile(FileUtil.createData(supportedFile)));
+            assertFalse(SingleSourceFileUtil.isSingleSourceFile(FileUtil.createData(unsupportedFile)));
+            assertFalse(SingleSourceFileUtil.isSingleSourceFile(FileUtil.createData(unsupportedFile2)));
+
+        } finally {
+            if(supportedFile != null && supportedFile.exists()) {
+                supportedFile.delete();
+            }
+            if(unsupportedFile != null && unsupportedFile.exists()) {
+                unsupportedFile.delete();
+            }
+            if(unsupportedFile2 != null && unsupportedFile2.exists()) {
+                unsupportedFile2.delete();
+            }
+            if(vcsDemoDir != null && vcsDemoDir.exists()) {
+                vcsDemoDir.delete();
+            }
+        }
+    }
+
 }
diff --git a/java/java.file.launcher/test/unit/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProviderTest.java b/java/java.file.launcher/test/unit/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProviderTest.java
index 61694bb..ff7245d 100644
--- a/java/java.file.launcher/test/unit/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProviderTest.java
+++ b/java/java.file.launcher/test/unit/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProviderTest.java
@@ -18,7 +18,10 @@
  */
 package org.netbeans.modules.java.file.launcher.queries;
 
+import java.io.File;
+import java.io.IOException;
 import java.net.URI;
+import java.nio.file.Files;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -245,6 +248,22 @@
         provider.findClassPath(test, JavaClassPathConstants.MODULE_COMPILE_PATH);
     }
 
+    public void testMultiSourceRootProviderOnlySupportedForLocalFiles() throws IOException {
+        File supportedFile = null;
+        try {
+            supportedFile = Files.createTempFile("dummy", ".java").toFile();
+            FileObject realFileSource = FileUtil.createData(supportedFile);
+            FileObject inMemorySource = FileUtil.createMemoryFileSystem().getRoot().createData("Ahoj.java");
+
+            assertFalse(MultiSourceRootProvider.isSupportedFile(inMemorySource));
+            assertTrue(MultiSourceRootProvider.isSupportedFile(realFileSource));
+        } finally {
+            if(supportedFile != null && supportedFile.exists()) {
+                supportedFile.delete();
+            }
+        }
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
index 7a0c6be..d3027a2 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
@@ -1058,7 +1058,7 @@
                         js.runWhenScanFinished(cc -> {
                             WORKER.post(() -> {
                                 try {
-                                    List<WorkspaceSymbol> symbols = new ArrayList<>();
+                                    Set<WorkspaceSymbol> symbols = new HashSet<>();
                                     SearchType searchType = getSearchType(queryFin, exactFin, false, null, null);
 
                                     // CSL Part
@@ -1218,7 +1218,7 @@
                                             symbols.add(symbol);
                                         }
                                     }
-                                    result.complete(Either.forRight(symbols));
+                                    result.complete(Either.forRight(new ArrayList<>(symbols)));
                                 } catch (Throwable t) {
                                     result.completeExceptionally(t);
                                 }
diff --git a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
index f12c947..4fce71a 100644
--- a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
+++ b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
@@ -1944,11 +1944,12 @@
             }
             return ws.getKind() + ":" + ws.getName() + ":" + ws.getContainerName() + ":" + (ws.getLocation().isLeft() ? toString(ws.getLocation().getLeft()) : toString(ws.getLocation().getRight()));
         }).collect(Collectors.toList());
-        assertEquals(Arrays.asList("Constructor:Test():Test:Test.java:0:7-0:7",
-                                   "Method:testMethod():Test:Test.java:2:4-2:38",
+        Collections.sort(actual);
+        assertEquals(Arrays.asList("Class:Test:null:?CLASS#Test",
+                                   "Class:TestNested:Test:?CLASS#Test$TestNested",
+                                   "Constructor:Test():Test:Test.java:0:7-0:7",
                                    "Constructor:TestNested():Test.TestNested:Test.java:1:18-1:18",
-                                   "Class:Test:null:?CLASS#Test",
-                                   "Class:TestNested:Test:?CLASS#Test$TestNested"),
+                                   "Method:testMethod():Test:Test.java:2:4-2:38"),
                      actual);
     }
 
diff --git a/java/java.mx.project/build.xml b/java/java.mx.project/build.xml
index d3be443..bbd780a 100644
--- a/java/java.mx.project/build.xml
+++ b/java/java.mx.project/build.xml
@@ -47,14 +47,11 @@
         </exec>
     </target>
 
-    <!--
-    TODO the branches of https://github.com/graalvm/mx disappered
     <target name="test-preinit" depends="-checkout-graalvm">
         <exec dir="${graal.dir}/truffle" executable="${mx.dir}/mx" failonerror="true">
             <arg value="build"/>
         </exec>
     </target>
-    -->
     <target name="test-unit-build-datajar"/>
 
     <import file="../../nbbuild/templates/projectized.xml"/>
diff --git a/java/maven.indexer/external/binaries-list b/java/maven.indexer/external/binaries-list
index 0adb9f1..bfde38d 100644
--- a/java/maven.indexer/external/binaries-list
+++ b/java/maven.indexer/external/binaries-list
@@ -14,13 +14,13 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-C867D9AA6A9AB14F62D35FB689A789A6CB5AF62E org.apache.maven.indexer:indexer-core:7.1.2
-219D09C157DDFBD741642FEDC28931D3561984B6 org.apache.maven.indexer:search-api:7.1.2
-2625D44190FDB8E7B85C8FCF1803637390A20ACC org.apache.maven.indexer:search-backend-smo:7.1.2
-64E5624754D59386BE5D9159C68F81FF96298704 org.apache.lucene:lucene-core:9.10.0
-6570EBF974D07025AD4CD9FFAA9927546B534704 org.apache.lucene:lucene-backward-codecs:9.10.0
-2F21ADE4B4896F1ECE2B3A823E1640C762C9D0CF org.apache.lucene:lucene-highlighter:9.10.0
-C50F82D244EA5ADAC2D2D9295DE85DDCCC2D45CB org.apache.lucene:lucene-queryparser:9.10.0
-92E559808A23F61C818EF90A9CCAB3669A25CAA0 org.apache.lucene:lucene-analysis-common:9.10.0
+6B6780786C8FBF64FE4C809BBAC2CE4FD5D996C4 org.apache.maven.indexer:indexer-core:7.1.3
+7AB214FA5A675719E011F514939E52C010F049F6 org.apache.maven.indexer:search-api:7.1.3
+58A364CECD56F04A55D2F0C932DF879C7168C4C3 org.apache.maven.indexer:search-backend-smo:7.1.3
+2E487755A6814B2A1BC770C26569DCBA86873DCF org.apache.lucene:lucene-core:9.11.0
+DB385446BC3FD70E7C6A744276C0A157BD60EE0A org.apache.lucene:lucene-backward-codecs:9.11.0
+44ACCDC03C5482E602718F7BF91E5940BA4E4870 org.apache.lucene:lucene-highlighter:9.11.0
+E97FE1C0D102EDB8D6E1C01454992FD2B8D80AE0 org.apache.lucene:lucene-queryparser:9.11.0
+75A0A333CF1E043102743066C929E65FE51CBCDA org.apache.lucene:lucene-analysis-common:9.11.0
 934C04D3CFEF185A8008E7BF34331B79730A9D43 javax.annotation:javax.annotation-api:1.3.2
-B3ADD478D4382B78EA20B1671390A858002FEB6C com.google.code.gson:gson:2.10.1
+527175CA6D81050B53BDD4C457A6D6E017626B0E com.google.code.gson:gson:2.11.0
diff --git a/java/maven.indexer/external/gson-2.10.1-license.txt b/java/maven.indexer/external/gson-2.11.0-license.txt
similarity index 99%
rename from java/maven.indexer/external/gson-2.10.1-license.txt
rename to java/maven.indexer/external/gson-2.11.0-license.txt
index 58c1de7..cce6b58 100644
--- a/java/maven.indexer/external/gson-2.10.1-license.txt
+++ b/java/maven.indexer/external/gson-2.11.0-license.txt
@@ -1,7 +1,7 @@
 Name: GSon
 Description: JSon serialization/deserialization library
 Origin: GitHub
-Version: 2.10.1
+Version: 2.11.0
 License: Apache-2.0
 Source: https://github.com/google/gson
 
diff --git a/java/maven.indexer/external/indexer-core-7.1.2-license.txt b/java/maven.indexer/external/indexer-core-7.1.3-license.txt
similarity index 98%
rename from java/maven.indexer/external/indexer-core-7.1.2-license.txt
rename to java/maven.indexer/external/indexer-core-7.1.3-license.txt
index 6900d64..fe17e6a 100644
--- a/java/maven.indexer/external/indexer-core-7.1.2-license.txt
+++ b/java/maven.indexer/external/indexer-core-7.1.3-license.txt
@@ -1,11 +1,11 @@
 Name: Maven Indexer
 Description: Maven remote repository indexing engine.
-Version: 7.1.2
+Version: 7.1.3
 Origin: Apache Software Foundation
 License: Apache-2.0
 URL: https://repo.maven.apache.org/maven2/org/apache/maven/indexer/
 Source: https://github.com/apache/maven-indexer
-Files: indexer-core-7.1.2.jar search-api-7.1.2.jar search-backend-smo-7.1.2.jar
+Files: indexer-core-7.1.3.jar search-api-7.1.3.jar search-backend-smo-7.1.3.jar
 
                                  Apache License
                            Version 2.0, January 2004
diff --git a/java/maven.indexer/external/indexer-core-7.1.2-notice.txt b/java/maven.indexer/external/indexer-core-7.1.3-notice.txt
similarity index 100%
rename from java/maven.indexer/external/indexer-core-7.1.2-notice.txt
rename to java/maven.indexer/external/indexer-core-7.1.3-notice.txt
diff --git a/java/maven.indexer/external/lucene-9.10.0-license.txt b/java/maven.indexer/external/lucene-9.11.0-license.txt
similarity index 99%
rename from java/maven.indexer/external/lucene-9.10.0-license.txt
rename to java/maven.indexer/external/lucene-9.11.0-license.txt
index 11fcf84..6373bf4 100644
--- a/java/maven.indexer/external/lucene-9.10.0-license.txt
+++ b/java/maven.indexer/external/lucene-9.11.0-license.txt
@@ -1,11 +1,11 @@
 Name: Apache Lucene
 Description: Java-based indexing and search technology
-Version: 9.10.0
+Version: 9.11.0
 Origin: Apache Software Foundation
 License: Apache-2.0-lucene2
 URL: https://lucene.apache.org/
 Source: https://github.com/apache/lucene
-Files: lucene-analysis-common-9.10.0.jar lucene-backward-codecs-9.10.0.jar lucene-core-9.10.0.jar lucene-highlighter-9.10.0.jar lucene-queryparser-9.10.0.jar
+Files: lucene-analysis-common-9.11.0.jar lucene-backward-codecs-9.11.0.jar lucene-core-9.11.0.jar lucene-highlighter-9.11.0.jar lucene-queryparser-9.11.0.jar
 
                                  Apache License
                            Version 2.0, January 2004
diff --git a/java/maven.indexer/external/lucene-9.10.0-notice.txt b/java/maven.indexer/external/lucene-9.11.0-notice.txt
similarity index 100%
rename from java/maven.indexer/external/lucene-9.10.0-notice.txt
rename to java/maven.indexer/external/lucene-9.11.0-notice.txt
diff --git a/java/maven.indexer/nbproject/project.properties b/java/maven.indexer/nbproject/project.properties
index abd8fbf..d84d52c 100644
--- a/java/maven.indexer/nbproject/project.properties
+++ b/java/maven.indexer/nbproject/project.properties
@@ -19,15 +19,15 @@
 is.autoload=true
 javac.release=11
 javac.compilerargs=-Xlint -Xlint:-serial
-release.external/indexer-core-7.1.2.jar=modules/ext/maven/indexer-core-7.1.2.jar
-release.external/search-api-7.1.2.jar=modules/ext/maven/search-api-7.1.2.jar
-release.external/search-backend-smo-7.1.2.jar=modules/ext/maven/search-backend-smo-7.1.2.jar
-release.external/gson-2.10.1.jar=modules/ext/maven/gson-2.10.1.jar
-release.external/lucene-core-9.10.0.jar=modules/ext/maven/lucene-core-9.10.0.jar
-release.external/lucene-backward-codecs-9.10.0.jar=modules/ext/maven/lucene-backward-codecs-9.10.0.jar
-release.external/lucene-highlighter-9.10.0.jar=modules/ext/maven/lucene-highlighter-9.10.0.jar
-release.external/lucene-queryparser-9.10.0.jar=modules/ext/maven/lucene-queryparser-9.10.0.jar
-release.external/lucene-analysis-common-9.10.0.jar=modules/ext/maven/lucene-analysis-common-9.10.0.jar
+release.external/indexer-core-7.1.3.jar=modules/ext/maven/indexer-core-7.1.3.jar
+release.external/search-api-7.1.3.jar=modules/ext/maven/search-api-7.1.3.jar
+release.external/search-backend-smo-7.1.3.jar=modules/ext/maven/search-backend-smo-7.1.3.jar
+release.external/gson-2.11.0.jar=modules/ext/maven/gson-2.11.0.jar
+release.external/lucene-core-9.11.0.jar=modules/ext/maven/lucene-core-9.11.0.jar
+release.external/lucene-backward-codecs-9.11.0.jar=modules/ext/maven/lucene-backward-codecs-9.11.0.jar
+release.external/lucene-highlighter-9.11.0.jar=modules/ext/maven/lucene-highlighter-9.11.0.jar
+release.external/lucene-queryparser-9.11.0.jar=modules/ext/maven/lucene-queryparser-9.11.0.jar
+release.external/lucene-analysis-common-9.11.0.jar=modules/ext/maven/lucene-analysis-common-9.11.0.jar
 release.external/javax.annotation-api-1.3.2.jar=modules/ext/maven/javax.annotation-api-1.3.2.jar
 # XXX so long as Lucene is bundled here:
 sigtest.gen.fail.on.error=false
diff --git a/java/maven.indexer/nbproject/project.xml b/java/maven.indexer/nbproject/project.xml
index 0d07fad..29b8f32 100644
--- a/java/maven.indexer/nbproject/project.xml
+++ b/java/maven.indexer/nbproject/project.xml
@@ -176,44 +176,44 @@
                 <package>org.netbeans.modules.maven.indexer.spi.impl</package>
             </friend-packages>
             <class-path-extension>
-                <runtime-relative-path>ext/maven/indexer-core-7.1.2.jar</runtime-relative-path>
-                <binary-origin>external/indexer-core-7.1.2.jar</binary-origin>
+                <runtime-relative-path>ext/maven/indexer-core-7.1.3.jar</runtime-relative-path>
+                <binary-origin>external/indexer-core-7.1.3.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/maven/search-api-7.1.2.jar</runtime-relative-path>
-                <binary-origin>external/search-api-7.1.2.jar</binary-origin>
+                <runtime-relative-path>ext/maven/search-api-7.1.3.jar</runtime-relative-path>
+                <binary-origin>external/search-api-7.1.3.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/maven/search-backend-smo-7.1.2.jar</runtime-relative-path>
-                <binary-origin>external/search-backend-smo-7.1.2.jar</binary-origin>
+                <runtime-relative-path>ext/maven/search-backend-smo-7.1.3.jar</runtime-relative-path>
+                <binary-origin>external/search-backend-smo-7.1.3.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/maven/lucene-core-9.10.0.jar</runtime-relative-path>
-                <binary-origin>external/lucene-core-9.10.0.jar</binary-origin>
+                <runtime-relative-path>ext/maven/lucene-core-9.11.0.jar</runtime-relative-path>
+                <binary-origin>external/lucene-core-9.11.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/maven/lucene-backward-codecs-9.10.0.jar</runtime-relative-path>
-                <binary-origin>external/lucene-backward-codecs-9.10.0.jar</binary-origin>
+                <runtime-relative-path>ext/maven/lucene-backward-codecs-9.11.0.jar</runtime-relative-path>
+                <binary-origin>external/lucene-backward-codecs-9.11.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/maven/lucene-highlighter-9.10.0.jar</runtime-relative-path>
-                <binary-origin>external/lucene-highlighter-9.10.0.jar</binary-origin>
+                <runtime-relative-path>ext/maven/lucene-highlighter-9.11.0.jar</runtime-relative-path>
+                <binary-origin>external/lucene-highlighter-9.11.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/maven/lucene-queryparser-9.10.0.jar</runtime-relative-path>
-                <binary-origin>external/lucene-queryparser-9.10.0.jar</binary-origin>
+                <runtime-relative-path>ext/maven/lucene-queryparser-9.11.0.jar</runtime-relative-path>
+                <binary-origin>external/lucene-queryparser-9.11.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/maven/lucene-analysis-common-9.10.0.jar</runtime-relative-path>
-                <binary-origin>external/lucene-analysis-common-9.10.0.jar</binary-origin>
+                <runtime-relative-path>ext/maven/lucene-analysis-common-9.11.0.jar</runtime-relative-path>
+                <binary-origin>external/lucene-analysis-common-9.11.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
                 <runtime-relative-path>ext/maven/javax.annotation-api-1.3.2.jar</runtime-relative-path>
                 <binary-origin>external/javax.annotation-api-1.3.2.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/maven/gson-2.10.1.jar</runtime-relative-path>
-                <binary-origin>external/gson-2.10.1.jar</binary-origin>
+                <runtime-relative-path>ext/maven/gson-2.11.0.jar</runtime-relative-path>
+                <binary-origin>external/gson-2.11.0.jar</binary-origin>
             </class-path-extension>
         </data>
     </configuration>
diff --git a/java/maven/src/org/netbeans/modules/maven/queries/RepositoryMavenCPProvider.java b/java/maven/src/org/netbeans/modules/maven/queries/RepositoryMavenCPProvider.java
index f035054..c822c26 100644
--- a/java/maven/src/org/netbeans/modules/maven/queries/RepositoryMavenCPProvider.java
+++ b/java/maven/src/org/netbeans/modules/maven/queries/RepositoryMavenCPProvider.java
@@ -19,9 +19,11 @@
 package org.netbeans.modules.maven.queries;
 
 import java.io.File;
+import java.io.IOException;
 import java.lang.ref.SoftReference;
 import java.net.URI;
 import java.net.URL;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -49,6 +51,7 @@
 import org.netbeans.spi.java.classpath.support.ClassPathSupport;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
+import org.openide.util.Exceptions;
 import org.openide.util.Utilities;
 import org.openide.util.lookup.ServiceProvider;
 
@@ -111,11 +114,16 @@
                                         return JavaPlatform.getDefault().getBootstrapLibraries();
                                     }
                                     if (ClassPath.COMPILE.equals(type)) {
-                                        MavenProject mp = getMavenProject(archive, pom, groupId, artifact, version);
-                                        return ClassPathFactory.createClassPath(createCompileCPI(mp, bin));
+                                        // Gradle generated POM files does not contain `compileOnly(...)` dependencies supported by gradle
+                                        // and therefore cannot be used to provide complete compile classpath for the given file.
+                                        // Better to fallback to DefaultClassPathProvider in such case.
+                                        if (!fromGradleMetadata(pom)) {
+                                            MavenProject mp = getMavenProject(archive, pom, groupId, artifact, version);
+                                            return ClassPathFactory.createClassPath(createCompileCPI(mp, bin));
+                                        }
                                     }
                                     if (ClassPath.EXECUTE.equals(type)) {
-                                        MavenProject mp = getMavenProject(archive, pom, groupId, artifact, version);                                        
+                                        MavenProject mp = getMavenProject(archive, pom, groupId, artifact, version);
                                         return ClassPathFactory.createClassPath(createExecuteCPI(mp, bin));
                                     }
                                 } else {
@@ -133,6 +141,16 @@
         return null;
     }
 
+    private boolean fromGradleMetadata(File pom) {
+        try {
+            String content = Files.readString(pom.toPath());
+            return content.contains("<!-- do_not_remove: published-with-gradle-metadata -->"); //NOI18N
+        } catch (IOException ex) {
+            LOG.log(Level.FINER, "Failed to read POM file {0}", new Object[] {pom});
+        }
+        return false;
+    }
+
     private MavenProject getMavenProject(FileObject archive, File pom, String groupId, String artifact, String version) {
         SoftReference<MavenProject> ref = cache.get(archive);
         MavenProject mp = ref != null ? ref.get() : null;
diff --git a/nbbuild/jms-config/base.flags b/nbbuild/jms-config/base.flags
index 4cb4185..b75c2f3 100644
--- a/nbbuild/jms-config/base.flags
+++ b/nbbuild/jms-config/base.flags
@@ -1,3 +1,4 @@
+--enable-native-access=ALL-UNNAMED
 --add-opens=java.base/java.net=ALL-UNNAMED
 --add-opens=java.base/java.lang.ref=ALL-UNNAMED
 --add-opens=java.base/java.lang=ALL-UNNAMED