JdkDownloadPlugin.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*
  2. * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
  3. * or more contributor license agreements. Licensed under the Elastic License
  4. * 2.0 and the Server Side Public License, v 1; you may not use this file except
  5. * in compliance with, at your election, the Elastic License 2.0 or the Server
  6. * Side Public License, v 1.
  7. */
  8. package org.elasticsearch.gradle.internal;
  9. import org.elasticsearch.gradle.transform.SymbolicLinkPreservingUntarTransform;
  10. import org.elasticsearch.gradle.transform.UnzipTransform;
  11. import org.gradle.api.GradleException;
  12. import org.gradle.api.NamedDomainObjectContainer;
  13. import org.gradle.api.Plugin;
  14. import org.gradle.api.Project;
  15. import org.gradle.api.artifacts.Configuration;
  16. import org.gradle.api.artifacts.dsl.RepositoryHandler;
  17. import org.gradle.api.artifacts.repositories.IvyArtifactRepository;
  18. import org.gradle.api.artifacts.type.ArtifactTypeDefinition;
  19. import org.gradle.api.attributes.Attribute;
  20. import java.util.Arrays;
  21. /**
  22. * @deprecated We wanna get rid from this and custom jdk downloads via this plugin and
  23. * make leverage the gradle toolchain resolver capabilities.
  24. *
  25. * @See @org.elasticsearch.gradle.internal.toolchain.JavaToolChainResolverPlugin
  26. * */
  27. @Deprecated
  28. public class JdkDownloadPlugin implements Plugin<Project> {
  29. public static final String VENDOR_ADOPTIUM = "adoptium";
  30. public static final String VENDOR_OPENJDK = "openjdk";
  31. public static final String VENDOR_ZULU = "zulu";
  32. private static final String REPO_NAME_PREFIX = "jdk_repo_";
  33. private static final String EXTENSION_NAME = "jdks";
  34. public static final String JDK_TRIMMED_PREFIX = "(jdk-?\\d.*)|(zulu-?\\d.+).jdk";
  35. public static final String ZULU_LINUX_AARCH_PATTERN = "zulu.*linux_aarch64";
  36. @Override
  37. public void apply(Project project) {
  38. Attribute<Boolean> jdkAttribute = Attribute.of("jdk", Boolean.class);
  39. project.getDependencies().getAttributesSchema().attribute(jdkAttribute);
  40. project.getDependencies().getArtifactTypes().maybeCreate(ArtifactTypeDefinition.ZIP_TYPE);
  41. project.getDependencies().registerTransform(UnzipTransform.class, transformSpec -> {
  42. transformSpec.getFrom()
  43. .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.ZIP_TYPE)
  44. .attribute(jdkAttribute, true);
  45. transformSpec.getTo()
  46. .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.DIRECTORY_TYPE)
  47. .attribute(jdkAttribute, true);
  48. transformSpec.parameters(parameters -> parameters.setTrimmedPrefixPattern(JDK_TRIMMED_PREFIX));
  49. });
  50. ArtifactTypeDefinition tarArtifactTypeDefinition = project.getDependencies().getArtifactTypes().maybeCreate("tar.gz");
  51. project.getDependencies().registerTransform(SymbolicLinkPreservingUntarTransform.class, transformSpec -> {
  52. transformSpec.getFrom()
  53. .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, tarArtifactTypeDefinition.getName())
  54. .attribute(jdkAttribute, true);
  55. transformSpec.getTo()
  56. .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.DIRECTORY_TYPE)
  57. .attribute(jdkAttribute, true);
  58. transformSpec.parameters(parameters -> {
  59. parameters.setTrimmedPrefixPattern(JDK_TRIMMED_PREFIX);
  60. parameters.setKeepStructureFor(Arrays.asList(ZULU_LINUX_AARCH_PATTERN));
  61. });
  62. });
  63. NamedDomainObjectContainer<Jdk> jdksContainer = project.container(Jdk.class, name -> {
  64. Configuration configuration = project.getConfigurations().create("jdk_" + name);
  65. configuration.setCanBeConsumed(false);
  66. configuration.getAttributes().attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.DIRECTORY_TYPE);
  67. configuration.getAttributes().attribute(jdkAttribute, true);
  68. Jdk jdk = new Jdk(name, configuration, project.getObjects());
  69. configuration.defaultDependencies(dependencies -> {
  70. jdk.finalizeValues();
  71. setupRepository(project, jdk);
  72. dependencies.add(project.getDependencies().create(dependencyNotation(jdk)));
  73. });
  74. return jdk;
  75. });
  76. project.getExtensions().add(EXTENSION_NAME, jdksContainer);
  77. }
  78. private void setupRepository(Project project, Jdk jdk) {
  79. RepositoryHandler repositories = project.getRepositories();
  80. /*
  81. * Define the appropriate repository for the given JDK vendor and version
  82. *
  83. * For Oracle/OpenJDK/Adoptium we define a repository per-version.
  84. */
  85. String repoName = REPO_NAME_PREFIX + jdk.getVendor() + "_" + jdk.getVersion();
  86. String repoUrl;
  87. String artifactPattern;
  88. if (jdk.getVendor().equals(VENDOR_ADOPTIUM)) {
  89. repoUrl = "https://api.adoptium.net/v3/binary/version/";
  90. if (jdk.getMajor().equals("8")) {
  91. // legacy pattern for JDK 8
  92. artifactPattern = "jdk"
  93. + jdk.getBaseVersion()
  94. + "-"
  95. + jdk.getBuild()
  96. + "/[module]/[classifier]/jdk/hotspot/normal/adoptium";
  97. } else {
  98. // current pattern since JDK 9
  99. artifactPattern = "jdk-"
  100. + jdk.getBaseVersion()
  101. + "+"
  102. + jdk.getBuild()
  103. + "/[module]/[classifier]/jdk/hotspot/normal/adoptium";
  104. }
  105. } else if (jdk.getVendor().equals(VENDOR_OPENJDK)) {
  106. repoUrl = "https://download.oracle.com";
  107. if (jdk.getHash() != null) {
  108. // current pattern since 12.0.1
  109. artifactPattern = "java/GA/jdk"
  110. + jdk.getBaseVersion()
  111. + "/"
  112. + jdk.getHash()
  113. + "/"
  114. + jdk.getBuild()
  115. + "/GPL/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
  116. } else {
  117. // simpler legacy pattern from JDK 9 to JDK 12 that we are advocating to Oracle to bring back
  118. artifactPattern = "java/GA/jdk"
  119. + jdk.getMajor()
  120. + "/"
  121. + jdk.getBuild()
  122. + "/GPL/openjdk-[revision]_[module]-[classifier]_bin.[ext]";
  123. }
  124. } else if (jdk.getVendor().equals(VENDOR_ZULU)) {
  125. repoUrl = "https://cdn.azul.com";
  126. if (jdk.getMajor().equals("8") && isJdkOnMacOsPlatform(jdk) && jdk.getArchitecture().equals("aarch64")) {
  127. artifactPattern = "zulu/bin/zulu"
  128. + jdk.getDistributionVersion()
  129. + "-ca-jdk"
  130. + jdk.getBaseVersion().replace("u", ".0.")
  131. + "-[module]x_[classifier].[ext]";
  132. } else {
  133. throw new GradleException("JDK vendor zulu is supported only for JDK8 on MacOS with Apple Silicon.");
  134. }
  135. } else {
  136. throw new GradleException("Unknown JDK vendor [" + jdk.getVendor() + "]");
  137. }
  138. // Define the repository if we haven't already
  139. if (repositories.findByName(repoName) == null) {
  140. repositories.ivy(repo -> {
  141. repo.setName(repoName);
  142. repo.setUrl(repoUrl);
  143. repo.metadataSources(IvyArtifactRepository.MetadataSources::artifact);
  144. repo.patternLayout(layout -> layout.artifact(artifactPattern));
  145. repo.content(repositoryContentDescriptor -> repositoryContentDescriptor.includeGroup(groupName(jdk)));
  146. });
  147. }
  148. }
  149. @SuppressWarnings("unchecked")
  150. public static NamedDomainObjectContainer<Jdk> getContainer(Project project) {
  151. return (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName(EXTENSION_NAME);
  152. }
  153. private static String dependencyNotation(Jdk jdk) {
  154. String platformDep = isJdkOnMacOsPlatform(jdk) ? (jdk.getVendor().equals(VENDOR_ADOPTIUM) ? "mac" : "macos") : jdk.getPlatform();
  155. String extension = jdk.getPlatform().equals("windows") ? "zip" : "tar.gz";
  156. return groupName(jdk) + ":" + platformDep + ":" + jdk.getBaseVersion() + ":" + jdk.getArchitecture() + "@" + extension;
  157. }
  158. private static boolean isJdkOnMacOsPlatform(Jdk jdk) {
  159. return jdk.getPlatform().equals("darwin") || jdk.getPlatform().equals("mac");
  160. }
  161. private static String groupName(Jdk jdk) {
  162. return jdk.getVendor() + "_" + jdk.getMajor();
  163. }
  164. }