All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.caucho.maven.BaratineMojo Maven / Gradle / Ivy

package com.caucho.maven;

import org.apache.maven.archiver.MavenArchiveConfiguration;
import org.apache.maven.archiver.MavenArchiver;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.execution.MavenSession;
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.LifecyclePhase;
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.MavenProjectHelper;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.jar.JarArchiver;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Mojo(name = "baratine", defaultPhase = LifecyclePhase.PACKAGE,
      requiresProject = true, threadSafe = true,
      requiresDependencyResolution = ResolutionScope.RUNTIME)
public class BaratineMojo extends BaratineBaseMojo
{
  private static final String[] EXCLUDES = new String[]{"META-INF/baratine/**"};

  private static final String[] INCLUDES = new String[]{"**/**"};

  @Parameter(defaultValue = "${session}", readonly = true, required = true)
  private MavenSession session;

  @Parameter
  private String[] includes;

  @Parameter
  private String[] excludes;

  @Parameter
  private boolean includeBaratine = false;

  @Component(role = Archiver.class, hint = "jar")
  private JarArchiver archiver;

  @Parameter()
  private MavenArchiveConfiguration archive = new MavenArchiveConfiguration();

  @Component
  private MavenProjectHelper projectHelper;

  @Parameter(defaultValue = "${project.build.outputDirectory}", required = true)
  private File classesDirectory;

  @Parameter(required = false)
  private String executableName;

  @Parameter(defaultValue = "true", required = false)
  private boolean buildExecutable;

  protected File getBarFile()
  {
    return new File(outputDirectory, barName + ".bar");
  }

  protected File getExecutableBarFile()
  {
    return new File(outputDirectory, "executable-" + barName + ".jar");
  }

  protected File getClassesDirectory()
  {
    return classesDirectory;
  }

  public File createBar()
    throws MojoExecutionException
  {
    File bar = getBarFile();

    MavenArchiver archiver = new MavenArchiver();

    archiver.setArchiver(this.archiver);

    archiver.setOutputFile(bar);

    try {
      File contentDirectory = getClassesDirectory();
      this.archiver.addDirectory(contentDirectory,
                                 "classes/",
                                 getIncludes(),
                                 getExcludes());

      String baratineMetaName = "META-INF"
                                + File.separatorChar
                                + "baratine";

      File baratineMeta = new File(contentDirectory, baratineMetaName);

      if (baratineMeta.exists())
        this.archiver.addDirectory(baratineMeta,
                                   baratineMetaName
                                   + File.separatorChar);

      for (Object x : project.getArtifacts()) {
        Artifact a = (Artifact) x;

        if (!"jar".equals(a.getType()))
          continue;

        if (!includeBaratine && "io.baratine".equals(a.getGroupId())) {
          getLog().info("skipping artifact "
                        + a.getId()
                        + ':'
                        + a.getArtifactId()
                        + ':'
                        + a.getSelectedVersion());

          continue;
        }

        File file = a.getFile();
        String name = file.getName();

        int lastSlash = name.lastIndexOf(File.separator);

        if (lastSlash > -1)
          name = name.substring(lastSlash + 1);

        this.archiver.addFile(file, "lib/" + name);
      }

      File web = new File(project.getBasedir(),
                          "src"
                          + File.separatorChar
                          + "main"
                          + File.separatorChar
                          + "web");

      if (web.exists())
        this.archiver.addDirectory(web, "web/");

      archiver.createArchive(session, project, archive);

      return bar;
    } catch (Exception e) {
      throw new MojoExecutionException("Error assembling bar", e);
    }
  }

  private void buildExecutable(File bar) throws MojoExecutionException
  {
    String cp = getBaratine();
    cp = cp + File.pathSeparatorChar;
    cp = cp + getBaratineApi();

    String javaHome = System.getProperty("java.home");

    List command = new ArrayList<>();
    command.add(javaHome + "/bin/java");
    command.add("-cp");
    command.add(cp);
    command.add("com.caucho.cli.baratine.BaratineCommandLine");

    command.add("package");
    command.add("-o");
    command.add(getExecutableBarFile().getAbsolutePath());
    command.add(bar.getAbsolutePath());

    Set artifacts = project.getDependencyArtifacts();

    for (Object a : artifacts) {
      Artifact artifact = (Artifact) a;
      if (!"bar".equals(artifact.getType()))
        continue;

      command.add(artifact.getFile().getAbsolutePath());
    }

    Process process = null;
    try {
      ProcessBuilder processBuilder = new ProcessBuilder(command);

      processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT)
                    .redirectOutput(ProcessBuilder.Redirect.INHERIT)
                    .redirectInput(ProcessBuilder.Redirect.INHERIT);

      process = processBuilder.start();

      process.waitFor(120, TimeUnit.SECONDS);

      if (!process.isAlive()) {
        getLog().info("Baratine terminated: " + process.exitValue());
      }
    } catch (Exception e) {
      String message = String.format("exception running Baratine package %1$s",
                                     e.getMessage());
      throw new MojoExecutionException(message, e);
    } finally {
      if (process.isAlive()) {
        getLog().info("Baratine package timed out, will terminate");
        process.destroyForcibly();
      }
    }
  }

  protected final MavenProject getProject()
  {
    return project;
  }

  public void execute() throws MojoExecutionException, MojoFailureException
  {
    File bar = createBar();

    if (buildExecutable)
      buildExecutable(bar);

    getProject().getArtifact().setFile(bar);
  }

  private String[] getIncludes()
  {
    if (includes != null && includes.length > 0) {
      return includes;
    }
    return INCLUDES;
  }

  private String[] getExcludes()
  {
    if (excludes != null && excludes.length > 0) {
      return excludes;
    }
    return EXCLUDES;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy