in atomos.utils/atomos.utils.core/src/main/java/org/apache/felix/atomos/utils/core/plugins/finaliser/ni/NativeImagePlugin.java [41:140]
public void doFinal(Context context)
{
try
{
// prepare the Directorys
Path native_image_build = config.nativeImageOutputDirectory().resolve(
"native_image_build");
Files.createDirectories(native_image_build);
Path cpDir = native_image_build.resolve("cp");
Files.createDirectories(cpDir);
Path cfgDir = native_image_build.resolve("cfg");
Files.createDirectories(cfgDir);
Path binDir = native_image_build.resolve("bin");
Files.createDirectories(binDir);
//prepare classpath
List<Path> classpath = context.getFiles(FileType.ARTIFACT,
FileType.INDEX_JAR).collect(Collectors.toList());
System.out.println(native_image_build);
List<Path> copyOfClassPath = new ArrayList<>();
classpath.forEach(p -> {
try
{
Path newPath = Files.copy(p, cpDir.resolve(p.getFileName()));
copyOfClassPath.add(newPath);
}
catch (IOException e)
{
throw new UncheckedIOException(e);
}
});
// prepare configuration files
DynamicProxyConfiguration dynPrC = context.getDynamicProxyConfig();
String sDynPrC = NativeImageConfigJsonProvider.newInstance().json(dynPrC);
Path pDynPrC = Files.write(cfgDir.resolve("DynamicProxyConfig.json"),
sDynPrC.getBytes(StandardCharsets.UTF_8));
ReflectionConfiguration refCs = context.getReflectConfig();
String sRefCs = NativeImageConfigJsonProvider.newInstance().json(refCs);
Path pRefCs = Files.write(cfgDir.resolve("graal_reflect_config.json"),
sRefCs.getBytes(StandardCharsets.UTF_8));
ResourceConfiguration resC = context.getResourceConfig();
String sResC = NativeImageConfigJsonProvider.newInstance().json(resC);
Path pResC = Files.write(cfgDir.resolve("graal_resource_config.json"),
sResC.getBytes(StandardCharsets.UTF_8));
// build arguments
NativeImageArguments arguments = NativeImageArguments.builder().imageName(
config.nativeImageApplicationName()).allowIncompleteClasspath(true)//
.classPathFiles(Optional.ofNullable(copyOfClassPath))//
.debugAttach(false)//TODO: --debug-attach crashes build
.dynamicProxyConfigurationFile(Optional.of(pDynPrC))//
.dynamicProxyConfigurationFiles(
Optional.of(config.dynamicProxyConfigurationFiles()))//
.initializeAtBuildTimePackages(Optional.of(resC.getResourcePackages()))//
.initializeAtBuildTimePackages(Optional.ofNullable(
config.nativeImageAdditionalInitializeAtBuildTime()))//
.mainClass(config.nativeImageMainClass())//
.noFallback(Optional.ofNullable(config.noFallback()).orElse(true))//
.reflectionConfigurationFile(Optional.of(pRefCs))//
.reflectionConfigurationFiles(
Optional.of(config.reflectionConfigurationFiles()))//
.reportExceptionStackTraces(true)//
.reportUnsupportedElementsAtRuntime(true)//
.resourceConfigurationFile(Optional.of(pResC))//
.resourceConfigurationFiles(
Optional.of(config.resourceConfigurationFiles()))//
.vmFlags(Optional.ofNullable(config.nativeImageVmFlags()))//
.vmSystemProperties(
Optional.ofNullable(config.nativeImageVmSystemProperties()))//
.printClassInitialization(true)
.build();
//try to find NativeImageCli
Optional<NativeImageCli> nOptional = NativeImageCli.newInstanceFindNativeImageExecutable(
config.nativeImageExecutable());
//execute build an native image
nOptional.ifPresentOrElse(cli -> {
try
{
Path binFile = cli.execute(binDir, arguments);
context.addFile(binFile, FileType.NATIVE_IMAGE_BINARY);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}, () -> {throw new RuntimeException("Missing native image executable. Set 'GRAALVM_HOME' with the path as an environment variable");});
}
catch (Exception e)
{
if (e instanceof RuntimeException) {
throw (RuntimeException) e;
}
else {
throw new RuntimeException(e);
}
}
}