diff --git a/extension/jdtls.ext/com.microsoft.gradle.bs.importer/src/com/microsoft/gradle/bs/importer/GradleBuildServerBuildSupport.java b/extension/jdtls.ext/com.microsoft.gradle.bs.importer/src/com/microsoft/gradle/bs/importer/GradleBuildServerBuildSupport.java index 978d36b9e..e004eae80 100644 --- a/extension/jdtls.ext/com.microsoft.gradle.bs.importer/src/com/microsoft/gradle/bs/importer/GradleBuildServerBuildSupport.java +++ b/extension/jdtls.ext/com.microsoft.gradle.bs.importer/src/com/microsoft/gradle/bs/importer/GradleBuildServerBuildSupport.java @@ -513,30 +513,33 @@ private void setProjectJdk(Map classpathMap, List classpathAttributes = new LinkedList<>(); - if (isModular) { - classpathAttributes.add(modularAttribute); + List classpathAttributes = new LinkedList<>(); + if (isModular) { + classpathAttributes.add(modularAttribute); + } + classpathAttributes.add(buildServerAttribute); + IClasspathEntry jdkEntry = JavaCore.newContainerEntry( + JavaRuntime.newJREContainerPath(vm), + ClasspathEntry.NO_ACCESS_RULES, + classpathAttributes.toArray(new IClasspathAttribute[0]), + false /*isExported*/ + ); + classpathMap.putIfAbsent(jdkEntry.getPath(), jdkEntry); + } catch (URISyntaxException e) { + throw new CoreException(new Status(IStatus.ERROR, ImporterPlugin.PLUGIN_ID, + "Invalid Java home: " + jvmBuildTarget.getJavaHome(), e)); } - classpathAttributes.add(buildServerAttribute); - IClasspathEntry jdkEntry = JavaCore.newContainerEntry( - JavaRuntime.newJREContainerPath(vm), - ClasspathEntry.NO_ACCESS_RULES, - classpathAttributes.toArray(new IClasspathAttribute[0]), - false /*isExported*/ - ); - classpathMap.putIfAbsent(jdkEntry.getPath(), jdkEntry); - } catch (URISyntaxException e) { - throw new CoreException(new Status(IStatus.ERROR, ImporterPlugin.PLUGIN_ID, - "Invalid Java home: " + jvmBuildTarget.getJavaHome(), e)); } } @@ -585,8 +588,10 @@ private JvmBuildTargetEx getJvmTarget(List buildTargets) throws Cor } if (StringUtils.isBlank(jvmTarget.getJavaHome()) || StringUtils.isBlank(jvmTarget.getGradleVersion())) { - throw new CoreException(new Status(IStatus.ERROR, ImporterPlugin.PLUGIN_ID, - "Invalid JVM build target: " + jvmTarget.toString())); + JavaLanguageServerPlugin.logException( + new CoreException(new Status(IStatus.WARNING, ImporterPlugin.PLUGIN_ID, + "Empty Java Home or Gradle Version in JVM target.")) + ); } return jvmTarget; @@ -641,7 +646,8 @@ private List getDependencyJars(DependencyModulesResult dependen } String classifier = artifactData.getClassifier(); try { - File jarFile = new File(new URI(uri)); + File artifactFile = new File(new URI(uri)); + File jarFile = Utils.getJarFile(artifactFile); if (classifier == null) { artifact = jarFile; } else if ("sources".equals(classifier)) { diff --git a/extension/jdtls.ext/com.microsoft.gradle.bs.importer/src/com/microsoft/gradle/bs/importer/Utils.java b/extension/jdtls.ext/com.microsoft.gradle.bs.importer/src/com/microsoft/gradle/bs/importer/Utils.java index fd312aee6..c365b5dd6 100644 --- a/extension/jdtls.ext/com.microsoft.gradle.bs.importer/src/com/microsoft/gradle/bs/importer/Utils.java +++ b/extension/jdtls.ext/com.microsoft.gradle.bs.importer/src/com/microsoft/gradle/bs/importer/Utils.java @@ -2,14 +2,21 @@ import static org.eclipse.jdt.ls.core.internal.handlers.MapFlattener.getString; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import java.nio.file.Path; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IProject; @@ -22,6 +29,7 @@ import org.eclipse.core.runtime.URIUtil; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.ls.core.internal.JavaClientConnection.JavaLanguageClient; +import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.preferences.Preferences; import org.eclipse.lsp4j.ExecuteCommandParams; @@ -214,4 +222,46 @@ public static void sendTelemetry(JavaLanguageClient client, Object message) { client.sendNotification(new ExecuteCommandParams("_java.gradle.buildServer.sendTelemetry", Arrays.asList(message))); } + + /** + * Extracts the jar file from the aar file, since JDT.LS is not able to understand + * the structure of aar files. + */ + public static File getJarFile(File file) { + + String filepath = file.getAbsolutePath(); + + if (filepath.endsWith(".aar")) { + + // Extracting classes.jar from AAR files + try(ZipInputStream is = new ZipInputStream(new FileInputStream(file))) { + + ZipEntry entry; + while ((entry = is.getNextEntry()) != null) { + if (entry.getName().equals("classes.jar")) { + String fileName = file.getName(); + fileName = fileName.substring(0, fileName.length() - 4); + fileName = fileName + ".jar"; + File outputFile = Path.of(file.getParentFile().getAbsolutePath(), fileName).toFile(); + try (FileOutputStream outputStream = new FileOutputStream(outputFile)) { + byte[] buffer = new byte[1024]; + int len; + while((len = is.read(buffer)) > 0) { + outputStream.write(buffer, 0, len); + } + return outputFile; + } + } + } + + } catch(IOException e) { + JavaLanguageServerPlugin.logException(e); + } + + } + + return file; + + } + }