added sambal plugin and native image plugin
This commit is contained in:
13
native-image/build.gradle
Normal file
13
native-image/build.gradle
Normal file
@@ -0,0 +1,13 @@
|
||||
plugins {
|
||||
id 'java-gradle-plugin'
|
||||
}
|
||||
|
||||
|
||||
gradlePlugin {
|
||||
plugins {
|
||||
create("NativeImagePlugin") {
|
||||
id = "net.woggioni.gradle.native-image"
|
||||
implementationClass = "net.woggioni.gradle.nativeimage.NativeImagePlugin"
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,62 @@
|
||||
package net.woggioni.gradle.nativeimage;
|
||||
|
||||
import org.gradle.api.artifacts.Configuration;
|
||||
import org.gradle.api.artifacts.ConfigurationContainer;
|
||||
import org.gradle.api.file.Directory;
|
||||
import org.gradle.api.file.DirectoryProperty;
|
||||
import org.gradle.api.file.ProjectLayout;
|
||||
import org.gradle.api.plugins.JavaApplication;
|
||||
import org.gradle.api.plugins.JavaPlugin;
|
||||
import org.gradle.api.provider.Provider;
|
||||
import org.gradle.api.tasks.Input;
|
||||
import org.gradle.api.tasks.JavaExec;
|
||||
import org.gradle.api.tasks.OutputDirectory;
|
||||
import org.gradle.api.tasks.TaskContainer;
|
||||
import org.gradle.api.tasks.bundling.Jar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
import static net.woggioni.gradle.nativeimage.NativeImagePlugin.NATIVE_IMAGE_CONFIGURATION_FOLDER_NAME;
|
||||
import static net.woggioni.gradle.nativeimage.NativeImagePlugin.NATIVE_IMAGE_TASK_GROUP;
|
||||
|
||||
public abstract class NativeImageConfigurationTask extends JavaExec {
|
||||
|
||||
@OutputDirectory
|
||||
public abstract DirectoryProperty getConfigurationDir();
|
||||
|
||||
public NativeImageConfigurationTask() {
|
||||
setGroup(NATIVE_IMAGE_TASK_GROUP);
|
||||
setDescription("Run the application with the native-image-agent " +
|
||||
"to create a configuration for native image creation");
|
||||
ProjectLayout layout = getProject().getLayout();
|
||||
TaskContainer taskContainer = getProject().getTasks();
|
||||
JavaApplication javaApplication = getProject().getExtensions().findByType(JavaApplication.class);
|
||||
if(!Objects.isNull(javaApplication)) {
|
||||
getMainClass().convention(javaApplication.getMainClass());
|
||||
getMainModule().convention(javaApplication.getMainModule());
|
||||
}
|
||||
getConfigurationDir().convention(layout.getProjectDirectory()
|
||||
.dir(NATIVE_IMAGE_CONFIGURATION_FOLDER_NAME));
|
||||
ConfigurationContainer cc = getProject().getConfigurations();
|
||||
Configuration runtimeClasspath = cc.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME);
|
||||
setClasspath(runtimeClasspath);
|
||||
Provider<Jar> jarTaskProvider = taskContainer.named(JavaPlugin.JAR_TASK_NAME, Jar.class);
|
||||
setClasspath(
|
||||
getProject().files(
|
||||
jarTaskProvider,
|
||||
runtimeClasspath
|
||||
)
|
||||
);
|
||||
List<String> jvmArgs = new ArrayList<>();
|
||||
jvmArgs.add("-agentlib:native-image-agent=config-output-dir=" + getConfigurationDir().get());
|
||||
for(String jvmArg : Optional.ofNullable(javaApplication.getApplicationDefaultJvmArgs()).orElse(Collections.emptyList())) {
|
||||
jvmArgs.add(jvmArg);
|
||||
}
|
||||
jvmArgs(jvmArgs);
|
||||
}
|
||||
}
|
@@ -0,0 +1,54 @@
|
||||
package net.woggioni.gradle.nativeimage;
|
||||
|
||||
import org.gradle.api.Plugin;
|
||||
import org.gradle.api.Project;
|
||||
import org.gradle.api.artifacts.ConfigurationContainer;
|
||||
import org.gradle.api.file.FileCollection;
|
||||
import org.gradle.api.file.ProjectLayout;
|
||||
import org.gradle.api.plugins.ExtensionContainer;
|
||||
import org.gradle.api.plugins.JavaApplication;
|
||||
import org.gradle.api.plugins.JavaLibraryPlugin;
|
||||
import org.gradle.api.plugins.JavaPlugin;
|
||||
import org.gradle.api.provider.Provider;
|
||||
import org.gradle.api.tasks.TaskContainer;
|
||||
import org.gradle.jvm.tasks.Jar;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public class NativeImagePlugin implements Plugin<Project> {
|
||||
|
||||
public static final String NATIVE_IMAGE_TASK_NAME = "nativeImage";
|
||||
public static final String CONFIGURE_NATIVE_IMAGE_TASK_NAME = "configureNativeImage";
|
||||
public static final String NATIVE_IMAGE_CONFIGURATION_FOLDER_NAME = "native-image";
|
||||
|
||||
public static final String NATIVE_IMAGE_TASK_GROUP = "native image";
|
||||
|
||||
@Override
|
||||
public void apply(Project project) {
|
||||
project.getPluginManager().apply(JavaLibraryPlugin.class);
|
||||
ProjectLayout layout = project.getLayout();
|
||||
ExtensionContainer extensionContainer = project.getExtensions();
|
||||
JavaApplication javaApplicationExtension =
|
||||
Optional.ofNullable(extensionContainer.findByType(JavaApplication.class))
|
||||
.orElseGet(() -> extensionContainer.create("application", JavaApplication.class));
|
||||
|
||||
TaskContainer tasks = project.getTasks();
|
||||
Provider<Jar> jarTaskProvider = tasks.named(JavaPlugin.JAR_TASK_NAME, Jar.class, jar -> {
|
||||
jar.from(layout.getProjectDirectory().dir(NATIVE_IMAGE_CONFIGURATION_FOLDER_NAME), copySpec -> {
|
||||
copySpec.into(
|
||||
String.format("META-INF/native-image/%s/%s/",
|
||||
project.getName(),
|
||||
project.getGroup()
|
||||
)
|
||||
);
|
||||
});
|
||||
});
|
||||
tasks.register(CONFIGURE_NATIVE_IMAGE_TASK_NAME, NativeImageConfigurationTask.class);
|
||||
tasks.register(NATIVE_IMAGE_TASK_NAME, NativeImageTask.class, nativeImageTask -> {
|
||||
ConfigurationContainer configurations = project.getConfigurations();
|
||||
FileCollection classpath = project.files(jarTaskProvider,
|
||||
configurations.getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME));
|
||||
nativeImageTask.getClasspath().set(classpath);
|
||||
});
|
||||
}
|
||||
}
|
@@ -0,0 +1,127 @@
|
||||
package net.woggioni.gradle.nativeimage;
|
||||
|
||||
import org.gradle.api.Project;
|
||||
import org.gradle.api.file.Directory;
|
||||
import org.gradle.api.file.DirectoryProperty;
|
||||
import org.gradle.api.file.FileCollection;
|
||||
import org.gradle.api.file.ProjectLayout;
|
||||
import org.gradle.api.file.RegularFileProperty;
|
||||
import org.gradle.api.logging.Logger;
|
||||
import org.gradle.api.plugins.BasePluginExtension;
|
||||
import org.gradle.api.plugins.ExtensionContainer;
|
||||
import org.gradle.api.plugins.JavaApplication;
|
||||
import org.gradle.api.plugins.JavaPluginExtension;
|
||||
import org.gradle.api.provider.Property;
|
||||
import org.gradle.api.provider.Provider;
|
||||
import org.gradle.api.tasks.Classpath;
|
||||
import org.gradle.api.tasks.Exec;
|
||||
import org.gradle.api.tasks.Input;
|
||||
import org.gradle.api.tasks.InputDirectory;
|
||||
import org.gradle.api.tasks.Optional;
|
||||
import org.gradle.api.tasks.OutputFile;
|
||||
import org.gradle.internal.jvm.JavaModuleDetector;
|
||||
import org.gradle.jvm.toolchain.JavaInstallationMetadata;
|
||||
import org.gradle.jvm.toolchain.JavaLauncher;
|
||||
import org.gradle.jvm.toolchain.JavaToolchainService;
|
||||
import org.gradle.process.CommandLineArgumentProvider;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static java.util.Optional.ofNullable;
|
||||
import static net.woggioni.gradle.nativeimage.NativeImagePlugin.NATIVE_IMAGE_TASK_GROUP;
|
||||
|
||||
public abstract class NativeImageTask extends Exec {
|
||||
|
||||
@Classpath
|
||||
public abstract Property<FileCollection> getClasspath();
|
||||
|
||||
@InputDirectory
|
||||
public abstract DirectoryProperty getGraalVmHome();
|
||||
|
||||
@Input
|
||||
public abstract Property<Boolean> getUseJpms();
|
||||
@Input
|
||||
public abstract Property<Boolean> getEnableFallback();
|
||||
|
||||
@Input
|
||||
public abstract Property<String> getMainClass();
|
||||
|
||||
@Input
|
||||
@Optional
|
||||
public abstract Property<String> getMainModule();
|
||||
|
||||
@Inject
|
||||
protected abstract JavaModuleDetector getJavaModuleDetector();
|
||||
|
||||
@OutputFile
|
||||
protected abstract RegularFileProperty getOutputFile();
|
||||
private final Logger logger;
|
||||
public NativeImageTask() {
|
||||
Project project = getProject();
|
||||
logger = project.getLogger();
|
||||
setGroup(NATIVE_IMAGE_TASK_GROUP);
|
||||
setDescription("Create a native image of the application using GraalVM");
|
||||
getUseJpms().convention(false);
|
||||
getEnableFallback().convention(false);
|
||||
ExtensionContainer ext = project.getExtensions();
|
||||
JavaApplication javaApplication = ext.findByType(JavaApplication.class);
|
||||
if(!Objects.isNull(javaApplication)) {
|
||||
getMainClass().convention(javaApplication.getMainClass());
|
||||
getMainModule().convention(javaApplication.getMainModule());
|
||||
}
|
||||
getClasspath().convention(project.files());
|
||||
ProjectLayout layout = project.getLayout();
|
||||
JavaToolchainService javaToolchainService = ext.findByType(JavaToolchainService.class);
|
||||
JavaPluginExtension javaPluginExtension = ext.findByType(JavaPluginExtension.class);
|
||||
Provider<Directory> graalHomeDirectoryProvider = ofNullable(javaPluginExtension.getToolchain()).map(javaToolchainSpec ->
|
||||
javaToolchainService.launcherFor(javaToolchainSpec)
|
||||
).map(javaLauncher ->
|
||||
javaLauncher.map(JavaLauncher::getMetadata).map(JavaInstallationMetadata::getInstallationPath)
|
||||
).orElseGet(() -> layout.dir(project.provider(() ->project.file(System.getProperty("java.home")))));
|
||||
getGraalVmHome().convention(graalHomeDirectoryProvider);
|
||||
|
||||
BasePluginExtension basePluginExtension =
|
||||
ext.getByType(BasePluginExtension.class);
|
||||
getOutputFile().convention(basePluginExtension.getLibsDirectory().file(project.getName()));
|
||||
Object executableProvider = new Object() {
|
||||
@Override
|
||||
public String toString() {
|
||||
return getGraalVmHome().get() + "/bin/native-image";
|
||||
}
|
||||
};
|
||||
executable(executableProvider);
|
||||
|
||||
CommandLineArgumentProvider argumentProvider = new CommandLineArgumentProvider() {
|
||||
@Override
|
||||
public Iterable<String> asArguments() {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(!getEnableFallback().get()) {
|
||||
result.add("--no-fallback");
|
||||
}
|
||||
JavaModuleDetector javaModuleDetector = getJavaModuleDetector();
|
||||
boolean useJpms = getUseJpms().get();
|
||||
FileCollection classpath = getClasspath().get();
|
||||
FileCollection cp = javaModuleDetector.inferClasspath(useJpms, classpath);
|
||||
FileCollection mp = javaModuleDetector.inferModulePath(useJpms, classpath);
|
||||
if(!cp.isEmpty()) {
|
||||
result.add("-cp");
|
||||
result.add(cp.getAsPath());
|
||||
}
|
||||
if(!mp.isEmpty()) {
|
||||
result.add("-p");
|
||||
result.add(mp.getAsPath());
|
||||
}
|
||||
result.add("-o");
|
||||
result.add(getOutputFile().get().getAsFile().toString());
|
||||
result.add(getMainClass().get());
|
||||
logger.info("Native image arguments: " + String.join(" ", result));
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
};
|
||||
getArgumentProviders().add(argumentProvider);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user