Index: pom.xml
===================================================================
--- pom.xml	(revision 942011)
+++ pom.xml	(working copy)
@@ -29,7 +29,7 @@
   </parent>
 
   <artifactId>maven-invoker-plugin</artifactId>
-  <version>1.6-SNAPSHOT</version>
+  <version>1.6.1-SNAPSHOT</version>
   <packaging>maven-plugin</packaging>
 
   <name>Maven Invoker Plugin</name>
Index: src/test/java/org/apache/maven/plugin/invoker/MetadataUtilsTest.java
===================================================================
--- src/test/java/org/apache/maven/plugin/invoker/MetadataUtilsTest.java	(revision 0)
+++ src/test/java/org/apache/maven/plugin/invoker/MetadataUtilsTest.java	(revision 0)
@@ -0,0 +1,78 @@
+package org.apache.maven.plugin.invoker;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.factory.DefaultArtifactFactory;
+import org.apache.maven.plugin.testing.ArtifactStubFactory;
+import org.apache.maven.plugin.testing.stubs.ArtifactStub;
+
+import junit.framework.TestCase;
+
+public class MetadataUtilsTest extends TestCase {
+
+	public void testCreateMetadata() throws Exception {
+		
+		System.out.println("MetadataUtilsTest.testCreateMetadata()");
+		String currentDir = System.getProperty("user.dir");
+		File testFile = new File(currentDir + "/target/maven-invoker-plugin/maven-invoker-pluginmock.xml");
+		
+		if(!testFile.exists()) {
+			testFile.mkdirs();
+			testFile.createNewFile();
+			System.out.println("MetadataUtilsTest.testCreateMetadata() created test file:" + testFile.getAbsolutePath());
+		} else {
+			System.out.println("MetadataUtilsTest.testCreateMetadata() test file exists at:" + testFile.getAbsolutePath());
+		}
+		
+		ArtifactStubFactory factory = new ArtifactStubFactory();
+		Artifact artifact = factory.createArtifact("groupIdTest", "artifactIdTest", "0.1-SNAPSHOT");
+	
+		MetadataUtils.createMetadata(testFile, artifact);
+	}
+	
+	public void testCreateMetadataLocked() throws Exception {
+		
+		System.out.println("MetadataUtilsTest.testCreateMetadataLocked()");
+		String currentDir = System.getProperty("user.dir");
+		
+		System.out.println("MetadataUtilsTest.testCreateMetadataLocked() currentDir:\n" + currentDir);
+		//String currentDir = "";
+		String mockPlugin = currentDir + "/target/maven-invoker-plugin/maven-metadata-local.xml";
+		String mockPluginLock = currentDir + "/target/maven-invoker-plugin/maven-metadata-local.xml.lock";
+		
+		File testFile = new File(mockPlugin);
+		File testFileLock = new File(mockPluginLock);
+		
+		if(!testFile.exists()) {
+			testFile.getParentFile().mkdirs();
+			testFile.createNewFile();
+			System.out.println("MetadataUtilsTest.testCreateMetadataLocked() created test file:\n" + testFile.getAbsolutePath());
+		} else {
+			System.out.println("MetadataUtilsTest.testCreateMetadataLocked() test file exists at:\n" + testFile.getAbsolutePath());
+		}
+		
+		if(!testFileLock.exists()) {
+			testFileLock.getParentFile().mkdirs();
+			testFileLock.createNewFile();
+			System.out.println("MetadataUtilsTest.testCreateMetadataLocked() created test lock file:\n" + testFileLock.getAbsolutePath());
+		} else {
+			System.out.println("MetadataUtilsTest.testCreateMetadataLocked() test lock file exists at:\n" + testFileLock.getAbsolutePath());
+		}
+		
+		ArtifactStubFactory factory = new ArtifactStubFactory();
+		Artifact artifact = factory.createArtifact("groupIdTest", "artifactIdTest", "0.1-SNAPSHOT");
+	
+		String expectedError = null;
+		try {
+			MetadataUtils.createMetadata(testFile, artifact);
+		} catch (IOException e) {
+			expectedError = e.toString();
+		}
+		
+		assertEquals("java.io.IOException: Unable to obtain lock on " + testFile.getAbsolutePath() + ".lock",expectedError);
+	}
+
+}
Index: src/main/java/org/apache/maven/plugin/invoker/MetadataUtils.java
===================================================================
--- src/main/java/org/apache/maven/plugin/invoker/MetadataUtils.java	(revision 942011)
+++ src/main/java/org/apache/maven/plugin/invoker/MetadataUtils.java	(working copy)
@@ -167,20 +167,61 @@
         }
     }
 
-    private static void writeMetadata( File metadataFile, Xpp3Dom metadata )
+    private static synchronized void writeMetadata( File metadataFile, Xpp3Dom metadata )
         throws IOException
     {
         metadataFile.getParentFile().mkdirs();
-
+        String lockFileAbsolutePath = metadataFile.getAbsolutePath() + ".lock";
+        System.out.println("MetadataUtils.writeMetadata() lockFileAbsolutePath:\n" + lockFileAbsolutePath);
+		File metadataFileLockFile = new File(lockFileAbsolutePath);
+        
         Writer writer = WriterFactory.newXmlWriter( metadataFile );
         try
         {
-            Xpp3DomWriter.write( writer, metadata );
+        	boolean fileLockExists = metadataFileLockFile.exists();
+        	if(!fileLockExists) {
+        		//lock file does not exist > ok to update
+        		fileWriteWithTheadSafeLock(metadata, lockFileAbsolutePath,
+						metadataFileLockFile, writer);
+        	}
+        	else {
+        		System.out.println("MetadataUtils.writeMetadata() lockFile found");
+        		int timeout = 0;
+	        	while(fileLockExists && timeout < 15) { 
+	        		//wait for the lock be be cleared or 15 sec timeout which ever comes first
+	        		System.out.println("MetadataUtils.writeMetadata() about to sleep, timeout " + timeout + " sec");
+	        		Thread.sleep(1000);
+	        		fileLockExists = metadataFileLockFile.exists();
+	        		timeout++;
+	        	}
+	        	//assert we were able to oblain a lock, if not throw a fault
+	        	if(fileLockExists) {
+	        		throw new IOException("Unable to obtain lock on " + lockFileAbsolutePath);
+	        	} else {
+	        		fileWriteWithTheadSafeLock(metadata, lockFileAbsolutePath,
+							metadataFileLockFile, writer);
+	        	}
+        	}
+        }
+        catch(InterruptedException e) {
+        	throw new IOException("Unable to obtain lock on :" + lockFileAbsolutePath);
         }
         finally
         {
+        	//delete the .lock file
+        	metadataFileLockFile.delete();
             IOUtil.close( writer );
         }
     }
 
+	private static void fileWriteWithTheadSafeLock(Xpp3Dom metadata,
+			String lockFileAbsolutePath, File metadataFileLockFile,
+			Writer writer) throws IOException {
+		//add a .lock file
+		System.out.println("MetadataUtils.writeMetadata() add a lockfile:\n" + lockFileAbsolutePath);
+		metadataFileLockFile.createNewFile();
+		Xpp3DomWriter.write( writer, metadata );
+		Xpp3DomWriter.write( writer, metadata );
+	}
+
 }

