Java tutorial
/** * Copyright 2013 Cloudera Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.cloudera.cdk.maven.plugins; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Properties; import org.apache.commons.io.FileUtils; import org.apache.hadoop.fs.Path; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; 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 static org.twdata.maven.mojoexecutor.MojoExecutor.*; /** * Package an application on the local filesystem. */ @Mojo(name = "package-app", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.RUNTIME) public class PackageAppMojo extends AbstractAppMojo { /** * The tool class to run. The specified class must have a standard Java * <code>main</code> method. */ @Parameter(property = "cdk.toolClass", required = true) private String toolClass; /** * Arguments to pass to the tool, in addition to those generated by * <code>addDependenciesToDistributedCache</code> and <code>hadoopConfiguration</code>. */ @Parameter(property = "cdk.args") private String[] args; /** * Whether to add dependencies in the <i>runtime</i> classpath to Hadoop's distributed * cache so that they are added to the classpath for MapReduce tasks * (via <code>-libjars</code>). */ @Parameter(property = "cdk.addDependenciesToDistributedCache", defaultValue = "true") private boolean addDependenciesToDistributedCache; /** * Hadoop configuration properties. */ @Parameter(property = "cdk.hadoopConfiguration") private Properties hadoopConfiguration; /** * The type of the application (<code>workflow</code>, <code>coordination</code>, * or <code>bundle</code>). */ // TODO: support applications which are more than one type @Parameter(property = "cdk.applicationType", defaultValue = "workflow") private String applicationType; /** * Whether the workflow.xml should be generated or not. */ @Parameter(property = "cdk.generateWorkflowXml", defaultValue = "true") private boolean generateWorkflowXml = true; /** * Character encoding for the auto-generated workflow file. */ @Parameter(property = "cdk.workflowFileEncoding", defaultValue = "UTF-8") private String encoding; /** * The version of the Oozie workflow schema. */ @Parameter(property = "cdk.schemaVersion", defaultValue = "0.4") private String schemaVersion; /** * The name of the workflow. */ @Parameter(property = "cdk.workflowName", defaultValue = "${project.build.finalName}") private String workflowName; /** * The coordinator.xml file to use (only for applications of type * <code>coordinator</code>). */ @Parameter(property = "cdk.coordinatorFile", defaultValue = "${basedir}/src/main/oozie/coordinator.xml") private File coordinatorFile; public void execute() throws MojoExecutionException, MojoFailureException { try { String buildDirectory = mavenProject.getBuild().getDirectory(); FileUtils.copyInputStreamToFile( getClass().getClassLoader().getResourceAsStream("assembly/oozie-app.xml"), new File(buildDirectory + "/assembly/oozie-app.xml")); } catch (IOException e) { throw new MojoExecutionException("Error copying assembly", e); } executeMojo( plugin(groupId("org.apache.maven.plugins"), artifactId("maven-assembly-plugin"), version("2.3")), goal("single"), configuration(element("descriptors", element("descriptor", "${project.build.directory}/assembly/oozie-app.xml"))), executionEnvironment(mavenProject, mavenSession, pluginManager)); if (generateWorkflowXml) { File outputDir = new File(mavenProject.getBuild().getDirectory(), applicationName); File workflowXml = new File(outputDir, "workflow.xml"); String hadoopFs = hadoopConfiguration.getProperty("fs.default.name"); if (hadoopFs == null) { throw new MojoExecutionException("Missing property 'fs.default.name' in " + "hadoopConfiguration"); } String hadoopJobTracker = hadoopConfiguration.getProperty("mapred.job.tracker"); if (hadoopJobTracker == null) { throw new MojoExecutionException( "Missing property 'mapred.job.tracker' in " + "hadoopConfiguration"); } List<Path> libJars = new ArrayList<Path>(); if (addDependenciesToDistributedCache) { File lib = new File(outputDir, "lib"); Collection<File> deps = FileUtils.listFiles(lib, new String[] { "jar" }, false); for (File dep : deps) { Path libJarPath = new Path(new Path(getAppPath(), "lib"), dep.getName()); libJarPath = new Path(hadoopFs, libJarPath); libJars.add(libJarPath); } } Workflow workflow = new Workflow(workflowXml, schemaVersion, workflowName, toolClass, args, hadoopConfiguration, hadoopFs, hadoopJobTracker, libJars); WorkflowXmlWriter workflowXmlWriter = new WorkflowXmlWriter(encoding); workflowXmlWriter.write(workflow); } if ("coordinator".equals(applicationType)) { File outputDir = new File(mavenProject.getBuild().getDirectory(), applicationName); File coordinatorXml = new File(outputDir, "coordinator.xml"); try { FileUtils.copyFile(coordinatorFile, coordinatorXml); } catch (IOException e) { throw new MojoExecutionException("Error copying coordinator file", e); } } } }