You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ke...@apache.org on 2006/09/02 15:46:10 UTC

svn commit: r439599 - in /maven/continuum/trunk: ./ continuum-core/ continuum-core/src/main/java/org/apache/maven/continuum/buildqueue/ continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/ continuum-core/src/test-projects/timeout/ continu...

Author: kenney
Date: Sat Sep  2 06:46:09 2006
New Revision: 439599

URL: http://svn.apache.org/viewvc?rev=439599&view=rev
Log:
PR: CONTINUUM-667

To support killing processes, the following dependencies are updated:
  root pom: plexus-utils -> 1.3-SNAPSHOT
  continuum-core: plexus-taskqueue to 1.0-alpha-4-SNAPSHOT 

Updated code to reflect changed API for plexus-taskqueue
(tasks have a 'getMaxExecutionTime' method).

Added a unit test and sample project to prove automatically/on demand killing of builds works.
This is more of an integration test, though. Timing issues may cause this test to
fail on systems with high load - still looking for a better alternative.

Added:
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/pom.xml   (with props)
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/continuum/
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/continuum/testprojects/
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/continuum/testprojects/timeout/
    maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/continuum/testprojects/timeout/TimeoutTest.java   (with props)
    maven/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/
    maven/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java   (with props)
    maven/continuum/trunk/continuum-core/src/test/resources/org/apache/maven/continuum/buildcontroller/
    maven/continuum/trunk/continuum-core/src/test/resources/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.xml   (with props)
Modified:
    maven/continuum/trunk/continuum-core/pom.xml
    maven/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/buildqueue/BuildProjectTask.java
    maven/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/CheckOutTask.java
    maven/continuum/trunk/continuum-core/src/test/resources/projects/continuum/continuum-core/pom.xml
    maven/continuum/trunk/pom.xml

Modified: maven/continuum/trunk/continuum-core/pom.xml
URL: http://svn.apache.org/viewvc/maven/continuum/trunk/continuum-core/pom.xml?rev=439599&r1=439598&r2=439599&view=diff
==============================================================================
--- maven/continuum/trunk/continuum-core/pom.xml (original)
+++ maven/continuum/trunk/continuum-core/pom.xml Sat Sep  2 06:46:09 2006
@@ -131,7 +131,7 @@
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-taskqueue</artifactId>
-      <version>1.0-alpha-3</version>
+      <version>1.0-alpha-4-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>jpox</groupId>

Modified: maven/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/buildqueue/BuildProjectTask.java
URL: http://svn.apache.org/viewvc/maven/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/buildqueue/BuildProjectTask.java?rev=439599&r1=439598&r2=439599&view=diff
==============================================================================
--- maven/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/buildqueue/BuildProjectTask.java (original)
+++ maven/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/buildqueue/BuildProjectTask.java Sat Sep  2 06:46:09 2006
@@ -33,6 +33,8 @@
 
     private int trigger;
 
+    private long maxExecutionTime;
+
     public BuildProjectTask( int projectId, int buildDefinitionId, int trigger )
     {
         this.projectId = projectId;
@@ -62,5 +64,15 @@
     public int getTrigger()
     {
         return trigger;
+    }
+
+    public void setMaxExecutionTime( long maxExecutionTime )
+    {
+        this.maxExecutionTime = maxExecutionTime;
+    }
+
+    public long getMaxExecutionTime()
+    {
+        return maxExecutionTime;
     }
 }

Modified: maven/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/CheckOutTask.java
URL: http://svn.apache.org/viewvc/maven/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/CheckOutTask.java?rev=439599&r1=439598&r2=439599&view=diff
==============================================================================
--- maven/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/CheckOutTask.java (original)
+++ maven/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/CheckOutTask.java Sat Sep  2 06:46:09 2006
@@ -47,4 +47,9 @@
     {
         return workingDirectory;
     }
+
+    public long getMaxExecutionTime()
+    {
+        return 0;
+    }
 }

Added: maven/continuum/trunk/continuum-core/src/test-projects/timeout/pom.xml
URL: http://svn.apache.org/viewvc/maven/continuum/trunk/continuum-core/src/test-projects/timeout/pom.xml?rev=439599&view=auto
==============================================================================
--- maven/continuum/trunk/continuum-core/src/test-projects/timeout/pom.xml (added)
+++ maven/continuum/trunk/continuum-core/src/test-projects/timeout/pom.xml Sat Sep  2 06:46:09 2006
@@ -0,0 +1,18 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.continuum.tests</groupId>
+  <artifactId>timeout</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <name>Continuum Timeout test</name>
+  <scm>
+    <connection>scm:svn:http://0.0.0.0/norepo/</connection>
+  </scm>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>

