package aQute.bnd.maven.export.plugin; import static org.apache.maven.plugins.annotations.LifecyclePhase.PACKAGE; import java.io.File; import java.util.List; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; import org.apache.maven.project.ProjectDependenciesResolver; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystemSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import aQute.bnd.build.Workspace; import aQute.bnd.maven.lib.resolve.DependencyResolver; import aQute.bnd.osgi.Constants; import aQute.bnd.repository.fileset.FileSetRepository; import aQute.bnd.service.RepositoryPlugin; import aQute.lib.io.IO; import biz.aQute.resolve.Bndrun; @Mojo(name = "export", defaultPhase = PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME) public class ExportMojo extends AbstractMojo { private static final Logger logger = LoggerFactory.getLogger(ExportMojo.class); @Parameter(defaultValue = "${project}", readonly = true, required = true) private MavenProject project; @Parameter(defaultValue = "${repositorySystemSession}", readonly = true, required = true) private RepositorySystemSession repositorySession; @Parameter(readonly = true, required = true) private List<File> bndruns; @Parameter(defaultValue = "${project.build.directory}", readonly = true) private File targetDir; @Parameter(readonly = true, required = false) private List<File> bundles; @Parameter(defaultValue = "true") private boolean useDefaults; @Parameter(defaultValue = "false") private boolean resolve; @Parameter(defaultValue = "true") private boolean failOnChanges; @Parameter(defaultValue = "false") private boolean bundlesOnly; @Parameter(defaultValue = "${session}", readonly = true) private MavenSession session; private int errors = 0; @Component private RepositorySystem system; @Component private ProjectDependenciesResolver resolver; public void execute() throws MojoExecutionException, MojoFailureException { try { DependencyResolver dependencyResolver = new DependencyResolver(project, repositorySession, resolver, system); FileSetRepository fileSetRepository = dependencyResolver.getFileSetRepository(project.getName(), bundles, useDefaults); for (File runFile : bndruns) { export(runFile, fileSetRepository); } } catch (Exception e) { throw new MojoExecutionException(e.getMessage(), e); } if (errors > 0) throw new MojoExecutionException(errors + " errors found"); } private void export(File runFile, FileSetRepository fileSetRepository) throws Exception { if (!runFile.exists()) { logger.error("Could not find bnd run file {}", runFile); errors++; return; } String bndrun = getNamePart(runFile); File temporaryDir = new File(targetDir, "tmp/export/" + bndrun); File cnf = new File(temporaryDir, Workspace.CNFDIR); IO.mkdirs(cnf); try (Bndrun run = Bndrun.createBndrun(null, runFile)) { run.setBase(temporaryDir); Workspace workspace = run.getWorkspace(); workspace.setBuildDir(cnf); workspace.setOffline(session.getSettings().isOffline()); workspace.addBasicPlugin(fileSetRepository); for (RepositoryPlugin repo : workspace.getRepositories()) { repo.list(null); } run.getInfo(workspace); report(run); if (!run.isOk()) { return; } if (resolve) { try { String runBundles = run.resolve(failOnChanges, false); if (!run.isOk()) { return; } run.setProperty(Constants.RUNBUNDLES, runBundles); } finally { report(run); } } try { if (bundlesOnly) { File runbundlesDir = new File(targetDir, "export/" + bndrun); IO.mkdirs(runbundlesDir); run.exportRunbundles(null, runbundlesDir); } else { File executableJar = new File(targetDir, bndrun + ".jar"); run.export(null, false, executableJar); } } finally { report(run); } } } private String getNamePart(File runFile) { String nameExt = runFile.getName(); int pos = nameExt.lastIndexOf('.'); return (pos > 0) ? nameExt.substring(0, pos) : nameExt; } private void report(Bndrun run) { for (String warning : run.getWarnings()) { logger.warn("Warning : {}", warning); } for (String error : run.getErrors()) { logger.error("Error : {}", error); errors++; } } }