Skip to content

Commit fff5b37

Browse files
authored
Merge branch 'master' into cc/issue-612
2 parents 64f0b12 + 7d885f7 commit fff5b37

File tree

32 files changed

+191
-87
lines changed

32 files changed

+191
-87
lines changed

.github/workflows/deploy-snapshots.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: "Deploy snapshots"
22

33
on:
44
workflow_run:
5-
workflows: [ "deploy-documentation", "test-native-gradle-plugin", "test-native-maven-plugin", "test-junit-platform-native" ]
5+
workflows: [ "Deploy documentation to website", "Test native-gradle-plugin", "Test native-maven-plugin", "Test junit-platform-native" ]
66
branches: [ "master" ]
77
types:
88
- completed

docs/src/docs/asciidoc/changelog.adoc

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77

88
- Add support for dependency exclusions
99

10+
=== Gradle plugin
11+
12+
- Added options to override parameters from command line
13+
1014
== Release 0.10.5
1115

1216
- Add missing getters to `DirectoryConfiguration`

docs/src/docs/asciidoc/css/page.css

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ body {
7575

7676
#preamble>.sectionbody>[class="paragraph"]:first-of-type p {
7777
color: white;
78+
font-size: 1.0625rem;
7879
}
7980

8081
p {

docs/src/docs/asciidoc/gradle-plugin.adoc

+25-4
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,31 @@ You can also pass **build-time** and **run-time** arguments:
173173
- `buildArgs.add('<buildArg>')`: Configures the build by passing options directly to `native-image`. You can pass any Native Image build option listed https://www.graalvm.org/reference-manual/native-image/overview/Options/[here].
174174
- `runtimeArgs.add('<runtimeArg>')`: Specifies runtime arguments consumed by your application.
175175

176-
[NOTE]
177-
====
178-
For options that can be set using the command line, if both DSL and command-line options are present, command-line options take precedence.
179-
====
176+
==== Command line options
177+
178+
The preferred way to configure native binaries is by using the DSL, so that you can provide reproducible builds which do not depend on obscure CLI invocations.
179+
However, in some circumstances, for experimentation, it may be useful to override parameters from command line.
180+
The following flags are available and (unless stated otherwise) will take precedence over the DSL configuration:
181+
182+
|===
183+
|Command line option|Description
184+
|`--image-name=<name>`|Overrides the `imageName` property
185+
|`--main-class=<class>`|Overrides the `mainClass` property
186+
|`--(no-)debug-native`|Enables or disables debug info generation
187+
|`--(no-)verbose`|Enables or disables verbose output
188+
|`--(no-)fallback`|Enables or disables the fallback mode
189+
|`--(no-)quick-build-native`|Enables or disables quick build mode
190+
|`--(no-)rich-output`|Enables or disables rich output
191+
|`--(no-)pgo-instrument`|Enables or disables PGO instrumentation
192+
|`--build-args`|Adds build arguments
193+
|`--force-build-args`|Overrides build arguments (DSL will be ignored)
194+
|`--(no-)fat-jar`|Enables or disables creation of a far jar for compilation
195+
|`--sysprop-native`|Adds a system property for compilation
196+
|`--env-native`|Adds an environment variable for compilation
197+
|`--jvm-args-native`|Adds JVM arguments for compilation
198+
|`--force-jvm-args-native`|Overrides JVM arguments (DSL will be ignored)
199+
|===
200+
180201

181202
[[native-image-tracing-agent]]
182203
== Native Image Tracing Agent

gradle/libs.versions.toml

+10-13
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
[versions]
22
# Project versions
3-
nativeBuildTools = "0.10.5-SNAPSHOT"
3+
nativeBuildTools = "0.10.6-SNAPSHOT"
44
metadataRepository = "0.3.15"
55

66
# External dependencies
77
spock = "2.1-groovy-3.0"
8-
maven = "3.8.6"
8+
maven = "3.9.9"
99
mavenAnnotations = "3.6.4"
10-
mavenEmbedder = "3.8.6"
11-
mavenWagon = "3.4.3"
10+
mavenEmbedder = "3.9.9"
11+
mavenResolver = "1.9.22"
1212
graalvm = "23.0.2"
1313
openjson = "1.0.13"
1414
junitPlatform = "1.10.0"
1515
junitJupiter = "5.10.0"
16-
aether = "1.1.0"
1716
slf4j = "1.7.9"
1817
groovy = "3.0.11"
1918
jetty = "11.0.11"
20-
plexusUtils = "4.0.0"
19+
plexusUtils = "4.0.2"
2120
plexusXml = "4.0.2"
22-
cyclonedxMaven = "2.8.1"
23-
pluginExecutorMaven = "2.4.0"
21+
cyclonedxMaven = "2.9.1"
22+
pluginExecutorMaven = "2.4.1"
2423

2524
[libraries]
2625
# Local projects
@@ -50,11 +49,9 @@ maven-core = { module = "org.apache.maven:maven-core", version.ref = "maven" }
5049
maven-artifact = { module = "org.apache.maven:maven-artifact", version.ref = "maven" }
5150
maven-compat = { module = "org.apache.maven:maven-compat", version.ref = "maven" }
5251
maven-embedder = { module = "org.apache.maven:maven-embedder", version.ref = "mavenEmbedder" }
53-
maven-aether-connector = { module = "org.eclipse.aether:aether-connector-basic", version.ref = "aether" }
54-
maven-aether-wagon = { module = "org.eclipse.aether:aether-transport-wagon", version.ref = "aether" }
55-
maven-wagon-file = { module = "org.apache.maven.wagon:wagon-file", version.ref = "mavenWagon" }
56-
maven-wagon-http = { module = "org.apache.maven.wagon:wagon-http", version.ref = "mavenWagon" }
57-
maven-wagon-provider = { module = "org.apache.maven.wagon:wagon-provider-api", version.ref = "mavenWagon" }
52+
maven-resolver-basic = { module = "org.apache.maven.resolver:maven-resolver-connector-basic", version.ref = "mavenResolver"}
53+
maven-resolver-transport-http = { module = "org.apache.maven.resolver:maven-resolver-transport-http", version.ref = "mavenResolver"}
54+
maven-resolver-transport-file = { module = "org.apache.maven.resolver:maven-resolver-transport-file", version.ref = "mavenResolver"}
5855

5956
slf4j-simple = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" }
6057

native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/tasks/BuildNativeImageTask.java

+93-23
Original file line numberDiff line numberDiff line change
@@ -100,18 +100,88 @@ protected NativeImageCompileOptions getCompileOptions() {
100100
}
101101

102102
@Option(option = "quick-build-native", description = "Enables quick build mode")
103-
public void overrideQuickBuild() {
104-
getOptions().get().getQuickBuild().set(true);
103+
public void overrideQuickBuild(boolean quickBuild) {
104+
getOptions().get().getQuickBuild().set(quickBuild);
105105
}
106106

107107
@Option(option = "debug-native", description = "Enables debug mode")
108-
public void overrideDebugBuild() {
109-
getOptions().get().getDebug().set(true);
108+
public void overrideDebugBuild(boolean debug) {
109+
getOptions().get().getDebug().set(debug);
110+
}
111+
112+
@Option(option = "verbose", description = "Enables verbose mode")
113+
public void overrideVerboseBuild(boolean verbose) {
114+
getOptions().get().getVerbose().set(verbose);
115+
}
116+
117+
@Option(option = "fallback", description = "Enables fallback mode")
118+
public void overrideFallbackBuild(boolean fallback) {
119+
getOptions().get().getFallback().set(fallback);
110120
}
111121

112122
@Option(option = "pgo-instrument", description = "Enables PGO instrumentation")
113-
public void overridePgoInstrument() {
114-
getOptions().get().getPgoInstrument().set(true);
123+
public void overridePgoInstrument(boolean pgo) {
124+
getOptions().get().getPgoInstrument().set(pgo);
125+
}
126+
127+
@Option(option = "main-class", description = "The fully qualified name of the entry point for native image compilation")
128+
public void overrideMainClass(String mainClass) {
129+
getCompileOptions().getMainClass().set(mainClass);
130+
}
131+
132+
@Option(option = "build-args", description = "Adds arguments for the native-image compilation")
133+
public void appendBuildArgs(List<String> buildArgs) {
134+
getOptions().get().buildArgs(buildArgs);
135+
}
136+
137+
@Option(option = "force-build-args", description = "Adds arguments for the native-image compilation")
138+
public void overrideBuildArgs(List<String> buildArgs) {
139+
getOptions().get().getBuildArgs().set(buildArgs);
140+
}
141+
142+
@Option(option = "rich-output", description = "Enables rich output")
143+
public void overrideRichOutput(boolean richOutput) {
144+
getOptions().get().getRichOutput().set(richOutput);
145+
}
146+
147+
@Option(option = "image-name", description = "The name of the generated native image")
148+
public void overrideImageName(String imageName) {
149+
getOptions().get().getImageName().set(imageName);
150+
}
151+
152+
@Option(option = "fatjar", description = "Uses a fat jar as an input, instead of exploded classpath")
153+
public void overrideFatJar(boolean fatJar) {
154+
getOptions().get().getUseFatJar().set(fatJar);
155+
}
156+
157+
@Option(option = "sysprop-native", description = "Adds a system property to the native image build (format key=value)")
158+
public void addSystemProperty(String property) {
159+
String[] parts = property.split("=", 2);
160+
if (parts.length == 2) {
161+
getOptions().get().systemProperty(parts[0], parts[1]);
162+
} else {
163+
getLogger().warn("Ignoring invalid system property: " + property);
164+
}
165+
}
166+
167+
@Option(option = "env-native", description = "Adds a environment variable to the native image build (format key=value)")
168+
public void addEnvVar(String property) {
169+
String[] parts = property.split("=", 2);
170+
if (parts.length == 2) {
171+
getOptions().get().getEnvironmentVariables().put(parts[0], parts[1]);
172+
} else {
173+
getLogger().warn("Ignoring invalid environment variable: " + property);
174+
}
175+
}
176+
177+
@Option(option = "jvm-args-native", description = "Adds arguments to the JVM used to build the native image")
178+
public void appendJvmArgs(List<String> jvmArgs) {
179+
getOptions().get().jvmArgs(jvmArgs);
180+
}
181+
182+
@Option(option = "force-jvm-args-native", description = "Overrides arguments passed to the JVM used to build the native image")
183+
public void overrideJvmArgs(List<String> jvmArgs) {
184+
getOptions().get().getJvmArgs().set(jvmArgs);
115185
}
116186

117187
@Inject
@@ -136,7 +206,7 @@ protected Provider<String> getGraalVMHome() {
136206
@Internal
137207
public Provider<String> getExecutableShortName() {
138208
return getOptions().flatMap(options ->
139-
options.getImageName().zip(options.getPgoInstrument(), serializableBiFunctionOf((name, pgo) -> name + (Boolean.TRUE.equals(pgo) ? "-instrumented" : "")))
209+
options.getImageName().zip(options.getPgoInstrument(), serializableBiFunctionOf((name, pgo) -> name + (Boolean.TRUE.equals(pgo) ? "-instrumented" : "")))
140210
);
141211
}
142212

@@ -184,16 +254,16 @@ public BuildNativeImageTask() {
184254
private List<String> buildActualCommandLineArgs(int majorJDKVersion) {
185255
getOptions().finalizeValue();
186256
return new NativeImageCommandLineProvider(
187-
getOptions(),
188-
getExecutableShortName(),
189-
getProviders().provider(() -> getWorkingDirectory().get().getAsFile().getAbsolutePath()),
190-
// Can't use getOutputDirectory().map(...) because Gradle would complain that we use
191-
// a mapped value before the task was called, when we are actually calling it...
192-
getProviders().provider(() -> getOutputDirectory().getAsFile().get().getAbsolutePath()),
193-
getClasspathJar(),
194-
getUseArgFile(),
195-
getProviders().provider(() -> majorJDKVersion),
196-
getProviders().provider(() -> useColors)).asArguments();
257+
getOptions(),
258+
getExecutableShortName(),
259+
getProviders().provider(() -> getWorkingDirectory().get().getAsFile().getAbsolutePath()),
260+
// Can't use getOutputDirectory().map(...) because Gradle would complain that we use
261+
// a mapped value before the task was called, when we are actually calling it...
262+
getProviders().provider(() -> getOutputDirectory().getAsFile().get().getAbsolutePath()),
263+
getClasspathJar(),
264+
getUseArgFile(),
265+
getProviders().provider(() -> majorJDKVersion),
266+
getProviders().provider(() -> useColors)).asArguments();
197267
}
198268

199269
// This property provides access to the service instance
@@ -208,12 +278,12 @@ public void exec() {
208278
GraalVMLogger logger = GraalVMLogger.of(getLogger());
209279

210280
File executablePath = NativeImageExecutableLocator.findNativeImageExecutable(
211-
options.getJavaLauncher(),
212-
getDisableToolchainDetection(),
213-
getGraalVMHome(),
214-
getExecOperations(),
215-
logger,
216-
diagnostics);
281+
options.getJavaLauncher(),
282+
getDisableToolchainDetection(),
283+
getGraalVMHome(),
284+
getExecOperations(),
285+
logger,
286+
diagnostics);
217287
String versionString = getVersionString(getExecOperations(), executablePath);
218288
if (options.getRequiredVersion().isPresent()) {
219289
NativeImageUtils.checkVersion(options.getRequiredVersion().get(), versionString);

native-maven-plugin/build.gradle.kts

+5-8
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,20 @@ dependencies {
6363
implementation(libs.utils)
6464
implementation(libs.openjson)
6565
implementation(libs.jvmReachabilityMetadata)
66-
implementation(libs.plexus.utils)
67-
implementation(libs.plexus.xml)
6866
implementation(libs.cyclonedx.maven.plugin)
6967
implementation(libs.plugin.executor.maven)
7068

69+
compileOnly(libs.plexus.utils)
70+
compileOnly(libs.plexus.xml)
7171
compileOnly(libs.maven.pluginApi)
7272
compileOnly(libs.maven.core)
7373
compileOnly(libs.maven.artifact)
7474
compileOnly(libs.maven.pluginAnnotations)
7575

7676
mavenEmbedder(libs.maven.embedder)
77-
mavenEmbedder(libs.maven.aether.connector)
78-
mavenEmbedder(libs.maven.aether.wagon)
79-
mavenEmbedder(libs.maven.wagon.http)
80-
mavenEmbedder(libs.maven.wagon.file)
81-
mavenEmbedder(libs.maven.wagon.provider)
77+
mavenEmbedder(libs.maven.resolver.basic)
78+
mavenEmbedder(libs.maven.resolver.transport.http)
79+
mavenEmbedder(libs.maven.resolver.transport.file)
8280
mavenEmbedder(libs.maven.compat)
8381
mavenEmbedder(libs.slf4j.simple)
8482

@@ -180,4 +178,3 @@ tasks.withType<Checkstyle>().configureEach {
180178
// generated code
181179
exclude("**/RuntimeMetadata*")
182180
}
183-

native-maven-plugin/reproducers/issue-144/pom.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@
5656
<properties>
5757
<java.version>1.8</java.version>
5858
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
59-
<native.maven.plugin.version>0.10.5-SNAPSHOT</native.maven.plugin.version>
60-
<junit.platform.native.version>0.10.5-SNAPSHOT</junit.platform.native.version>
59+
<native.maven.plugin.version>0.10.6-SNAPSHOT</native.maven.plugin.version>
60+
<junit.platform.native.version>0.10.6-SNAPSHOT</junit.platform.native.version>
6161
<imageName>example-app</imageName>
6262
<mainClass>org.graalvm.demo.Application</mainClass>
6363
</properties>

native-maven-plugin/src/functionalTest/groovy/org/graalvm/buildtools/maven/SBOMFunctionalTest.groovy

+2
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class SBOMFunctionalTest extends AbstractGraalVMMavenFunctionalTest {
8181
buildSucceeded
8282
outputContainsPattern".*CycloneDX SBOM with \\d+ component\\(s\\) is embedded in binary \\(.*?\\) and exported as JSON \\(see build artifacts\\)\\."
8383
outputDoesNotContain "Use '--enable-sbom' to assemble a Software Bill of Materials (SBOM)"
84+
outputDoesNotContain "Could not generate an augmented SBOM"
8485
validateExportedSBOM sbom
8586
!file(String.format("target/%s", SBOMGenerator.SBOM_FILENAME)).exists()
8687
outputContains "Hello, native!"
@@ -101,6 +102,7 @@ class SBOMFunctionalTest extends AbstractGraalVMMavenFunctionalTest {
101102
buildSucceeded
102103
outputContainsPattern".*CycloneDX SBOM with \\d+ component\\(s\\) is embedded in binary \\(.*?\\)."
103104
outputDoesNotContain "Use '--enable-sbom' to assemble a Software Bill of Materials (SBOM)"
105+
outputDoesNotContain "Could not generate an augmented SBOM"
104106
!file(String.format("target/%s", SBOMGenerator.SBOM_FILENAME)).exists()
105107
outputContains "Hello, native!"
106108
}

native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/NativeCompileNoForkMojo.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,16 @@ private void generateAugmentedSBOMIfNeeded() throws IllegalArgumentException, Mo
177177
}
178178

179179
var sbomGenerator = new SBOMGenerator(mavenProject, mavenSession, pluginManager, repositorySystem, mainClass, logger);
180-
sbomGenerator.generate();
180+
try {
181+
sbomGenerator.generate();
182+
} catch (MojoExecutionException e) {
183+
/* Only throw exception for users that explicitly opt-in to using augmented SBOMs. */
184+
if (optionWasSet) {
185+
throw e;
186+
}
187+
logger.warn(String.format("Could not generate an augmented SBOM: %s. Fallback to generating a non-augmented SBOM.",
188+
e.getCause().getMessage()));
189+
}
181190
}
182191

183192
private String consumeConfigurationNodeValue(String pluginKey, String... nodeNames) {

native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/sbom/ArtifactToPackageNameResolver.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ Set<ArtifactAdapter> getArtifactAdapters() throws Exception {
112112
return artifactsWithPackageNameMappings;
113113
}
114114

115-
private Optional<ArtifactAdapter> resolvePackageNamesFromArtifact(Artifact artifact) throws ArtifactResolutionException, IOException {
115+
private Optional<ArtifactAdapter> resolvePackageNamesFromArtifact(Artifact artifact) throws IOException {
116116
File artifactFile = artifact.getFile();
117117
if (artifactFile != null && artifactFile.exists()) {
118118
return resolvePackageNamesFromArtifactFile(artifactFile, ArtifactAdapter.fromMavenArtifact(artifact));
@@ -124,7 +124,13 @@ private Optional<ArtifactAdapter> resolvePackageNamesFromArtifact(Artifact artif
124124
.setArtifact(sourceArtifact)
125125
.setRepositories(remoteRepositories);
126126

127-
ArtifactResult result = repositorySystem.resolveArtifact(repositorySystemSession, request);
127+
ArtifactResult result;
128+
try {
129+
result = repositorySystem.resolveArtifact(repositorySystemSession, request);
130+
} catch (ArtifactResolutionException e) {
131+
return Optional.empty();
132+
}
133+
128134
if (result != null && result.getArtifact() != null && result.getArtifact().getFile() != null) {
129135
File sourceFile = result.getArtifact().getFile();
130136
return resolvePackageNamesFromArtifactFile(sourceFile, ArtifactAdapter.fromEclipseArtifact(result.getArtifact()));

native-maven-plugin/src/main/java/org/graalvm/buildtools/maven/sbom/SBOMGenerator.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -238,13 +238,10 @@ private void augmentSBOM(Path baseSBOMPath, Set<ArtifactAdapter> artifacts) thro
238238
JSONObject sbomJson = new JSONObject(Files.readString(baseSBOMPath));
239239

240240
JSONArray componentsArray = sbomJson.optJSONArray("components");
241-
if (componentsArray == null) {
242-
throw new RuntimeException(String.format("SBOM generated by %s:%s contained no components.", Plugin.groupId, Plugin.artifactId));
241+
if (componentsArray != null) {
242+
componentsArray.forEach(componentNode -> augmentComponentNode((JSONObject) componentNode, artifacts));
243243
}
244244

245-
/* Augment the "components" */
246-
componentsArray.forEach(componentNode -> augmentComponentNode((JSONObject) componentNode, artifacts));
247-
248245
/* Augment the main component in "metadata/component" */
249246
JSONObject metadataNode = sbomJson.optJSONObject("metadata");
250247
if (metadataNode != null && metadataNode.has("component")) {

samples/java-application-with-custom-packaging/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
<micronaut.version>3.3.4</micronaut.version>
6262
<exec.mainClass>org.graalvm.demo.Application</exec.mainClass>
6363
<micronaut.runtime>netty</micronaut.runtime>
64-
<native.maven.plugin.version>0.10.5-SNAPSHOT</native.maven.plugin.version>
64+
<native.maven.plugin.version>0.10.6-SNAPSHOT</native.maven.plugin.version>
6565
</properties>
6666

6767
<repositories>
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
native.gradle.plugin.version = 0.10.5-SNAPSHOT
1+
native.gradle.plugin.version = 0.10.6-SNAPSHOT
22
junit.jupiter.version = 5.10.0
33
junit.platform.version = 1.10.0
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
native.gradle.plugin.version = 0.10.5-SNAPSHOT
1+
native.gradle.plugin.version = 0.10.6-SNAPSHOT
22
junit.jupiter.version = 5.10.0
33
junit.platform.version = 1.10.0

0 commit comments

Comments
 (0)