Propchange: maven/continuum/trunk/continuum-core/src/test-projects/timeout/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/continuum/trunk/continuum-core/src/test-projects/timeout/pom.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/continuum/testprojects/timeout/TimeoutTest.java
URL: http://svn.apache.org/viewvc/maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/continuum/testprojects/timeout/TimeoutTest.java?rev=439599&view=auto
==============================================================================
--- maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/continuum/testprojects/timeout/TimeoutTest.java (added)
+++ maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/continuum/testprojects/timeout/TimeoutTest.java Sat Sep  2 06:46:09 2006
@@ -0,0 +1,59 @@
+package projects.timeout.src.test.java.org.apache.maven.continuum.testprojects.timeout;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import junit.framework.TestCase;
+
+/**
+ * This is a 'long running' test, with pre/post file events, allowing
+ * Continuum to test aborting tasks.
+ *
+ * @author <a href="mailto:kenney@apache.org">Kenney Westerhof</a>
+ */
+public class TimeoutTest
+    extends TestCase
+{
+    public void testTimeout()
+        throws Exception
+    {
+        deleteFile( "target/TEST-COMPLETED" );
+        createFile( "target/TEST-STARTED", "Test started" );
+
+        System.err.println( "Sleeping for 15 seconds." );
+
+        Thread.sleep( 15000 );
+
+        createFile( "target/TEST-COMPLETED", "Test completed" );
+    }
+
+    private static void createFile( String filename, String content )
+        throws Exception
+    {
+        FileOutputStream fout = new FileOutputStream( filename );
+        fout.write( content.getBytes() );
+        fout.close();
+    }
+
+    private static void deleteFile( String filename )
+        throws Exception
+    {
+        new File( filename ).delete();
+    }
+}

