Skip to content

fix: gradle-tooling-api downloaded from Maven repository #28

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,10 @@
<version.gradle.7>${version.gradle.7}</version.gradle.7>
<version.groovy>${version.groovy}</version.groovy>
</properties>
<scriptVariables>
<projectBuildDirectory>${project.build.directory}</projectBuildDirectory>
<versionGradle8>${version.gradle.8}</versionGradle8>
</scriptVariables>
</configuration>
</plugin>
</plugins>
Expand Down
1 change: 1 addition & 0 deletions src/it/gradle-tooling-api/invoker.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
invoker.goals.1=verify
37 changes: 37 additions & 0 deletions src/it/gradle-tooling-api/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.marcnuri.plugins.it</groupId>
<artifactId>no-action</artifactId>
<version>0.1-SNAPSHOT</version>
<name>Maven Integration Test :: Gradle API :: Gradle Tooling API</name>

<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>${version.groovy}</version>
<type>pom</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.gradle</groupId>
<artifactId>gradle-all</artifactId>
<version>${version.gradle.8}</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>com.marcnuri.plugins</groupId>
<artifactId>gradle-api-maven-plugin</artifactId>
<version>@project.version@</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
</project>
18 changes: 18 additions & 0 deletions src/it/gradle-tooling-api/verify.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import java.util.jar.JarFile

