diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 992860958..f683193b8 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1721,9 +1721,9 @@ The `picocli-codegen` module now includes an annotation processor that instantly Use this if you’re interested in: * **Compile time error checking**. The annotation processor shows errors for invalid annotations and attributes immediately when you compile, instead of during testing at runtime, resulting in shorter feedback cycles. -* **Graal native images**. The annotation processor generates and updates [Graal configuration](https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md) files under +* **Graal native images**. The annotation processor generates and updates [Graal configuration](https://github.com/oracle/graal/blob/master/substratevm/Configuration.md) files under `META-INF/native-image/picocli-generated/$project` during compilation, to be included in the application jar. -This includes configuration files for [reflection](https://github.com/oracle/graal/blob/master/substratevm/REFLECTION.md), [resources](https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md) and [dynamic proxies](https://github.com/oracle/graal/blob/master/substratevm/DYNAMIC_PROXY.md). +This includes configuration files for [reflection](https://github.com/oracle/graal/blob/master/substratevm/Reflection.md), [resources](https://github.com/oracle/graal/blob/master/substratevm/Resources.md) and [dynamic proxies](https://github.com/oracle/graal/blob/master/substratevm/DynamicProxy.md). By embedding these configuration files, your jar is instantly Graal-enabled. The `$project` location is configurable, see [processor options](#picocli-processor-options) below. In most cases no further configuration is needed when generating a native image. @@ -2717,7 +2717,7 @@ This release includes the first cut of an annotation processor that can build a Use this if you’re interested in: * **Compile time error checking**. The annotation processor shows errors for invalid annotations and attributes immediately when you compile, instead of during testing at runtime, resulting in shorter feedback cycles. -* **Graal native images**. The annotation processor generates [Graal configuration](https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md) +* **Graal native images**. The annotation processor generates [Graal configuration](https://github.com/oracle/graal/blob/master/substratevm/Configuration.md) files under `META-INF/native-image/picocli-generated/$project` during compilation, to be included in the application jar. By embedding these configuration files, your jar is instantly Graal-enabled. In most cases no further configuration is needed when generating a native image. @@ -2754,9 +2754,9 @@ This release includes the first cut of an annotation processor that can build a Use this if you’re interested in: * **Compile time error checking**. The annotation processor shows errors for invalid annotations and attributes immediately when you compile, instead of during testing at runtime, resulting in shorter feedback cycles. -* **Graal native images**. The annotation processor generates and updates [Graal configuration](https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md) files under +* **Graal native images**. The annotation processor generates and updates [Graal configuration](https://github.com/oracle/graal/blob/master/substratevm/Configuration.md) files under `META-INF/native-image/picocli-generated/$project` during compilation, to be included in the application jar. -This includes configuration files for [reflection](https://github.com/oracle/graal/blob/master/substratevm/REFLECTION.md), [resources](https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md) and [dynamic proxies](https://github.com/oracle/graal/blob/master/substratevm/DYNAMIC_PROXY.md). +This includes configuration files for [reflection](https://github.com/oracle/graal/blob/master/substratevm/Reflection.md), [resources](https://github.com/oracle/graal/blob/master/substratevm/Resources.md) and [dynamic proxies](https://github.com/oracle/graal/blob/master/substratevm/DynamicProxy.md). By embedding these configuration files, your jar is instantly Graal-enabled. The `$project` location is configurable, see [processor options](#picocli-processor-options) below. In most cases no further configuration is needed when generating a native image. @@ -3128,7 +3128,7 @@ The `picocli-codegen` module now has two new tools, in addition to the existing #### ResourceConfigGenerator The GraalVM native-image builder by default will not integrate any of the -[classpath resources](https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md) into the image it creates. +[classpath resources](https://github.com/oracle/graal/blob/master/substratevm/Resources.md) into the image it creates. `ResourceConfigGenerator` generates a JSON String with the resource bundles and other classpath resources that should be included in the Substrate VM native image. @@ -3141,7 +3141,7 @@ This allows picocli-based native image applications to access these resources. #### DynamicProxyConfigGenerator Substrate VM doesn't provide machinery for generating and interpreting bytecodes at run time. Therefore all dynamic proxy classes -[need to be generated](https://github.com/oracle/graal/blob/master/substratevm/DYNAMIC_PROXY.md) at native image build time. +[need to be generated](https://github.com/oracle/graal/blob/master/substratevm/DynamicProxy.md) at native image build time. `DynamicProxyConfigGenerator` generates a JSON String with the fully qualified interface names for which dynamic proxy classes should be generated at native image build time. diff --git a/docs/build-great-native-cli-apps-in-java-with-graalvm-and-picocli.adoc b/docs/build-great-native-cli-apps-in-java-with-graalvm-and-picocli.adoc index 772c581e0..ee805c9f6 100644 --- a/docs/build-great-native-cli-apps-in-java-with-graalvm-and-picocli.adoc +++ b/docs/build-great-native-cli-apps-in-java-with-graalvm-and-picocli.adoc @@ -52,12 +52,12 @@ Substrate VM is the name for the runtime components (like the deoptimizer, garba === Native Image Limitations To keep the implementation small and concise, and also to allow aggressive ahead-of-time optimizations, Native Image does not support all features of Java. -The full set of https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md[limitations] is documented on the GitHub project. +The full set of https://github.com/oracle/graal/blob/master/substratevm/Limitations.md[limitations] is documented on the GitHub project. Two limitations are of particular interest: -* https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md#reflection[reflection] -* https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md[resources] +* https://github.com/oracle/graal/blob/master/substratevm/Limitations.md#reflection[reflection] +* https://github.com/oracle/graal/blob/master/substratevm/Resources.md[resources] Basically, to create a self-contained binary, the native image compiler needs to know up-front all the classes of your application, their dependencies, and the resources they use. Reflection and resource bundles often require configuration. We will see an example of this later on. @@ -195,7 +195,7 @@ Next, let’s take a look at turning it into a native executable. === Reflection Configuration -We mentioned earlier that the native image compiler has some limitations: reflection is supported but https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md[requires configuration]. +We mentioned earlier that the native image compiler has some limitations: reflection is supported but https://github.com/oracle/graal/blob/master/substratevm/Configuration.md[requires configuration]. This impacts picocli-based applications: at runtime, picocli uses reflection to discover any `@Command`-annotated subcommands, and the `@Option` and `@Parameters`-annotated command options and positional parameters. @@ -236,7 +236,7 @@ This quickly becomes quite cumbersome for utilities with many options, but fortu The `picocli-codegen` module includes an annotation processor that can build a model from the picocli annotations at compile time rather than at runtime. The annotation processor generates Graal configuration files under `META-INF/native-image/picocli-generated/$project` during compilation, to be included in the application jar. -This includes configuration files for https://github.com/oracle/graal/blob/master/substratevm/REFLECTION.md[reflection], https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md[resources] and https://github.com/oracle/graal/blob/master/substratevm/DYNAMIC_PROXY.md[dynamic proxies]. +This includes configuration files for https://github.com/oracle/graal/blob/master/substratevm/Reflection.md[reflection], https://github.com/oracle/graal/blob/master/substratevm/Resources.md[resources] and https://github.com/oracle/graal/blob/master/substratevm/DynamicProxy.md[dynamic proxies]. By embedding these configuration files, your jar is instantly Graal-enabled. In most cases no further configuration is needed when generating a native image. diff --git a/docs/index.adoc b/docs/index.adoc index 0a6ce6c36..493de4481 100644 --- a/docs/index.adoc +++ b/docs/index.adoc @@ -132,9 +132,9 @@ The `picocli-codegen` module includes an annotation processor that can build a m Enabling this annotation processor in your project is optional, but strongly recommended. Use this if you’re interested in: * **Compile time error checking**. The annotation processor shows errors for invalid annotations and attributes immediately when you compile, instead of during testing at runtime, resulting in shorter feedback cycles. -* **<>**. The annotation processor generates and updates https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md[GraalVM configuration] files under +* **<>**. The annotation processor generates and updates https://github.com/oracle/graal/blob/master/substratevm/Configuration.md[GraalVM configuration] files under `META-INF/native-image/picocli-generated/$project` during compilation, to be included in the application jar. -This includes configuration files for https://github.com/oracle/graal/blob/master/substratevm/REFLECTION.md[reflection], https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md[resources] and https://github.com/oracle/graal/blob/master/substratevm/DYNAMIC_PROXY.md[dynamic proxies]. +This includes configuration files for https://github.com/oracle/graal/blob/master/substratevm/Reflection.md[reflection], https://github.com/oracle/graal/blob/master/substratevm/Resources.md[resources] and https://github.com/oracle/graal/blob/master/substratevm/DynamicProxy.md[dynamic proxies]. By embedding these configuration files, your jar is instantly Graal-enabled. In most cases no further configuration is needed when generating a native image. @@ -7060,8 +7060,8 @@ ahead-of-time compile Java code to a standalone executable, called a native imag The resulting executable includes the application, the libraries, and the JDK and does not require a separate Java VM to be installed. The generated native image has faster startup time and lower runtime memory overhead compared to a Java VM. -GraalVM native images have some limitations and require some extra https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md[configuration] -to be able to use features like https://github.com/oracle/graal/blob/master/substratevm/REFLECTION.md[reflection], https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md[resources] (including resource bundles) and https://github.com/oracle/graal/blob/master/substratevm/DYNAMIC_PROXY.md[dynamic proxies]. +GraalVM native images have some limitations and require some extra https://github.com/oracle/graal/blob/master/substratevm/Configuration.md[configuration] +to be able to use features like https://github.com/oracle/graal/blob/master/substratevm/Reflection.md[reflection], https://github.com/oracle/graal/blob/master/substratevm/Resources.md[resources] (including resource bundles) and https://github.com/oracle/graal/blob/master/substratevm/DynamicProxy.md[dynamic proxies]. ==== How do I Create a Native Image for my Application? The `picocli-codegen` module contains an annotation processor that generates the necessary configuration files @@ -7078,7 +7078,7 @@ After installing GraalVM and installing the `native-image` generator utility (wi you can then create a native image by invoking the `native-image` command: ---- -path/to/native-image -cp picocli-4.2.0.jar --static -jar myapp.jar +path/to/native-image -cp picocli-4.5.1.jar --static -jar myapp.jar ---- CAUTION: To create a native image, the compiler toolchain for your platform needs to be installed. See https://www.infoq.com/articles/java-native-cli-graalvm-picocli/[Build Great Native CLI Apps in Java with Graalvm and Picocli] for details. diff --git a/picocli-codegen/README.adoc b/picocli-codegen/README.adoc index f72a8a7ee..2a7838058 100644 --- a/picocli-codegen/README.adoc +++ b/picocli-codegen/README.adoc @@ -23,7 +23,7 @@ If a tool does not have an annotation processor wrapper (yet), it can be invoked As of picocli version 4.2, this module has three major use cases: * **Compile time error checking**. The annotation processor shows errors for invalid annotations and attributes immediately when you compile, instead of during testing at runtime, resulting in shorter feedback cycles. -* **GraalVm native images**. To create a GraalVM native image for a picocli application, https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md[configuration] is needed. The `ReflectionConfigGenerator`, `ResourceConfigGenerator` and `DynamicProxyGenerator` tools can generate configuration files for https://github.com/oracle/graal/blob/master/substratevm/REFLECTION.md[reflection], https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md[resources] and https://github.com/oracle/graal/blob/master/substratevm/DYNAMIC_PROXY.md[dynamic proxies], respectively. +* **GraalVm native images**. To create a GraalVM native image for a picocli application, https://github.com/oracle/graal/blob/master/substratevm/Configuration.md[configuration] is needed. The `ReflectionConfigGenerator`, `ResourceConfigGenerator` and `DynamicProxyGenerator` tools can generate configuration files for https://github.com/oracle/graal/blob/master/substratevm/Reflection.md[reflection], https://github.com/oracle/graal/blob/master/substratevm/Resources.md[resources] and https://github.com/oracle/graal/blob/master/substratevm/DynamicProxy.md[dynamic proxies], respectively. + The annotation processor embeds these three tools and generates the configuration files under `META-INF/native-image/picocli-generated/$project` during compilation, to be included in the application jar. By embedding these configuration files, your jar is instantly GraalVM-enabled. @@ -39,10 +39,10 @@ To build a GraalVM native image for a picocli-based application, configuration f The `picocli-codegen` module has tools that generate these configuration files for a picocli-based application. The annotation processor in the `picocli-codegen` jar wraps these tools so they are executed automatically during compilation. -The annotation processor generates and updates https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md[GraalVM configuration] +The annotation processor generates and updates https://github.com/oracle/graal/blob/master/substratevm/Configuration.md[GraalVM configuration] files under `META-INF/native-image/picocli-generated/$project` during compilation, to be included in the application jar. -This includes configuration files for https://github.com/oracle/graal/blob/master/substratevm/REFLECTION.md[reflection], https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md[resources] and https://github.com/oracle/graal/blob/master/substratevm/DYNAMIC_PROXY.md[dynamic proxies]. +This includes configuration files for https://github.com/oracle/graal/blob/master/substratevm/Reflection.md[reflection], https://github.com/oracle/graal/blob/master/substratevm/Resources.md[resources] and https://github.com/oracle/graal/blob/master/substratevm/DynamicProxy.md[dynamic proxies]. By embedding these configuration files, your jar is instantly GraalVM-enabled. In most cases no further configuration is needed when generating a native image. @@ -281,11 +281,11 @@ This directory (or any of its subdirectories) is searched for files with the nam which are then automatically included in the build. Not all of those files must be present. When multiple files with the same name are found, all of them are included. -See also the SubstrateVM https://github.com/oracle/graal/blob/master/substratevm/CONFIGURE.md[configuration documentation]. +See also the SubstrateVM https://github.com/oracle/graal/blob/master/substratevm/Configuration.md[configuration documentation]. === ReflectionConfigGenerator -GraalVM has https://github.com/oracle/graal/blob/master/substratevm/REFLECTION.md[limited support for Java reflection] +GraalVM has https://github.com/oracle/graal/blob/master/substratevm/Reflection.md[limited support for Java reflection] and it needs to know ahead of time the reflectively accessed program elements. `ReflectionConfigGenerator` generates a JSON String with the program elements that will be accessed reflectively in a picocli-based application, in order to compile this application ahead-of-time into a native executable with GraalVM. @@ -301,7 +301,7 @@ See https://picocli.info/picocli-on-graalvm.html[Picocli on GraalVM: Blazingly F ==== Generating Reflection Configuration During the Build -_Note that the <> does this automatically. The below is only of interest if you cannot use the annotation processor for some reason._ +_Note that the <> does this automatically. The below is only of interest if you cannot use the annotation processor for some reason._ The `--output` option can be used to specify the path of the file to write the configuration to. When this option is omitted, the output is sent to standard out. @@ -393,7 +393,7 @@ assemble.dependsOn generateGraalReflectionConfig === ResourceConfigGenerator The GraalVM native-image builder by default will not integrate any of the -https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md[classpath resources] into the image it creates. +https://github.com/oracle/graal/blob/master/substratevm/Resources.md[classpath resources] into the image it creates. `ResourceConfigGenerator` generates a JSON String with the resource bundles and other classpath resources that should be included in the Substrate VM native image. @@ -407,7 +407,7 @@ This allows picocli-based native image applications to access these resources. ==== Generating Resource Configuration During the Build -_Note that the <> does this automatically. The below is only of interest if you cannot use the annotation processor for some reason._ +_Note that the <> does this automatically. The below is only of interest if you cannot use the annotation processor for some reason._ The `--output` option can be used to specify the path of the file to write the configuration to. When this option is omitted, the output is sent to standard out. @@ -501,7 +501,7 @@ assemble.dependsOn generateGraalResourceConfig === DynamicProxyConfigGenerator Substrate VM doesn't provide machinery for generating and interpreting bytecodes at run time. Therefore all dynamic proxy classes -https://github.com/oracle/graal/blob/master/substratevm/DYNAMIC_PROXY.md[need to be generated] at native image build time. +https://github.com/oracle/graal/blob/master/substratevm/DynamicProxy.md[need to be generated] at native image build time. `DynamicProxyConfigGenerator` generates a JSON String with the fully qualified interface names for which dynamic proxy classes should be generated at native image build time. @@ -516,7 +516,7 @@ This allows picocli-based native image applications that use `@Command`-annotate ==== Generating Dynamic Proxy Configuration During the Build -_Note that the <> does this automatically. The below is only of interest if you cannot use the annotation processor for some reason._ +_Note that the <> does this automatically. The below is only of interest if you cannot use the annotation processor for some reason._ The `--output` option can be used to specify the path of the file to write the configuration to. When this option is omitted, the output is sent to standard out. diff --git a/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/DynamicProxyConfigGenerator.java b/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/DynamicProxyConfigGenerator.java index 491619e04..fd3f25835 100644 --- a/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/DynamicProxyConfigGenerator.java +++ b/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/DynamicProxyConfigGenerator.java @@ -22,7 +22,7 @@ *

* Substrate VM doesn't provide machinery for generating and interpreting bytecodes at run time. * Therefore all dynamic proxy classes - * need to be generated + * need to be generated * at native image build time. *

* The output of {@code DynamicProxyConfigGenerator} is intended to be passed to the {@code -H:DynamicProxyConfigurationFiles=/path/to/proxy-config.json} @@ -30,7 +30,7 @@ * This allows picocli-based native image applications that use {@code @Command}-annotated interfaces with * {@code @Option} and {@code @Parameters}-annotated methods to define options and positional parameters. *

- * Alternatively, the generated configuration + * Alternatively, the generated configuration * files can be supplied to the {@code native-image} tool by placing them in a * {@code META-INF/native-image/} directory on the class path, for example, in a JAR file used in the image build. * This directory (or any of its subdirectories) is searched for files with the names {@code jni-config.json}, @@ -47,7 +47,7 @@ public class DynamicProxyConfigGenerator { description = {"Generates a JSON file with the interface names to generate dynamic proxy classes for in the native image.", "The generated JSON file can be passed to the `-H:DynamicProxyConfigurationFiles=/path/to/proxy-config.json` " + "option of the `native-image` GraalVM utility.", - "See https://github.com/oracle/graal/blob/master/substratevm/DYNAMIC_PROXY.md"}, + "See https://github.com/oracle/graal/blob/master/substratevm/DynamicProxy.md"}, exitCodeListHeading = "%nExit Codes (if enabled with `--exit`)%n", exitCodeList = { "0:Successful program execution.", @@ -110,7 +110,7 @@ public static void main(String... args) { * * @param specs one or more {@code CommandSpec} objects to inspect for dynamic proxies * @param interfaceClasses other (non-{@code @Command}) fully qualified interface names to generate dynamic proxy classes for - * @return a JSON String in the format + * @return a JSON String in the format * required by the {@code -H:DynamicProxyConfigurationFiles=/path/to/proxy-config.json} option of the GraalVM {@code native-image} utility. */ public static String generateProxyConfig(CommandSpec[] specs, String[] interfaceClasses) { diff --git a/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/ReflectionConfigGenerator.java b/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/ReflectionConfigGenerator.java index eb2615730..9c80d03b2 100644 --- a/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/ReflectionConfigGenerator.java +++ b/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/ReflectionConfigGenerator.java @@ -47,14 +47,14 @@ * reflectively in a picocli-based application, in order to compile this application ahead-of-time into a native * executable with GraalVM. *

- * GraalVM has limited support for Java + * GraalVM has limited support for Java * reflection and it needs to know ahead of time the reflectively accessed program elements. *

* The output of {@code ReflectionConfigGenerator} is intended to be passed to the {@code -H:ReflectionConfigurationFiles=/path/to/reflect-config.json} * option of the {@code native-image} GraalVM utility. * This allows picocli-based applications to be compiled to a native image. *

- * Alternatively, the generated configuration + * Alternatively, the generated configuration * files can be supplied to the {@code native-image} tool by placing them in a * {@code META-INF/native-image/} directory on the class path, for example, in a JAR file used in the image build. * This directory (or any of its subdirectories) is searched for files with the names {@code jni-config.json}, @@ -84,7 +84,7 @@ public class ReflectionConfigGenerator { "accessed reflectively for the specified `@Command` classes.", "The generated JSON file can be passed to the `-H:ReflectionConfigurationFiles=/path/to/reflect-config.json` " + "option of the `native-image` GraalVM utility.", - "See https://github.com/oracle/graal/blob/master/substratevm/REFLECTION.md"}, + "See https://github.com/oracle/graal/blob/master/substratevm/Reflection.md"}, exitCodeListHeading = "%nExit Codes (if enabled with `--exit`)%n", exitCodeList = { "0:Successful program execution.", @@ -143,7 +143,7 @@ public static void main(String... args) { * {@code CommandSpec} objects. * * @param specs one or more {@code CommandSpec} objects to inspect - * @return a JSON String in the format + * @return a JSON String in the format * required by the {@code -H:ReflectionConfigurationFiles=/path/to/reflect-config.json} option of the GraalVM {@code native-image} utility. * @throws NoSuchFieldException if a problem occurs while processing the specified specs * @throws IllegalAccessException if a problem occurs while processing the specified specs diff --git a/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/ResourceConfigGenerator.java b/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/ResourceConfigGenerator.java index 3698ff8c9..cdcb66d9f 100644 --- a/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/ResourceConfigGenerator.java +++ b/picocli-codegen/src/main/java/picocli/codegen/aot/graalvm/ResourceConfigGenerator.java @@ -20,13 +20,13 @@ * that should be included in the Substrate VM native image. *

* The GraalVM native-image builder by default will not integrate any of the - * classpath resources into the image it creates. + * classpath resources into the image it creates. *

* The output of {@code ResourceConfigGenerator} is intended to be passed to the {@code -H:ResourceConfigurationFiles=/path/to/resource-config.json} * option of the {@code native-image} GraalVM utility. * This allows picocli-based native image applications to access these resources. *

- * Alternatively, the generated configuration + * Alternatively, the generated configuration * files can be supplied to the {@code native-image} tool by placing them in a * {@code META-INF/native-image/} directory on the class path, for example, in a JAR file used in the image build. * This directory (or any of its subdirectories) is searched for files with the names {@code jni-config.json}, @@ -43,7 +43,7 @@ public class ResourceConfigGenerator { description = {"Generates a JSON file with the resources and resource bundles to include in the native image.", "The generated JSON file can be passed to the `-H:ResourceConfigurationFiles=/path/to/resource-config.json` " + "option of the `native-image` GraalVM utility.", - "See https://github.com/oracle/graal/blob/master/substratevm/RESOURCES.md"}, + "See https://github.com/oracle/graal/blob/master/substratevm/Resources.md"}, exitCodeListHeading = "%nExit Codes (if enabled with `--exit`)%n", exitCodeList = { "0:Successful program execution.", @@ -111,7 +111,7 @@ public static void main(String... args) { * @param specs one or more {@code CommandSpec} objects to inspect for resource bundles * @param bundles base names of additional resource bundles to be included in the image * @param resourceRegex one or more Java regular expressions that match resource(s) to be included in the image - * @return a JSON String in the format + * @return a JSON String in the format * required by the {@code -H:ResourceConfigurationFiles=/path/to/resource-config.json} option of the GraalVM {@code native-image} utility. */ public static String generateResourceConfig(CommandSpec[] specs, String[] bundles, String[] resourceRegex) {