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>