def gradleToolingApiJar = new File(projectBuildDirectory,
"local-repo/org/gradle/gradle-tooling-api/${versionGradle8}/gradle-tooling-api-${versionGradle8}.jar")
assert gradleToolingApiJar.exists()
def jar = new JarFile(gradleToolingApiJar)
def containsManifest = false
def containsGradleApi = false
jar.entries().each {
if (it.name == 'META-INF/MANIFEST.MF') {
containsManifest = true
}
if (it.name.startsWith('org/gradle/api/')) {
containsGradleApi = true
}
}
assert containsManifest
assert containsGradleApi
1 change: 1 addition & 0 deletions src/it/maven.settings.https-auth-proxy/verify.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ new FileWriter(new File(basedir, 'access.log')).withWriter { it << logOut }
assert logOut.toString().contains('CONNECT services.gradle.org:443')
def buildLog = new File(basedir, 'build.log').text
assert buildLog.contains('Gradle 8.2.1 download complete')
assert buildLog.contains('Gradle Tooling API 8.2.1 download complete')
1 change: 1 addition & 0 deletions src/it/system.properties.https-auth-proxy/verify.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ new FileWriter(new File(basedir, 'access.log')).withWriter { it << logOut }
assert logOut.toString().contains('CONNECT services.gradle.org:443')
def buildLog = new File(basedir, 'build.log').text
assert buildLog.contains('Gradle 8.2.1 download complete')
assert buildLog.contains('Gradle Tooling API 8.2.1 download complete')
1 change: 1 addition & 0 deletions src/it/system.properties.https-proxy/verify.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ new FileWriter(new File(basedir, 'access.log')).withWriter { it << logOut }
assert logOut.toString().contains('CONNECT services.gradle.org:443')
def buildLog = new File(basedir, 'build.log').text
assert buildLog.contains('Gradle 8.2.1 download complete')
assert buildLog.contains('Gradle Tooling API 8.2.1 download complete')
55 changes: 43 additions & 12 deletions src/main/java/com/marcnuri/plugins/gradle/api/GradleApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ public class GradleApi implements Callable<Collection<String>> {

static final String GRADLE_GROUP_ID = "org.gradle";
static final String GRADLE_ALL_ARTIFACT_ID = "gradle-all";
static final String GRADLE_TOOLING_API_ARTIFACT_ID = "gradle-tooling-api";
static final String GRADLE_DISTRIBUTION_BASE_URL = "https://services.gradle.org/distributions/";
static final String GRADLE_LIB_RELEASES_BASE_URL = "https://repo.gradle.org/artifactory/libs-releases/";
private final GradleApiLog log;
private final Proxy proxy;
private final boolean forceUpdate;
Expand All @@ -45,32 +47,46 @@ public GradleApi(GradleApiLog log, Proxy proxy, boolean forceUpdate, String grad
@Override
public final Collection<String> call() {
if (forceUpdate || !gradleBinZip.toFile().exists()) {
download();
downloadDistribution();
downloadGradleToolingApi();
}
return extract();
}

private void download() {
private void downloadDistribution() {
log.info("Downloading Gradle " + gradleVersion + "...");
try {
final URL remoteBin = new URL(GRADLE_DISTRIBUTION_BASE_URL + gradleBinZip.toFile().getName());
// Connection
final InputStream stream;
if (proxy == null) {
stream = remoteBin.openStream();
} else {
log.info("Using proxy");
stream = remoteBin.openConnection(proxy).getInputStream();
}
Files.createDirectories(resolveGroupDir());
writeToFile(stream, gradleBinZip);
final InputStream gradleBinStream = streamUrl(GRADLE_DISTRIBUTION_BASE_URL + gradleBinZip.toFile().getName());
writeToFile(gradleBinStream, gradleBinZip);
writePom(GRADLE_ALL_ARTIFACT_ID, "pom");
log.info("Gradle " + gradleVersion + " download complete");
} catch (IOException e) {
throw new IllegalStateException("Couldn't download Gradle " + gradleVersion, e);
}
}

/*
* Gradle tooling api artifact needs to be downloaded from the Maven repository.
* This artifact is published by Gradle to https://repo.gradle.org/ui/native/libs-releases/
* The published artifact is different from that included in the Gradle official distribution.
* It's published to Maven to add support for IDEs and other tools to interact with Gradle,
* and includes additional classes that are not included in the Gradle distribution.
* (org.gradle.wrapper, org.gradle.internal, org.gradle.api, and more)
*/
private void downloadGradleToolingApi() {
log.info("Downloading Gradle Tooling API " + gradleVersion + "...");
try {
final InputStream gradleToolingApi = streamUrl(GRADLE_LIB_RELEASES_BASE_URL +"org/gradle/gradle-tooling-api/" +
gradleVersion + "/" + GRADLE_TOOLING_API_ARTIFACT_ID + "-" + gradleVersion + ".jar");
writeToFile(gradleToolingApi, resolveArtifactJar(GRADLE_TOOLING_API_ARTIFACT_ID));
writePom(GRADLE_TOOLING_API_ARTIFACT_ID, "jar");
log.info("Gradle Tooling API " + gradleVersion + " download complete");
} catch (IOException e) {
throw new IllegalStateException("Couldn't download Gradle Tooling API " + gradleVersion, e);
}
}

private Set<String> extract() {
log.info("Extracting Gradle " + gradleVersion + " to local Maven repository...");
final Set<String> artifactIds = new HashSet<>();
Expand All @@ -80,6 +96,8 @@ private Set<String> extract() {
final Set<ZipEntry> applicableEntries = zipFile.stream()
.filter(e -> e.getName().indexOf("gradle-", e.getName().lastIndexOf('/') + 1) >= 0)
.filter(e -> e.getName().endsWith("-" + gradleVersion + ".jar"))
// Gradle Tooling API requires special treatment
.filter(e -> !e.getName().endsWith("gradle-tooling-api-" + gradleVersion + ".jar"))
.collect(Collectors.toSet());
for (ZipEntry entry : applicableEntries) {
final String artifactJar = entry.getName().substring(entry.getName().lastIndexOf('/') + 1);
Expand Down Expand Up @@ -110,6 +128,19 @@ private Path resolveGroupDir() {
return repositoryBaseDir.resolve("org").resolve("gradle");
}

private InputStream streamUrl(String url) throws IOException {
final URL remoteBin = new URL(url);
// Connection
final InputStream stream;
if (proxy == null) {
stream = remoteBin.openStream();
} else {
log.info("Using proxy");
stream = remoteBin.openConnection(proxy).getInputStream();
}
return stream;
}

private void writePom(String artifact, String packaging) throws IOException {
final Path pom = resolveArtifactDir(artifact).resolve(artifact + "-" + gradleVersion + ".pom");
Files.deleteIfExists(pom);
Expand Down