Propchange: maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/continuum/testprojects/timeout/TimeoutTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/continuum/trunk/continuum-core/src/test-projects/timeout/src/test/java/org/apache/maven/continuum/testprojects/timeout/TimeoutTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java
URL: http://svn.apache.org/viewvc/maven/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java?rev=439599&view=auto
==============================================================================
--- maven/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java (added)
+++ maven/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java Sat Sep  2 06:46:09 2006
@@ -0,0 +1,283 @@
+package org.apache.maven.continuum.buildcontroller;
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import org.apache.maven.continuum.AbstractContinuumTest;
+import org.apache.maven.continuum.buildqueue.BuildProjectTask;
+import org.apache.maven.continuum.core.action.AbstractContinuumAction;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectGroup;
+import org.apache.maven.continuum.project.builder.ContinuumProjectBuilder;
+import org.apache.maven.continuum.project.builder.ContinuumProjectBuilderException;
+import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
+import org.apache.maven.continuum.project.builder.maven.MavenTwoContinuumProjectBuilder;
+import org.apache.maven.continuum.store.ContinuumStore;
+import org.codehaus.plexus.action.ActionManager;
+import org.codehaus.plexus.taskqueue.Task;
+import org.codehaus.plexus.taskqueue.TaskQueue;
+import org.codehaus.plexus.taskqueue.execution.TaskQueueExecutor;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * @author <a href="mailto:kenney@apache.org">Kenney Westerhof</a>
+ *
+ */
+public class BuildProjectTaskExecutorTest
+    extends AbstractContinuumTest
+{
+    private ContinuumProjectBuilder projectBuilder;
+
+    private TaskQueue buildQueue;
+
+    private TaskQueueExecutor taskQueueExecutor;
+
+    private ContinuumStore continuumStore;
+
+    private ActionManager actionManager;
+
+    public void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        projectBuilder = (ContinuumProjectBuilder) lookup( ContinuumProjectBuilder.ROLE,
+                                                           MavenTwoContinuumProjectBuilder.ID );
+
+        buildQueue = (TaskQueue) lookup( TaskQueue.ROLE, "build-project" );
+
+        taskQueueExecutor = (TaskQueueExecutor) lookup( TaskQueueExecutor.ROLE, "build-project" );
+
+        continuumStore = (ContinuumStore) lookup( ContinuumStore.ROLE );
+
+        actionManager = (ActionManager) lookup( ActionManager.ROLE );
+    }
+
+    public void testAutomaticCancellation()
+        throws Exception
+    {
+        runTimeoutProject( 13000 );
+
+        long taskStartTime = System.currentTimeMillis();
+
+        // should be killed in 5 secs, plus slack
+        waitForTaskDead( 10000 );
+
+        // the project will sleep for 15 seconds and then write a file.
+        // Make sure we sleep at least that long and then check for the file;
+        // it should not be there.
+
+        long taskWaitTime = 15000 - ( System.currentTimeMillis() - taskStartTime );
+
+        System.err.println( "Sleeping " + taskWaitTime + "ms" );
+        Thread.sleep( taskWaitTime );
+
+        assertFalse( "Build completed", getTestFile( "src/test-projects/timeout/target/TEST-COMPLETED" ).exists() );
+    }
+
+    public void testManualCancellation()
+        throws Exception
+    {
+        BuildProjectTask task = runTimeoutProject( 0 );
+
+        assertFalse( "Build completed", getTestFile( "src/test-projects/timeout/target/TEST-COMPLETED" ).exists() );
+
+        long taskStartTime = System.currentTimeMillis();
+
+        assertTrue( taskQueueExecutor.cancelTask( task ) );
+
+        waitForTaskDead( 5000 );
+
+        long taskWaitTime = 15000 - ( System.currentTimeMillis() - taskStartTime );
+
+        System.err.println( "Sleeping " + taskWaitTime + "ms" );
+        Thread.sleep( taskWaitTime );
+
+        assertFalse( "Build completed", getTestFile( "src/test-projects/timeout/target/TEST-COMPLETED" ).exists() );
+    }
+
+    public void testNoCancellation()
+        throws Exception
+    {
+        runTimeoutProject( 0 );
+
+        waitForFile( "src/test-projects/timeout/target/TEST-COMPLETED", 20000 );
+
+        waitForTaskDead( 10000 );
+    }
+
+    private void waitForFile( String file, int max )
+        throws InterruptedException
+    {
+        long time = System.currentTimeMillis();
+
+        for ( int i = 0; i < max / 10; i++ )
+        {
+            if ( getTestFile( file ).exists() )
+            {
+                break;
+            }
+            Thread.sleep( 10 );
+        }
+
+        System.err.println( "Waited " + ( System.currentTimeMillis() - time ) + "ms for file " + file );
+
+        assertTrue( "File " + file, getTestFile( file ).exists() );
+    }
+
+    private void waitForTaskDead( int maxWait )
+        throws InterruptedException
+    {
+        for ( int i = 0; i < maxWait / 10; i++ )
+        {
+            if ( taskQueueExecutor.getCurrentTask() == null )
+            {
+                break;
+            }
+
+            Thread.sleep( 10 );
+        }
+
+        assertNull( "No current task", taskQueueExecutor.getCurrentTask() );
+    }
+
+    /**
+     * Runs the timeout test project through the build queue and return when the unit test in it has started. The
+     * project contains a unit test that sleeps for 15 seconds.
+     *
+     * @param maxRunTime
+     *            maximum time the build may run before it's auto cancelled; 0 means forever.
+     * @return
+     * @throws Exception
+     */
+    private BuildProjectTask runTimeoutProject( int maxRunTime )
+        throws Exception
+    {
+        BuildProjectTask task = createTask( maxRunTime );
+
+        getTestFile( "src/test-projects/timeout/target/TEST-STARTED" ).delete();
+        getTestFile( "src/test-projects/timeout/target/TEST-COMPLETED" ).delete();
+
+        System.err.println( "Queueing build" );
+
+        this.buildQueue.put( task );
+
+        System.err.println( "Waiting for task to start" );
+
+        Task curTask = null;
+
+        // Sleep at most 10 seconds for the task to start
+        for ( int i = 0; i < 1000; i++ )
+        {
+            curTask = taskQueueExecutor.getCurrentTask();
+
+            if ( curTask != null )
+            {
+                break;
+            }
+
+            Thread.sleep( 10 );
+        }
+
+        assertNotNull( "Task not started", task );
+
+        // wait for the start file to be written
+
+        waitForFile( "src/test-projects/timeout/target/TEST-STARTED", 10000 );
+
+        System.err.println( "Task started, TEST-STARTED file created." );
+
+        return task;
+    }
+
+    private BuildProjectTask createTask( int maxRunTime )
+        throws Exception
+    {
+        ProjectGroup projectGroup = getProjectGroup( "src/test-projects/timeout/pom.xml" );
+        Project project = (Project) projectGroup.getProjects().get( 0 );
+
+        BuildDefinition buildDefinition = new BuildDefinition();
+        buildDefinition.setId( 0 );
+        buildDefinition.setGoals( "install" );
+
+        projectGroup.addBuildDefinition( buildDefinition );
+
+        Map pgContext = new HashMap();
+
+        pgContext.put( AbstractContinuumAction.KEY_WORKING_DIRECTORY, project.getWorkingDirectory() );
+
+        pgContext.put( AbstractContinuumAction.KEY_UNVALIDATED_PROJECT_GROUP, projectGroup );
+
+        actionManager.lookup( "validate-project-group" ).execute( pgContext );
+
+        actionManager.lookup( "store-project-group" ).execute( pgContext );
+
+        int projectGroupId = AbstractContinuumAction.getProjectGroupId( pgContext );
+
+        projectGroup = continuumStore.getProjectGroupWithBuildDetails( projectGroupId );
+
+        project = (Project) projectGroup.getProjects().get( 0 );
+
+        buildDefinition = (BuildDefinition) projectGroup.getBuildDefinitions().get( 0 );
+
+        // projectGroup = continuumStore.addProjectGroup( projectGroup );
+
+        BuildProjectTask task = new BuildProjectTask( project.getId(), buildDefinition.getId(), 0 );
+
+        task.setMaxExecutionTime( maxRunTime );
+
+        return task;
+    }
+
+    private ProjectGroup getProjectGroup( String pomResource )
+        throws ContinuumProjectBuilderException, IOException
+    {
+        File pom = getTestFile( pomResource );
+
+        assertNotNull( "Can't find project " + pomResource, pom );
+
+        ContinuumProjectBuildingResult result = projectBuilder.buildProjectsFromMetadata( pom.toURL(), null, null );
+
+        // some assertions to make sure our expectations match. This is NOT
+        // meant as a unit test for the projectbuilder!
+
+        assertNotNull( "Project list not null", result.getProjects() );
+
+        assertEquals( "#Projectgroups", 1, result.getProjectGroups().size() );
+
+        ProjectGroup pg = (ProjectGroup) result.getProjectGroups().get( 0 );
+
+        // If the next part fails, remove this code! Then result.getProjects
+        // might be empty, and result.projectgroups[0].getProjects contains
+        // the single project!
+
+        assertEquals( "#Projects in result", 1, result.getProjects().size() );
+
+        Project p = (Project) result.getProjects().get( 0 );
+
+        pg.addProject( p );
+
+        p.setWorkingDirectory( pom.getParent() );
+
+        return pg;
+    }
+}

