feat - Extract classes.jar from *.aar (#1594)

This commit is contained in:
Tanish Ranjan 2024-09-05 10:48:55 +05:30 коммит произвёл GitHub
Родитель 7c322dc34f
Коммит 23bfc9750b
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
2 изменённых файлов: 81 добавлений и 25 удалений

Просмотреть файл

@ -513,30 +513,33 @@ public class GradleBuildServerBuildSupport implements IBuildSupport {
javaProject.setOption(JavaCore.COMPILER_COMPLIANCE, targetCompatibility);
}
String highestJavaVersion = getHighestCompatibleJavaVersion(jvmBuildTarget.getGradleVersion());
try {
IVMInstall vm = EclipseVmUtil.findOrRegisterStandardVM(
targetCompatibility, // expectedVersion
sourceCompatibility, // lowestVersion
highestJavaVersion,
new File(new URI(jvmBuildTarget.getJavaHome())) // fallback jdk
);
if (StringUtils.isNotBlank(jvmBuildTarget.getJavaHome())
&& StringUtils.isNotBlank(jvmBuildTarget.getGradleVersion())) {
String highestJavaVersion = getHighestCompatibleJavaVersion(jvmBuildTarget.getGradleVersion());
try {
IVMInstall vm = EclipseVmUtil.findOrRegisterStandardVM(
targetCompatibility, // expectedVersion
sourceCompatibility, // lowestVersion
highestJavaVersion,
new File(new URI(jvmBuildTarget.getJavaHome())) // fallback jdk
);
List<IClasspathAttribute> classpathAttributes = new LinkedList<>();
if (isModular) {
classpathAttributes.add(modularAttribute);
List<IClasspathAttribute> 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 @@ public class GradleBuildServerBuildSupport implements IBuildSupport {
}
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 @@ public class GradleBuildServerBuildSupport implements IBuildSupport {
}
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)) {

Просмотреть файл

@ -2,14 +2,21 @@ package com.microsoft.gradle.bs.importer;
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.SubMonitor;
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 class Utils {
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;
}
}