|
| 1 | +plugins { |
| 2 | + id 'java' |
| 3 | + id 'org.graalvm.buildtools.native' |
| 4 | + id 'buildlogic.jar-shadow-conventions' |
| 5 | +} |
| 6 | + |
| 7 | + |
| 8 | +def nativeCompileMetaDir = project.layout.buildDirectory.dir('nativeCompile/src/main/resources/native-image/' + project.group + '/' + project.name) |
| 9 | + |
| 10 | +// use tasks 'nativeCompile' and 'nativeRun' to compile and run the native image |
| 11 | +graalvmNative { |
| 12 | + agent { |
| 13 | + enabled = !project.hasProperty('skipGraalAgent') // we would love to make this dynamic, but it's not possible |
| 14 | + defaultMode = "standard" |
| 15 | + metadataCopy { |
| 16 | + inputTaskNames.add('test') |
| 17 | + inputTaskNames.add('testNpm') |
| 18 | + mergeWithExisting = false |
| 19 | + outputDirectories.add(nativeCompileMetaDir.get().asFile.path) |
| 20 | + } |
| 21 | + tasksToInstrumentPredicate = new java.util.function.Predicate<Task>() { |
| 22 | + @Override |
| 23 | + boolean test(Task task) { |
| 24 | + // if (project.hasProperty('agent')) { |
| 25 | + println ("Instrumenting task: " + task.name + " " + task.name == 'test' + "proj: " + task.project.hasProperty('agent')) |
| 26 | + return task.name == 'test' || task.name == 'testNpm' |
| 27 | + // } |
| 28 | + // return false |
| 29 | + } |
| 30 | + } |
| 31 | + } |
| 32 | + binaries { |
| 33 | + main { |
| 34 | + imageName = 'spotless' |
| 35 | + mainClass = 'com.diffplug.spotless.cli.SpotlessCLI' |
| 36 | + sharedLibrary = false |
| 37 | + useFatJar = true // use shadowJar as input to have same classpath |
| 38 | + |
| 39 | + // optimizations, see https://www.graalvm.org/latest/reference-manual/native-image/optimizations-and-performance/ |
| 40 | + //buildArgs.add('-O3') // on production builds |
| 41 | + |
| 42 | + // the following options are required for GJF |
| 43 | + // see: <https://github.com/google/google-java-format/issues/894#issuecomment-1430408909> |
| 44 | + buildArgs.add('-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED') |
| 45 | + buildArgs.add('-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED') |
| 46 | + buildArgs.add('-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED') |
| 47 | + buildArgs.add('-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED') |
| 48 | + buildArgs.add('-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED') |
| 49 | + |
| 50 | + buildArgs.add('--initialize-at-build-time=com.sun.tools.javac.file.Locations') |
| 51 | + |
| 52 | + buildArgs.add('-H:IncludeResourceBundles=com.sun.tools.javac.resources.compiler') |
| 53 | + buildArgs.add('-H:IncludeResourceBundles=com.sun.tools.javac.resources.javac') |
| 54 | + } |
| 55 | + } |
| 56 | +} |
| 57 | + |
| 58 | +tasks.named('metadataCopy') { |
| 59 | + dependsOn('test', 'testNpm') |
| 60 | +} |
| 61 | + |
| 62 | +tasks.named('nativeCompile') { |
| 63 | + dependsOn('shadowJar') |
| 64 | + classpathJar = tasks.shadowJar.archiveFile.get().asFile |
| 65 | +} |
| 66 | + |
| 67 | +tasks.named('shadowJar', com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) { |
| 68 | + dependsOn('metadataCopy') // produces graalvm agent info |
| 69 | + from(nativeCompileMetaDir.get().asFile.path) { |
| 70 | + into('META-INF/native-image/' + project.group + '/' + project.name) |
| 71 | + } |
| 72 | +} |
0 commit comments