org.codehaus.mojo.runtime.builder.MavenJarRuntimeBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.mojo.runtime.builder.MavenJarRuntimeBuilder.java

Source

package org.codehaus.mojo.runtime.builder;

/*
 * Copyright (c) 2004, Codehaus.org
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do
 * so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.project.MavenProject;
import org.codehaus.mojo.runtime.model.Runtime;
import org.codehaus.mojo.runtime.model.io.xpp3.RuntimeXpp3Writer;
import org.codehaus.mojo.runtime.util.JarMaker;
import org.codehaus.plexus.util.FileUtils;

/**
 * @author <a href="jesse.mcconnell@gmail.com">Jesse McConnell</a>
 * @version $Id$
 */
public class MavenJarRuntimeBuilder extends AbstractMavenRuntimeBuilder {
    private File runtimeOutputDirectory;

    private File runtimeLibraryDirectory;

    private File runtimeExecutableDirectory;

    private File runtimeMetaDirectory;

    public void build(Runtime runtime, MavenProject project, File runtimeFile, File outputDirectory)
            throws MavenRuntimeBuilderException {
        try {
            // prepare output directories
            initializeOutputDirectories(runtime, outputDirectory);

            // add needed dependencies to the runtime object
            prepareRuntimeDependencies(runtime, project);

            prepareRuntimeClasses();

            prepareRuntimeExecutionDependencies(project);

            // we need all the compiled classes into a jar of their own
            JarMaker projectJar = new JarMaker(runtimeLibraryDirectory,
                    project.getArtifactId() + "-" + project.getVersion() + "-runtime.jar");

            projectJar.addDirectory("**/**", "**/package.html,**/.svn/**", "",
                    new File(project.getBuild().getDirectory() + File.separator + "classes"));
            projectJar.create();

            // make a dependency reference for this newly created jar
            runtime.getJar().addDependency(
                    project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion() + "-runtime");

            // place the finalized runtime descriptor
            RuntimeXpp3Writer runtimeWriter = new RuntimeXpp3Writer();

            FileWriter fw = new FileWriter(new File(runtimeMetaDirectory, "jar.runtime"));
            runtimeWriter.write(fw, runtime);
            fw.close();

            // finally generate the end game jar
            JarMaker runtimeJar = new JarMaker(outputDirectory,
                    project.getArtifactId() + "-runtime-" + project.getVersion() + ".jar");
            runtimeJar.addDirectory("**/**", "**/package.html,**/.svn/**", "", runtimeOutputDirectory);
            runtimeJar.addManifestEntry("Main-Class", "org.codehaus.mojo.runtime.execute.RuntimeExecutor");
            runtimeJar.create();
        } catch (IOException ex) {
            throw new MavenRuntimeBuilderException("Exception while building the runtime", ex);
        }
    }

    private void prepareRuntimeClasses() throws MavenRuntimeBuilderException {
        List runtimeModelObjects = new ArrayList();
        runtimeModelObjects.add("org/codehaus/mojo/runtime/model/Executable.class");
        runtimeModelObjects.add("org/codehaus/mojo/runtime/model/Runtime.class");
        runtimeModelObjects.add("org/codehaus/mojo/runtime/model/JarRuntime.class");
        runtimeModelObjects.add("org/codehaus/mojo/runtime/model/RuntimeBase.class");
        runtimeModelObjects.add("org/codehaus/mojo/runtime/model/ShellRuntime.class");
        runtimeModelObjects.add("org/codehaus/mojo/runtime/model/io/xpp3/RuntimeXpp3Reader.class");
        runtimeModelObjects.add("org/codehaus/mojo/runtime/model/io/xpp3/RuntimeXpp3Writer.class");
        runtimeModelObjects.add("org/codehaus/plexus/util/xml/pull/XmlPullParserException.class");
        runtimeModelObjects.add("org/codehaus/plexus/util/xml/pull/XmlPullParser.class");
        runtimeModelObjects.add("org/codehaus/plexus/util/xml/pull/MXParser.class");
        runtimeModelObjects.add("org/codehaus/mojo/runtime/execute/RuntimeClassLoader.class");
        runtimeModelObjects.add("org/codehaus/mojo/runtime/execute/RuntimeExecutor.class");

        try {
            for (Iterator i = runtimeModelObjects.iterator(); i.hasNext();) {
                String file = (String) i.next();
                FileUtils.copyURLToFile(Thread.currentThread().getContextClassLoader().getResource(file),
                        new File(runtimeOutputDirectory + File.separator + file));
            }
        } catch (IOException e) {
            throw new MavenRuntimeBuilderException("unable to prepare runtime classes", e);
        }
    }

    private void initializeOutputDirectories(Runtime runtime, File outputDirectory)
            throws MavenRuntimeBuilderException {
        runtimeOutputDirectory = new File(outputDirectory, runtime.getJar().getId());
        runtimeLibraryDirectory = new File(runtimeOutputDirectory, "lib");
        runtimeExecutableDirectory = new File(runtimeOutputDirectory, "bin");
        runtimeMetaDirectory = new File(runtimeOutputDirectory, "META-INF/runtimes");

        mkdir(runtimeOutputDirectory);
        mkdir(runtimeLibraryDirectory);
        mkdir(runtimeExecutableDirectory);
        mkdir(runtimeMetaDirectory);
    }

    /**
     * put the dependencies that we are interested in using into the runtime object
     */
    private void prepareRuntimeDependencies(Runtime runtime, MavenProject project) {
        List artifactList = project.getRuntimeArtifacts();
        List dependencies = runtime.getJar().getDependencies();

        for (Iterator i = artifactList.iterator(); i.hasNext();) {
            Artifact artifact = (Artifact) i.next();

            String dependency = artifact.getGroupId() + ":" + artifact.getArtifactId() + ":"
                    + artifact.getVersion();

            // let preexisting dependencies take precedence
            if (!dependencies.contains(dependency)) {
                runtime.getJar().addDependency(dependency);
            }
        }
    }

    //  copy libs to script dir
    private void prepareRuntimeExecutionDependencies(MavenProject project) throws MavenRuntimeBuilderException {
        try {
            List classpathElements = project.getRuntimeClasspathElements();

            for (Iterator i = classpathElements.iterator(); i.hasNext();) {
                String element = (String) i.next();

                if (element.endsWith(".jar")) {
                    FileUtils.copyFileToDirectory((String) i.next(), runtimeLibraryDirectory.getAbsolutePath());
                }
            }
        } catch (Exception e) {
            throw new MavenRuntimeBuilderException("unable to prepare runtime execution dependencies", e);
        }
    }
}