1616
1717import org .gradle .api .Plugin ;
1818import org .gradle .api .Project ;
19+ import org .gradle .api .plugins .JavaPlugin ;
1920import org .gradle .api .provider .Provider ;
21+ import org .gradle .api .tasks .SourceSet ;
22+ import org .gradle .api .tasks .SourceSetContainer ;
2023import org .gradle .api .tasks .TaskProvider ;
2124
2225/** GraalVM Plugin to build a native-image from a Java application. */
@@ -31,22 +34,84 @@ public void apply(final Project project) {
3134 Provider <GraalvmBuildService > svc = project .getGradle ().getSharedServices ().registerIfAbsent (
3235 "web" , GraalvmBuildService .class , spec -> spec .getMaxParallelUsages ().set (1 ));
3336
34- TaskProvider <GraalvmNativeTask > nativeImage =
35- project .getTasks ().register ("graalvmNativeImage" , GraalvmNativeTask .class , task -> {
36- task .setGroup ("Graalvm" );
37- task .setDescription ("Build GraalVM Native Image" );
38- task .setExtension (ext );
39- task .usesService (svc );
37+ project .afterEvaluate (p -> {
38+ // Treat "configured" as: user set mainClassName (adjust the predicate if you prefer)
39+ boolean configured = ext .getMainClassName ().isPresent ();
40+
41+ if (!configured ) {
42+ // User didn't declare nativeImage { ... } in this subproject — do nothing.
43+ return ;
44+ }
45+
46+ // Register the task now that we know it's wanted in this project
47+ TaskProvider <GraalvmNativeTask > nativeImage =
48+ project .getTasks ().register ("graalvmNativeImage" , GraalvmNativeTask .class , task -> {
49+ task .setGroup ("Graalvm" );
50+ task .setDescription ("Build GraalVM Native Image" );
51+ task .setExtension (ext ); // inject the extension (nested inputs)
52+ task .usesService (svc );
53+ task .getBuildDirectory ().set (project .getLayout ().getBuildDirectory ().dir ("graalvm" ));
54+ });
55+
56+ // Wire only if the Java plugin is applied
57+ project .getPlugins ().withType (JavaPlugin .class , jp -> {
58+ SourceSetContainer sourceSets = project .getExtensions ().getByType (SourceSetContainer .class );
59+ SourceSet main = sourceSets .getByName (SourceSet .MAIN_SOURCE_SET_NAME );
60+
61+ // Inputs
62+ nativeImage .configure (t -> {
63+ t .getSources ().from (main .getAllSource ()); // java + resources
64+ t .getRuntimeClasspath ().from (main .getRuntimeClasspath ()); // runtime jars/classes
4065 });
4166
42- project . afterEvaluate ( p -> nativeImage . configure ( task -> {
43- // always depend on `check`
44- task . dependsOn ( "check" );
67+ // Ensure producers run first (jar is enough; avoids assemble cycles)
68+ nativeImage . configure ( t -> t . dependsOn ( project . getTasks (). named ( JavaPlugin . JAR_TASK_NAME )));
69+ } );
4570
46- // only depend on `jar` if that task was applied
47- if (p .getTasks ().findByName ("jar" ) != null ) {
48- task .dependsOn ("jar" );
49- }
50- }));
71+ // If you want assemble to run AFTER native image in projects that opted in
72+ project .getTasks ()
73+ .named (org .gradle .language .base .plugins .LifecycleBasePlugin .ASSEMBLE_TASK_NAME )
74+ .configure (t -> t .dependsOn (nativeImage ));
75+
76+ // If the Distribution plugin is applied, make distZip wait for native image
77+ project .getPlugins ().withId ("distribution" ,
78+ __ -> project .getTasks ().named ("distZip" ).configure (t -> t .dependsOn (nativeImage )));
79+ });
80+
81+ // TaskProvider<GraalvmNativeTask> nativeImage =
82+ // project.getTasks().register("graalvmNativeImage", GraalvmNativeTask.class, task -> {
83+ // task.setGroup("Graalvm");
84+ // task.setDescription("Build GraalVM Native Image");
85+ // task.setExtension(ext);
86+ // task.usesService(svc);
87+ // task.onlyIf(t -> ext.getMainClassName().isPresent());
88+ //
89+ // task.getBuildDirectory().set(project.getLayout().getBuildDirectory().dir("graalvm"));
90+ // });
91+ //
92+ // project.getPlugins().withType(JavaPlugin.class, jp -> {
93+ // SourceSetContainer sourceSets =
94+ // project.getExtensions().getByType(SourceSetContainer.class);
95+ // SourceSet main = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
96+ //
97+ // // Inputs
98+ // nativeImage.configure(t -> {
99+ // t.getSources().from(main.getAllSource()); // sources (java + resources)
100+ // t.getRuntimeClasspath().from(main.getRuntimeClasspath()); // runtime jars/classes
101+ // });
102+ //
103+ // nativeImage.configure(t ->
104+ // t.dependsOn(project.getTasks().named(JavaPlugin.JAR_TASK_NAME)));
105+ // });
106+ //
107+ // // Make assemble run AFTER native image (i.e., assemble depends on native)
108+ // project.getTasks()
109+ // .named(org.gradle.language.base.plugins.LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
110+ // .configure(t -> t.dependsOn(nativeImage));
111+ //
112+ // // If using the Distribution plugin, make distZip run AFTER native image
113+ // project.getPlugins().withId("distribution", p -> {
114+ // project.getTasks().named("distZip").configure(t -> t.dependsOn(nativeImage));
115+ // });
51116 }
52117}
0 commit comments