001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020 package org.apache.geronimo.genesis.plugins.maven; 021 022 import java.io.File; 023 import java.io.IOException; 024 025 import java.util.Map; 026 import java.util.Iterator; 027 028 import org.apache.geronimo.genesis.MojoSupport; 029 import org.apache.geronimo.genesis.ant.AntHelper; 030 031 import org.apache.maven.project.MavenProject; 032 import org.apache.maven.plugin.MojoExecutionException; 033 import org.apache.maven.plugin.MojoFailureException; 034 035 import org.codehaus.plexus.util.Os; 036 import org.codehaus.plexus.util.DirectoryScanner; 037 038 import org.apache.tools.ant.taskdefs.ExecTask; 039 040 /** 041 * Invoke Maven in a sub-process. 042 * 043 * @goal invoke 044 * 045 * @version $Rev: 479786 $ $Date: 2006-11-27 14:23:36 -0800 (Mon, 27 Nov 2006) $ 046 */ 047 public class InvokeMavenMojo 048 extends MojoSupport 049 { 050 /** 051 * Defines the set of pom.xml files to invoke. 052 * 053 * @parameter 054 * @required 055 */ 056 private DirectoryScanner fileset = null; 057 058 /** 059 * A set of command-line flags to pass to Maven. 060 * 061 * @parameter 062 */ 063 private String[] flags = null; 064 065 /** 066 * A map of parameters to define via -D 067 * 068 * @parameter 069 */ 070 private Map parameters = null; 071 072 /** 073 * A set of profiles to activate via -P 074 * 075 * @parameter 076 */ 077 private String[] profiles = null; 078 079 /** 080 * A set of goals (or phases) to be invoked. 081 * 082 * @parameter 083 */ 084 private String[] goals = null; 085 086 /** 087 * @component 088 */ 089 protected AntHelper ant; 090 091 // 092 // MojoSupport Hooks 093 // 094 095 /** 096 * The maven project. 097 * 098 * @parameter expression="${project}" 099 * @required 100 * @readonly 101 */ 102 protected MavenProject project = null; 103 104 protected MavenProject getProject() { 105 return project; 106 } 107 108 protected void init() throws MojoExecutionException, MojoFailureException { 109 super.init(); 110 111 ant.setProject(getProject()); 112 } 113 114 protected void doExecute() throws Exception { 115 fileset.addDefaultExcludes(); 116 fileset.scan(); 117 118 String[] filenames = fileset.getIncludedFiles(); 119 120 if (filenames.length == 0) { 121 throw new MojoExecutionException("At least one pom file must be included"); 122 } 123 124 for (int i=0; i<filenames.length; i++) { 125 invoke(new File(fileset.getBasedir(), filenames[i])); 126 } 127 } 128 129 private void invoke(final File pom) throws Exception { 130 if (!pom.exists()) { 131 throw new MojoExecutionException("Missing pom file: " + pom); 132 } 133 134 log.info("Invoking: " + pom); 135 136 ExecTask exec = (ExecTask)ant.createTask("exec"); 137 138 exec.setExecutable(getMavenExecutable().getAbsolutePath()); 139 exec.setFailIfExecutionFails(true); 140 exec.setFailonerror(true); 141 142 if (flags != null) { 143 for (int i=0; i < flags.length; i++) { 144 exec.createArg().setValue(flags[i]); 145 } 146 } 147 148 if (parameters != null) { 149 Iterator iter = parameters.keySet().iterator(); 150 while (iter.hasNext()) { 151 String name = (String)iter.next(); 152 Object value = parameters.get(name); 153 exec.createArg().setValue("-D" + name + "=" + value); 154 } 155 } 156 157 if (profiles != null && profiles.length != 0) { 158 StringBuffer buff = new StringBuffer("-P"); 159 160 for (int i=0; i < profiles.length; i++) { 161 buff.append(profiles[i]); 162 if (i + 1 < profiles.length) { 163 buff.append(","); 164 } 165 } 166 167 exec.createArg().setValue(buff.toString()); 168 } 169 170 if (goals != null) { 171 for (int i=0; i < goals.length; i++) { 172 exec.createArg().setValue(goals[i]); 173 } 174 } 175 176 exec.createArg().setValue("-f"); 177 exec.createArg().setFile(pom); 178 179 // Batch mode to use simple download progress output 180 exec.createArg().setValue("--batch-mode"); 181 182 // Always enable verbose error output 183 exec.createArg().setValue("--errors"); 184 185 exec.execute(); 186 } 187 188 private File getMavenExecutable() throws MojoExecutionException, IOException { 189 String path = System.getProperty("maven.home"); 190 if (path == null) { 191 // This should really never happen 192 throw new MojoExecutionException("Missing maven.home system property"); 193 } 194 195 File home = new File(path); 196 File cmd; 197 198 if (Os.isFamily("windows")) { 199 cmd = new File(home, "bin/mvn.bat"); 200 } 201 else { 202 cmd = new File(home, "bin/mvn"); 203 } 204 205 cmd = cmd.getCanonicalFile(); 206 if (!cmd.exists()) { 207 throw new MojoExecutionException("Maven executable not found at: " + cmd); 208 } 209 210 return cmd; 211 } 212 }