in arthur-maven-plugin/src/main/java/org/apache/geronimo/arthur/maven/mojo/JibMojo.java [465:515]
private FileEntriesLayer findNatives() {
final Path home = findHome();
getLog().info("Using natives from '" + home + "'");
final Path jreLib = home.resolve("jre/lib");
final boolean isWin = Files.exists(jreLib.resolve("java.lib"));
Path nativeFolder = isWin ?
jreLib /* win/cygwin */ :
jreLib.resolve(System.getProperty("os.arch", "amd64")); // older graalvm, for 20.x it is no more needed
if (!Files.exists(nativeFolder)) {
nativeFolder = nativeFolder.getParent();
try {
if (!Files.exists(nativeFolder) || !Files.list(nativeFolder).anyMatch(it -> it.getFileName().toString().endsWith(".so"))) {
nativeFolder = home.resolve("lib");
if (!Files.exists(nativeFolder)) { // java 17 and after
throw new IllegalArgumentException("No native folder '" + nativeFolder + "' found.");
}
}
} catch (final IOException e) {
throw new IllegalStateException(e);
}
}
final boolean includeAll = singletonList("true").equals(includeNatives) || singletonList("*").equals(includeNatives);
final Predicate<Path> include = includeAll ?
p -> true : path -> {
final String name = path.getFileName().toString();
return includeNatives.stream().anyMatch(n -> name.contains(isWin ? (n + ".lib") : ("lib" + n + ".so")));
};
final FileEntriesLayer.Builder builder = FileEntriesLayer.builder();
final Collection<String> collected = new ArrayList<>();
final Path nativeDir = nativeFolder; // ref for lambda
try {
Files.walkFileTree(nativeFolder, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
if (include.test(file)) {
collected.add(file.getFileName().toString());
builder.addEntry(
file, AbsoluteUnixPath.get(nativeRootDir).resolve(nativeDir.relativize(file).toString()),
FilePermissions.DEFAULT_FILE_PERMISSIONS, getTimestamp(file));
}
return super.visitFile(file, attrs);
}
});
} catch (final IOException e) {
throw new IllegalStateException(e);
}
if (!includeAll && collected.size() != includeNatives.size()) {
throw new IllegalArgumentException("Found " + collected + " but was configured to extract " + includeNatives);
}
return builder.setName("Natives").build();
}