in tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/AssemblyMojo.java [504:664]
protected void doExecute() throws Exception {
if (!startupProfiles.isEmpty() || !bootProfiles.isEmpty() || !installedProfiles.isEmpty()) {
if (profilesUris.size() == 0) {
throw new IllegalArgumentException("profilesUris option must be specified");
}
}
Builder builder = Builder.newInstance();
// Set up miscellaneous options
builder.extraProtocols(extraProtocols);
builder.offline(mavenSession.isOffline());
builder.localRepository(localRepo.getBasedir());
builder.resolverWrapper((resolver) -> new ReactorMavenResolver(reactor, resolver));
builder.javase(javase);
builder.karafVersion(karafVersion);
builder.useReferenceUrls(useReferenceUrls);
builder.defaultAddAll(installAllFeaturesByDefault);
builder.ignoreDependencyFlag(ignoreDependencyFlag);
builder.propertyEdits(configurePropertyEdits());
builder.translatedUrls(configureTranslatedUrls());
builder.pidsToExtract(pidsToExtract);
builder.writeProfiles(writeProfiles);
builder.generateConsistencyReport(generateConsistencyReport);
builder.setConsistencyReportProjectName(consistencyReportProjectName);
builder.setConsistencyReportProjectVersion(consistencyReportProjectVersion);
builder.environment(environment);
builder.defaultStartLevel(defaultStartLevel);
if (featuresProcessing != null) {
builder.setFeaturesProcessing(featuresProcessing.toPath());
}
if (resolverParallelism > 0) {
builder.resolverParallelism(resolverParallelism);
}
// Set up remote repositories from Maven build, to be used by pax-url-aether resolver
String remoteRepositories = MavenUtil.remoteRepositoryList(project.getRemoteProjectRepositories());
getLog().info("Using repositories:");
for (String r : remoteRepositories.split(",")) {
getLog().info(" " + r);
}
builder.mavenRepositories(remoteRepositories);
// Set up config and system properties
config.forEach(builder::config);
system.forEach(builder::system);
// Set up blacklisted items
builder.blacklistBundles(blacklistedBundles);
builder.blacklistFeatures(blacklistedFeatures);
builder.blacklistProfiles(blacklistedProfiles);
builder.blacklistRepositories(blacklistedRepositories);
builder.blacklistPolicy(blacklistPolicy);
// Creating system directory
configureWorkDirectory();
getLog().info("Creating work directory: " + workDirectory);
builder.homeDirectory(workDirectory.toPath());
// Loading KARs and features repositories
getLog().info("Loading direct KAR and features XML dependencies");
processDirectMavenDependencies();
// Set up profiles and libraries
profilesUris.forEach(builder::profilesUris);
libraries.forEach(builder::libraries);
// Startup stage
detectStartupKarsAndFeatures(builder);
builder.defaultStage(Builder.Stage.Startup)
.kars(toArray(startupKars))
.repositories(startupFeatures.isEmpty() && startupProfiles.isEmpty() && installAllFeaturesByDefault, toArray(startupRepositories))
.features(toArray(startupFeatures))
.bundles(toArray(startupBundles))
.profiles(toArray(startupProfiles));
// Installed stage
builder.defaultStage(Builder.Stage.Installed)
.kars(toArray(installedKars))
.repositories(installedFeatures.isEmpty() && installedProfiles.isEmpty() && installAllFeaturesByDefault, toArray(installedRepositories))
.features(toArray(installedFeatures))
.bundles(toArray(installedBundles))
.profiles(toArray(installedProfiles));
// Boot stage
builder.defaultStage(Builder.Stage.Boot)
.kars(toArray(bootKars))
.repositories(bootFeatures.isEmpty() && bootProfiles.isEmpty() && installAllFeaturesByDefault, toArray(bootRepositories))
.firstStageBootFeatures(toArray(firstStageBootFeatures))
.features(toArray(bootFeatures))
.bundles(toArray(bootBundles))
.profiles(toArray(bootProfiles));
// Generate the assembly
builder.generateAssembly();
// Include project classes content if not specified otherwise
if (includeBuildOutputDirectory)
IoUtils.copyDirectory(new File(project.getBuild().getOutputDirectory()), workDirectory);
// Overwrite assembly dir contents with source directory (not filtered) when directory exists
if (sourceDirectory.exists())
IoUtils.copyDirectory(sourceDirectory, workDirectory);
// Chmod the bin/* scripts
File[] files = new File(workDirectory, "bin").listFiles();
if (files != null) {
for (File file : files) {
if (!file.getName().endsWith(".bat")) {
try {
Files.setPosixFilePermissions(file.toPath(), PosixFilePermissions.fromString("rwxr-xr-x"));
} catch (Throwable ignore) {
// we tried our best, perhaps the OS does not support POSIX file perms.
}
}
}
}
if (filesToRemove != null) {
final Path base = workDirectory.toPath();
filesToRemove.forEach(toDrop -> {
final int lastSep = Math.max(toDrop.lastIndexOf('/'), toDrop.lastIndexOf(File.separatorChar));
final boolean startsWithDir = toDrop.contains(File.separator) || toDrop.contains("/");
final String name = !startsWithDir ? toDrop : toDrop.substring(lastSep + 1);
final Path dir = !startsWithDir ? base : base.resolve(toDrop.substring(0, lastSep));
final int wildcard = name.lastIndexOf('*');
final Predicate<String> matcher;
if (wildcard >= 0) {
final String suffix = name.substring(wildcard + 1);
final String prefix = name.substring(0, wildcard);
matcher = n -> n.startsWith(prefix) && n.endsWith(suffix);
} else {
// we likely bet this case will not happen often (to ignore the version at least)
// so we don't optimize this branch by deleting directly the file
matcher = name::equals;
}
try {
final List<Path> toDelete = Files.list(dir)
.filter(it -> matcher.test(it.getFileName().toString()))
.collect(toList());
if (toDelete.isEmpty()) {
getLog().info("File deletion '" + toDrop + "' ignored (not found)");
} else {
toDelete.stream().peek(it -> getLog().info("Deleting '" + base.relativize(it) + "'")).forEach(it -> {
try {
if (Files.isDirectory(it)) {
IoUtils.deleteRecursive(it.toFile());
} else {
Files.delete(it);
}
} catch (final IOException e) {
throw new IllegalStateException(e);
}
});
}
} catch (final IOException e) {
throw new IllegalStateException(e);
}
});
}
}