Propchange: maven/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/continuum/trunk/continuum-core/src/test/resources/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.xml
URL: http://svn.apache.org/viewvc/maven/continuum/trunk/continuum-core/src/test/resources/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.xml?rev=439599&view=auto
==============================================================================
--- maven/continuum/trunk/continuum-core/src/test/resources/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.xml (added)
+++ maven/continuum/trunk/continuum-core/src/test/resources/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.xml Sat Sep  2 06:46:09 2006
@@ -0,0 +1,11 @@
+<plexus>
+  <components>
+    <component>
+      <role>org.codehaus.plexus.notification.RecipientSource</role>
+      <implementation>org.apache.maven.continuum.notification.ContinuumRecipientSource</implementation>
+      <configuration>
+        <toOverride>nobody@localhost</toOverride>
+      </configuration>
+    </component>
+  </components>
+</plexus>

Propchange: maven/continuum/trunk/continuum-core/src/test/resources/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/continuum/trunk/continuum-core/src/test/resources/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/continuum/trunk/continuum-core/src/test/resources/projects/continuum/continuum-core/pom.xml
URL: http://svn.apache.org/viewvc/maven/continuum/trunk/continuum-core/src/test/resources/projects/continuum/continuum-core/pom.xml?rev=439599&r1=439598&r2=439599&view=diff
==============================================================================
--- maven/continuum/trunk/continuum-core/src/test/resources/projects/continuum/continuum-core/pom.xml (original)
+++ maven/continuum/trunk/continuum-core/src/test/resources/projects/continuum/continuum-core/pom.xml Sat Sep  2 06:46:09 2006
@@ -3,7 +3,7 @@
   <parent>
     <artifactId>continuum-parent</artifactId>
     <groupId>org.apache.maven.continuum</groupId>
-    <version>1.0.3</version>
+    <version>1.1-SNAPSHOT</version>
   </parent>
   <artifactId>continuum-core</artifactId>
   <name>Continuum Core</name>

Modified: maven/continuum/trunk/pom.xml
URL: http://svn.apache.org/viewvc/maven/continuum/trunk/pom.xml?rev=439599&r1=439598&r2=439599&view=diff
==============================================================================
--- maven/continuum/trunk/pom.xml (original)
+++ maven/continuum/trunk/pom.xml Sat Sep  2 06:46:09 2006
@@ -302,7 +302,7 @@
       <dependency>
         <groupId>org.codehaus.plexus</groupId>
         <artifactId>plexus-utils</artifactId>
-        <version>1.2</version>
+        <version>1.3-SNAPSHOT</version>
       </dependency>
       <dependency>
         <groupId>org.codehaus.plexus</groupId>