From b96b0079fd644fb3882f1c6befc1ced7bb834ae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lazar=20Mitrovi=C4=87?= Date: Wed, 15 Jun 2022 01:28:31 +0200 Subject: [PATCH] Add Gradle rich output support, configure default metadata URL on Maven Rename JVM reachability metadata -> GraalVM reachability metadata --- ...raalVMReachabilityMetadataRepository.java} | 2 +- .../internal/FileSystemRepository.java | 4 ++-- .../buildtools/utils/SharedConstants.java | 4 ++++ docs/src/docs/asciidoc/maven-plugin.adoc | 2 +- .../docs/snippets/gradle/groovy/build.gradle | 1 + .../snippets/gradle/kotlin/build.gradle.kts | 1 + .../NativeConfigRepoFunctionalTest.groovy | 8 +++---- .../buildtools/gradle/NativeImagePlugin.java | 19 ++++++++-------- ...chabilityMetadataRepositoryExtension.java} | 12 +++++----- .../gradle/dsl/NativeImageOptions.java | 8 +++++++ .../internal/BaseNativeImageOptions.java | 13 +++++++++-- ...> GraalVMReachabilityMetadataService.java} | 22 +++++++++---------- .../NativeImageCommandLineProvider.java | 1 + .../MetadataRepositoryFunctionalTest.groovy | 14 ------------ .../buildtools/maven/AbstractNativeMojo.java | 17 ++++++++++---- 15 files changed, 74 insertions(+), 54 deletions(-) rename common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/{JvmReachabilityMetadataRepository.java => GraalVMReachabilityMetadataRepository.java} (98%) rename native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/{JvmReachabilityMetadataRepositoryExtension.java => GraalVMReachabilityMetadataRepositoryExtension.java} (90%) rename native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/{JvmReachabilityMetadataService.java => GraalVMReachabilityMetadataService.java} (89%) diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/JvmReachabilityMetadataRepository.java b/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/GraalVMReachabilityMetadataRepository.java similarity index 98% rename from common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/JvmReachabilityMetadataRepository.java rename to common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/GraalVMReachabilityMetadataRepository.java index 6d10e91ea..74a2432b0 100644 --- a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/JvmReachabilityMetadataRepository.java +++ b/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/GraalVMReachabilityMetadataRepository.java @@ -55,7 +55,7 @@ * and provide overrides for cases where configuration files * are missing. */ -public interface JvmReachabilityMetadataRepository { +public interface GraalVMReachabilityMetadataRepository { /** * Performs a generic query on the repository, returning a list of * configuration directories. The query may be parameterized with diff --git a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/FileSystemRepository.java b/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/FileSystemRepository.java index a9e4c3727..e74b436d5 100644 --- a/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/FileSystemRepository.java +++ b/common/jvm-reachability-metadata/src/main/java/org/graalvm/reachability/internal/FileSystemRepository.java @@ -40,7 +40,7 @@ */ package org.graalvm.reachability.internal; -import org.graalvm.reachability.JvmReachabilityMetadataRepository; +import org.graalvm.reachability.GraalVMReachabilityMetadataRepository; import org.graalvm.reachability.Query; import org.graalvm.reachability.internal.index.artifacts.SingleModuleJsonVersionToConfigDirectoryIndex; import org.graalvm.reachability.internal.index.artifacts.VersionToConfigDirectoryIndex; @@ -55,7 +55,7 @@ import java.util.function.Supplier; import java.util.stream.Collectors; -public class FileSystemRepository implements JvmReachabilityMetadataRepository { +public class FileSystemRepository implements GraalVMReachabilityMetadataRepository { private final FileSystemModuleToConfigDirectoryIndex moduleIndex; private final Logger logger; diff --git a/common/utils/src/main/java/org/graalvm/buildtools/utils/SharedConstants.java b/common/utils/src/main/java/org/graalvm/buildtools/utils/SharedConstants.java index 2911e96f0..11f3d1e48 100644 --- a/common/utils/src/main/java/org/graalvm/buildtools/utils/SharedConstants.java +++ b/common/utils/src/main/java/org/graalvm/buildtools/utils/SharedConstants.java @@ -51,6 +51,9 @@ */ public interface SharedConstants { boolean IS_WINDOWS = System.getProperty("os.name", "unknown").contains("Windows"); + boolean IS_CI = System.getenv("CI") != null; + boolean IS_DUMB_TERM = Arrays.asList(null, "", "dumb", "unknown").contains(System.getenv("TERM")); + boolean NO_COLOR = System.getenv("NO_COLOR") != null; // https://no-color.org/ String GRAALVM_EXE_EXTENSION = (IS_WINDOWS ? ".cmd" : ""); String EXECUTABLE_EXTENSION = (IS_WINDOWS ? ".exe" : ""); String NATIVE_IMAGE_EXE = "native-image" + GRAALVM_EXE_EXTENSION; @@ -72,4 +75,5 @@ public interface SharedConstants { String AGENT_SESSION_SUBDIR = "session-{pid}-{datetime}"; String AGENT_OUTPUT_DIRECTORY_MARKER = "{output_dir}"; String AGENT_OUTPUT_DIRECTORY_OPTION = "config-output-dir="; + String METADATA_REPO_URL_TEMPLATE = "https://github.com/graalvm/graalvm-reachability-metadata/releases/download/%1$s/graalvm-reachability-metadata-%1$s.zip"; } diff --git a/docs/src/docs/asciidoc/maven-plugin.adoc b/docs/src/docs/asciidoc/maven-plugin.adoc index 293eb91ca..d433db118 100644 --- a/docs/src/docs/asciidoc/maven-plugin.adoc +++ b/docs/src/docs/asciidoc/maven-plugin.adoc @@ -615,7 +615,7 @@ automatically added to your native build options. [[metadata-support]] == GraalVM Reachability Metadata Support -Since release 0.9.12, the plugin adds experimental support for the https://github.com/graalvm/jvm-reachability-metadata/[JVM reachability metadata repository]. +Since release 0.9.12, the plugin adds experimental support for the https://github.com/graalvm/graalvm-reachability-metadata/[GraalVM reachability metadata repository]. This repository provides GraalVM metadata for libraries which do not officially support GraalVM native. A metadata repository consists of configuration files for GraalVM. diff --git a/docs/src/docs/snippets/gradle/groovy/build.gradle b/docs/src/docs/snippets/gradle/groovy/build.gradle index e1e1a37bc..fd385b6c9 100644 --- a/docs/src/docs/snippets/gradle/groovy/build.gradle +++ b/docs/src/docs/snippets/gradle/groovy/build.gradle @@ -120,6 +120,7 @@ graalvmNative { fallback = true // Sets the fallback mode of native-image, defaults to false sharedLibrary = false // Determines if image is a shared library, defaults to false if `java-library` plugin isn't included quickBuild = false // Determines if image is being built in quick build mode (alternatively use GRAALVM_QUICK_BUILD environment variable) + richOutput = false // Determines if native-image building should be done with rich output systemProperties = [name1: 'value1', name2: 'value2'] // Sets the system properties to use for the native image builder configurationFileDirectories.from(file('src/my-config')) // Adds a native image configuration file directory, containing files like reflection configuration diff --git a/docs/src/docs/snippets/gradle/kotlin/build.gradle.kts b/docs/src/docs/snippets/gradle/kotlin/build.gradle.kts index e3c7e5ce9..b0ff46706 100644 --- a/docs/src/docs/snippets/gradle/kotlin/build.gradle.kts +++ b/docs/src/docs/snippets/gradle/kotlin/build.gradle.kts @@ -78,6 +78,7 @@ graalvmNative { fallback.set(true) // Sets the fallback mode of native-image, defaults to false sharedLibrary.set(false) // Determines if image is a shared library, defaults to false if `java-library` plugin isn't included quickBuild.set(false) // Determines if image is being built in quick build mode (alternatively use GRAALVM_QUICK_BUILD environment variable) + richOutput.set(false) // Determines if native-image building should be done with rich output systemProperties.putAll(mapOf("name1" to "value1", "name2" to "value2")) // Sets the system properties to use for the native image builder configurationFileDirectories.from(file("src/my-config")) // Adds a native image configuration file directory, containing files like reflection configuration diff --git a/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/NativeConfigRepoFunctionalTest.groovy b/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/NativeConfigRepoFunctionalTest.groovy index ef1b0af0e..043e5ad37 100644 --- a/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/NativeConfigRepoFunctionalTest.groovy +++ b/native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/NativeConfigRepoFunctionalTest.groovy @@ -75,10 +75,10 @@ class NativeConfigRepoFunctionalTest extends AbstractFunctionalTest { outputContains "Hello, from reflection!" and: "doesn't find a configuration directory for the current version" - outputContains "[jvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory not found. Trying latest version." + outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory not found. Trying latest version." and: "but finds one thanks to the latest configuration field" - outputContains "[jvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory is org/graalvm/internal/library-with-reflection/1" + outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory is org/graalvm/internal/library-with-reflection/1" where: format | label @@ -112,7 +112,7 @@ graalvmNative { outputContains "Reflection failed" and: "doesn't look for a configuration directory for the current version" - outputDoesNotContain "[jvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory not found. Trying latest version." + outputDoesNotContain "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration directory not found. Trying latest version." } def "can force a dependency to a specific config version"() { @@ -139,7 +139,7 @@ graalvmNative { outputContains "Reflection failed" and: "looks for specific configuration version" - outputContains "[jvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration is forced to version 2" + outputContains "[graalvm reachability metadata repository for org.graalvm.internal:library-with-reflection:1.5]: Configuration is forced to version 2" } } diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java index d9cb26419..f7dc15a66 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java @@ -45,7 +45,7 @@ import org.graalvm.buildtools.agent.AgentConfiguration; import org.graalvm.buildtools.agent.AgentMode; import org.graalvm.buildtools.gradle.dsl.GraalVMExtension; -import org.graalvm.buildtools.gradle.dsl.JvmReachabilityMetadataRepositoryExtension; +import org.graalvm.buildtools.gradle.dsl.GraalVMReachabilityMetadataRepositoryExtension; import org.graalvm.buildtools.gradle.dsl.NativeImageOptions; import org.graalvm.buildtools.gradle.dsl.agent.AgentOptions; import org.graalvm.buildtools.gradle.internal.AgentCommandLineProvider; @@ -55,7 +55,7 @@ import org.graalvm.buildtools.gradle.internal.DeprecatedNativeImageOptions; import org.graalvm.buildtools.gradle.internal.GraalVMLogger; import org.graalvm.buildtools.gradle.internal.GradleUtils; -import org.graalvm.buildtools.gradle.internal.JvmReachabilityMetadataService; +import org.graalvm.buildtools.gradle.internal.GraalVMReachabilityMetadataService; import org.graalvm.buildtools.gradle.internal.NativeConfigurations; import org.graalvm.buildtools.gradle.internal.agent.AgentConfigurationFactory; import org.graalvm.buildtools.gradle.tasks.BuildNativeImageTask; @@ -129,6 +129,7 @@ import static org.graalvm.buildtools.gradle.internal.NativeImageExecutableLocator.graalvmHomeProvider; import static org.graalvm.buildtools.utils.SharedConstants.AGENT_PROPERTY; import static org.graalvm.buildtools.utils.SharedConstants.IS_WINDOWS; +import static org.graalvm.buildtools.utils.SharedConstants.METADATA_REPO_URL_TEMPLATE; /** * Gradle plugin for GraalVM Native Image. @@ -307,10 +308,10 @@ private void configureAutomaticTaskCreation(Project project, } private void configureJvmReachabilityConfigurationDirectories(Project project, GraalVMExtension graalExtension, NativeImageOptions options, SourceSet sourceSet) { - JvmReachabilityMetadataRepositoryExtension repositoryExtension = reachabilityExtensionOn(graalExtension); - Provider serviceProvider = project.getGradle() + GraalVMReachabilityMetadataRepositoryExtension repositoryExtension = reachabilityExtensionOn(graalExtension); + Provider serviceProvider = project.getGradle() .getSharedServices() - .registerIfAbsent("nativeConfigurationService", JvmReachabilityMetadataService.class, spec -> { + .registerIfAbsent("nativeConfigurationService", GraalVMReachabilityMetadataService.class, spec -> { LogLevel logLevel = determineLogLevel(); spec.getParameters().getLogLevel().set(logLevel); spec.getParameters().getUri().set(repositoryExtension.getUri()); @@ -353,8 +354,8 @@ private static LogLevel determineLogLevel() { return logLevel; } - private static JvmReachabilityMetadataRepositoryExtension reachabilityExtensionOn(GraalVMExtension graalExtension) { - return ((ExtensionAware) graalExtension).getExtensions().getByType(JvmReachabilityMetadataRepositoryExtension.class); + private static GraalVMReachabilityMetadataRepositoryExtension reachabilityExtensionOn(GraalVMExtension graalExtension) { + return ((ExtensionAware) graalExtension).getExtensions().getByType(GraalVMReachabilityMetadataRepositoryExtension.class); } private void deprecateExtension(Project project, @@ -419,11 +420,11 @@ private GraalVMExtension registerGraalVMExtension(Project project) { } private void configureNativeConfigurationRepo(ExtensionAware graalvmNative) { - JvmReachabilityMetadataRepositoryExtension configurationRepository = graalvmNative.getExtensions().create("metadataRepository", JvmReachabilityMetadataRepositoryExtension.class); + GraalVMReachabilityMetadataRepositoryExtension configurationRepository = graalvmNative.getExtensions().create("metadataRepository", GraalVMReachabilityMetadataRepositoryExtension.class); configurationRepository.getEnabled().convention(false); configurationRepository.getUri().convention(configurationRepository.getVersion().map(v -> { try { - return new URI("https://github.com/graalvm/graalvm-reachability-metadata/releases/download/" + v + "/graalvm-reachability-metadata-" + v + ".zip"); + return new URI(String.format(METADATA_REPO_URL_TEMPLATE, v)); } catch (URISyntaxException e) { return null; } diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/JvmReachabilityMetadataRepositoryExtension.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/GraalVMReachabilityMetadataRepositoryExtension.java similarity index 90% rename from native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/JvmReachabilityMetadataRepositoryExtension.java rename to native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/GraalVMReachabilityMetadataRepositoryExtension.java index 181b693fc..89d12dcc1 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/JvmReachabilityMetadataRepositoryExtension.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/GraalVMReachabilityMetadataRepositoryExtension.java @@ -49,18 +49,18 @@ import java.net.URISyntaxException; /** - * Extension used to configure the JVM reachability metadata repository. + * Extension used to configure the GraalVM reachability metadata repository. */ -public interface JvmReachabilityMetadataRepositoryExtension { +public interface GraalVMReachabilityMetadataRepositoryExtension { /** - * Property used to determine if the native configuration + * Property used to determine if the reachability metadata * repository should be used. * @return the enabled property */ Property getEnabled(); /** - * A URI pointing to a jvm reachability metadata repository. This must + * A URI pointing to a GraalVM reachability metadata repository. This must * either be a local file or a remote URI. In case of remote * files, only zip or tarballs are supported. * @return the uri property @@ -70,8 +70,8 @@ public interface JvmReachabilityMetadataRepositoryExtension { /** * An optional version of the remote repository: if specified, * and that no URI is provided, it will automatically use a - * published repository from the official GraalVM configuration - * repository. + * published repository from the official GraalVM reachability + * metadata repository. * * @return the version of the repository to use */ diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/NativeImageOptions.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/NativeImageOptions.java index d026e3aba..797473bc5 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/NativeImageOptions.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/NativeImageOptions.java @@ -171,6 +171,14 @@ public interface NativeImageOptions extends Named { @Input Property getQuickBuild(); + /** + * Gets the value which determines if image is being built with rich output. + * + * @return The value which determines if image is being built with rich output. + */ + @Input + Property getRichOutput(); + /** * Returns the toolchain used to invoke native-image. Currently pointing * to a Java launcher due to Gradle limitations. diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/BaseNativeImageOptions.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/BaseNativeImageOptions.java index 500db57d9..23bb3c9c9 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/BaseNativeImageOptions.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/BaseNativeImageOptions.java @@ -44,6 +44,7 @@ import org.graalvm.buildtools.gradle.dsl.NativeImageOptions; import org.graalvm.buildtools.gradle.dsl.NativeResourcesOptions; import org.graalvm.buildtools.gradle.dsl.agent.DeprecatedAgentOptions; +import org.graalvm.buildtools.utils.SharedConstants; import org.gradle.api.Action; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.model.ObjectFactory; @@ -186,6 +187,14 @@ public String getName() { @Input public abstract Property getQuickBuild(); + /** + * Gets the value which determines if image is being built with rich output. + * + * @return The value which determines if image is being built with rich output. + */ + @Input + public abstract Property getRichOutput(); + /** * Returns the toolchain used to invoke native-image. Currently, pointing * to a Java launcher due to Gradle limitations. @@ -195,7 +204,7 @@ public String getName() { public abstract Property getJavaLauncher(); /** - * Returns the list of configuration file directories (e.g resource-config.json, ...) which need + * Returns the list of configuration file directories (e.g. resource-config.json, ...) which need * to be passed to native-image. * * @return a collection of directories @@ -232,6 +241,7 @@ public BaseNativeImageOptions(String name, getFallback().convention(false); getVerbose().convention(false); getQuickBuild().convention(false); + getRichOutput().convention(!SharedConstants.IS_CI && !SharedConstants.IS_WINDOWS && !SharedConstants.IS_DUMB_TERM && !SharedConstants.NO_COLOR); getSharedLibrary().convention(false); getImageName().convention(defaultImageName); getUseFatJar().convention(false); @@ -239,7 +249,6 @@ public BaseNativeImageOptions(String name, private static Provider property(ProviderFactory providers, String name) { return providers.gradleProperty(name) - .forUseAtConfigurationTime() .map(Boolean::valueOf) .orElse(false); } diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/JvmReachabilityMetadataService.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/GraalVMReachabilityMetadataService.java similarity index 89% rename from native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/JvmReachabilityMetadataService.java rename to native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/GraalVMReachabilityMetadataService.java index bc91f5759..f2335e2d4 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/JvmReachabilityMetadataService.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/GraalVMReachabilityMetadataService.java @@ -40,7 +40,7 @@ */ package org.graalvm.buildtools.gradle.internal; -import org.graalvm.reachability.JvmReachabilityMetadataRepository; +import org.graalvm.reachability.GraalVMReachabilityMetadataRepository; import org.graalvm.reachability.Query; import org.graalvm.reachability.internal.FileSystemRepository; import org.gradle.api.file.ArchiveOperations; @@ -57,12 +57,12 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.net.URI; import java.net.URISyntaxException; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.security.MessageDigest; @@ -72,10 +72,10 @@ import java.util.function.Consumer; import java.util.function.Supplier; -public abstract class JvmReachabilityMetadataService implements BuildService, JvmReachabilityMetadataRepository { - private static final Logger LOGGER = Logging.getLogger(JvmReachabilityMetadataService.class); +public abstract class GraalVMReachabilityMetadataService implements BuildService, GraalVMReachabilityMetadataRepository { + private static final Logger LOGGER = Logging.getLogger(GraalVMReachabilityMetadataService.class); - private final JvmReachabilityMetadataRepository repository; + private final GraalVMReachabilityMetadataRepository repository; @Inject protected abstract ArchiveOperations getArchiveOperations(); @@ -91,7 +91,7 @@ public interface Params extends BuildServiceParameters { DirectoryProperty getCacheDir(); } - public JvmReachabilityMetadataService() throws URISyntaxException { + public GraalVMReachabilityMetadataService() throws URISyntaxException { URI uri = getParameters().getUri().get(); this.repository = newRepository(uri); } @@ -99,19 +99,19 @@ public JvmReachabilityMetadataService() throws URISyntaxException { private static String hashFor(URI uri) { try { MessageDigest md = MessageDigest.getInstance("SHA-1"); - byte[] messageDigest = md.digest(md.digest(uri.toString().getBytes("utf-8"))); + byte[] messageDigest = md.digest(md.digest(uri.toString().getBytes(StandardCharsets.UTF_8))); BigInteger no = new BigInteger(1, messageDigest); StringBuilder digest = new StringBuilder(no.toString(16)); while (digest.length() < 32) { digest.insert(0, "0"); } return digest.toString(); - } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { + } catch (NoSuchAlgorithmException e) { throw new UnsupportedOperationException(e); } } - private JvmReachabilityMetadataRepository newRepository(URI uri) throws URISyntaxException { + private GraalVMReachabilityMetadataRepository newRepository(URI uri) throws URISyntaxException { String cacheKey = hashFor(uri); String path = uri.getPath(); LogLevel logLevel = getParameters().getLogLevel().get(); @@ -163,11 +163,11 @@ private FileSystemRepository newRepositoryFromDirectory(Path path, LogLevel logL return new FileSystemRepository(path, new FileSystemRepository.Logger() { @Override public void log(String groupId, String artifactId, String version, Supplier message) { - LOGGER.log(logLevel, "[jvm reachability metadata repository for {}:{}:{}]: {}", groupId, artifactId, version, message.get()); + LOGGER.log(logLevel, "[graalvm reachability metadata repository for {}:{}:{}]: {}", groupId, artifactId, version, message.get()); } }); } else { - throw new IllegalArgumentException("JVM reachability metadata repository URI must point to a directory"); + throw new IllegalArgumentException("GraalVM reachability metadata repository URI must point to a directory"); } } diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/NativeImageCommandLineProvider.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/NativeImageCommandLineProvider.java index 6012345bb..ea65f21b4 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/NativeImageCommandLineProvider.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/NativeImageCommandLineProvider.java @@ -112,6 +112,7 @@ public List asArguments() { appendBooleanOption(cliArgs, options.getVerbose(), "--verbose"); appendBooleanOption(cliArgs, options.getSharedLibrary(), "--shared"); appendBooleanOption(cliArgs, options.getQuickBuild(), "-Ob"); + appendBooleanOption(cliArgs, options.getRichOutput(), "-H:+BuildOutputColorful"); if (getOutputDirectory().isPresent()) { cliArgs.add("-H:Path=" + getOutputDirectory().get()); diff --git a/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/MetadataRepositoryFunctionalTest.groovy b/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/MetadataRepositoryFunctionalTest.groovy index 42695b9b4..0f72f9c0f 100644 --- a/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/MetadataRepositoryFunctionalTest.groovy +++ b/native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/MetadataRepositoryFunctionalTest.groovy @@ -68,20 +68,6 @@ class MetadataRepositoryFunctionalTest extends AbstractGraalVMMavenFunctionalTes outputContains "Reflection failed" } - void "it produces a warning if repository version is defined"() { - given: - withSample("native-config-integration") - - when: - mvn '-Pnative,metadataVersion', '-DskipTests', 'package', 'exec:exec@native' - - then: - buildSucceeded - outputContains "The official GraalVM reachability metadata repository is not released yet. Only local repositories are supported" - outputContains "GraalVM reachability metadata repository is enabled, but no repository has been configured" - outputContains "Reflection failed" - } - void "it can use a metadata repository"() { given: withSample("native-config-integration") diff --git a/native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/AbstractNativeMojo.java b/native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/AbstractNativeMojo.java index 045e85285..1d35589a5 100644 --- a/native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/AbstractNativeMojo.java +++ b/native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/AbstractNativeMojo.java @@ -58,13 +58,15 @@ import org.graalvm.buildtools.utils.FileUtils; import org.graalvm.buildtools.utils.NativeImageUtils; import org.graalvm.buildtools.utils.SharedConstants; -import org.graalvm.reachability.JvmReachabilityMetadataRepository; +import org.graalvm.reachability.GraalVMReachabilityMetadataRepository; import org.graalvm.reachability.internal.FileSystemRepository; import javax.inject.Inject; import java.io.File; import java.io.IOException; +import java.net.MalformedURLException; import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.nio.file.FileSystem; import java.nio.file.FileSystems; @@ -83,6 +85,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import static org.graalvm.buildtools.utils.SharedConstants.METADATA_REPO_URL_TEMPLATE; + /** * @author Sebastien Deleuze */ @@ -177,7 +181,7 @@ public abstract class AbstractNativeMojo extends AbstractMojo { @Parameter(property = NATIVE_IMAGE_DRY_RUN, defaultValue = "false") protected boolean dryRun; - protected JvmReachabilityMetadataRepository metadataRepository; + protected GraalVMReachabilityMetadataRepository metadataRepository; @Component protected Logger logger; @@ -442,8 +446,13 @@ protected boolean isMetadataRepositoryEnabled() { protected void configureMetadataRepository() { if (isMetadataRepositoryEnabled()) { Path repoPath = null; - if (metadataRepositoryConfiguration.getVersion() != null) { - logger.warn("The official GraalVM reachability metadata repository is not released yet. Only local repositories are supported"); + if (metadataRepositoryConfiguration.getVersion() != null && metadataRepositoryConfiguration.getUrl() == null) { + String metadataUrl = String.format(METADATA_REPO_URL_TEMPLATE, metadataRepositoryConfiguration.getVersion()); + try { + metadataRepositoryConfiguration.setUrl(new URI(metadataUrl).toURL()); + } catch (URISyntaxException | MalformedURLException e) { + throw new RuntimeException(e); + } } if (metadataRepositoryConfiguration.getLocalPath() != null) { Path localPath = metadataRepositoryConfiguration.getLocalPath().toPath();