提交 312f2430 编写于 作者: O Olivier Lamy

[HUDSON-8395] M2 POMs aren't parsed if there is a M3 control error like an...

[HUDSON-8395] M2 POMs aren't parsed if there is a M3 control error like an invalid scope in a plugin dep.
use different validation level depending on maven version used.
上级 67ab54db
...@@ -27,6 +27,7 @@ import hudson.model.TaskListener; ...@@ -27,6 +27,7 @@ import hudson.model.TaskListener;
import java.io.File; import java.io.File;
import java.util.Properties; import java.util.Properties;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.sonatype.aether.transfer.TransferListener; import org.sonatype.aether.transfer.TransferListener;
/** /**
...@@ -52,7 +53,26 @@ public class MavenEmbedderRequest ...@@ -52,7 +53,26 @@ public class MavenEmbedderRequest
* @since 1.393 * @since 1.393
*/ */
private ClassLoader classLoader; private ClassLoader classLoader;
/**
* will processPlugins during project reading
* @since 1.393
*/
private boolean processPlugins;
/**
* will resolve dependencies during project reading
* @since 1.393
*/
private boolean resolveDependencies;
/**
* level of validation when reading pom (ie model building request)
* default value : {@link ModelBuildingRequest#VALIDATION_LEVEL_MAVEN_2_0} etc...
* @since 1.393
*/
private int validationLevel = ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0;
/** /**
* @param listener * @param listener
* This is where the log messages from Maven will be recorded. * This is where the log messages from Maven will be recorded.
...@@ -69,8 +89,7 @@ public class MavenEmbedderRequest ...@@ -69,8 +89,7 @@ public class MavenEmbedderRequest
* Optional alternate settings.xml file. * Optional alternate settings.xml file.
*/ */
public MavenEmbedderRequest( TaskListener listener, File mavenHome, String profiles, Properties systemProperties, public MavenEmbedderRequest( TaskListener listener, File mavenHome, String profiles, Properties systemProperties,
String privateRepository, File alternateSettings ) String privateRepository, File alternateSettings ) {
{
this.listener = listener; this.listener = listener;
this.mavenHome = mavenHome; this.mavenHome = mavenHome;
this.profiles = profiles; this.profiles = profiles;
...@@ -79,91 +98,104 @@ public class MavenEmbedderRequest ...@@ -79,91 +98,104 @@ public class MavenEmbedderRequest
this.alternateSettings = alternateSettings; this.alternateSettings = alternateSettings;
} }
public TaskListener getListener() public TaskListener getListener() {
{
return listener; return listener;
} }
public MavenEmbedderRequest setListener( TaskListener listener ) public MavenEmbedderRequest setListener( TaskListener listener ) {
{
this.listener = listener; this.listener = listener;
return this; return this;
} }
public File getMavenHome() public File getMavenHome() {
{
return mavenHome; return mavenHome;
} }
public MavenEmbedderRequest setMavenHome( File mavenHome ) public MavenEmbedderRequest setMavenHome( File mavenHome ) {
{
this.mavenHome = mavenHome; this.mavenHome = mavenHome;
return this; return this;
} }
public String getProfiles() public String getProfiles() {
{
return profiles; return profiles;
} }
public MavenEmbedderRequest setProfiles( String profiles ) public MavenEmbedderRequest setProfiles( String profiles ) {
{
this.profiles = profiles; this.profiles = profiles;
return this; return this;
} }
public Properties getSystemProperties() public Properties getSystemProperties() {
{
return systemProperties; return systemProperties;
} }
public MavenEmbedderRequest setSystemProperties( Properties systemProperties ) public MavenEmbedderRequest setSystemProperties( Properties systemProperties ) {
{
this.systemProperties = systemProperties; this.systemProperties = systemProperties;
return this; return this;
} }
public String getPrivateRepository() public String getPrivateRepository() {
{
return privateRepository; return privateRepository;
} }
public MavenEmbedderRequest setPrivateRepository( String privateRepository ) public MavenEmbedderRequest setPrivateRepository( String privateRepository ) {
{
this.privateRepository = privateRepository; this.privateRepository = privateRepository;
return this; return this;
} }
public File getAlternateSettings() public File getAlternateSettings() {
{
return alternateSettings; return alternateSettings;
} }
public MavenEmbedderRequest setAlternateSettings( File alternateSettings ) public MavenEmbedderRequest setAlternateSettings( File alternateSettings ) {
{
this.alternateSettings = alternateSettings; this.alternateSettings = alternateSettings;
return this; return this;
} }
public TransferListener getTransferListener() public TransferListener getTransferListener() {
{
return transferListener; return transferListener;
} }
public MavenEmbedderRequest setTransferListener( TransferListener transferListener ) public MavenEmbedderRequest setTransferListener( TransferListener transferListener ) {
{
this.transferListener = transferListener; this.transferListener = transferListener;
return this; return this;
} }
public ClassLoader getClassLoader() public ClassLoader getClassLoader() {
{
return classLoader; return classLoader;
} }
public MavenEmbedderRequest setClassLoader( ClassLoader classLoader ) public MavenEmbedderRequest setClassLoader( ClassLoader classLoader ) {
{
this.classLoader = classLoader; this.classLoader = classLoader;
return this; return this;
} }
public boolean isProcessPlugins() {
return processPlugins;
}
public MavenEmbedderRequest setProcessPlugins( boolean processPlugins ) {
this.processPlugins = processPlugins;
return this;
}
public boolean isResolveDependencies() {
return resolveDependencies;
}
public MavenEmbedderRequest setResolveDependencies( boolean resolveDependencies ) {
this.resolveDependencies = resolveDependencies;
return this;
}
public int getValidationLevel()
{
return validationLevel;
}
public MavenEmbedderRequest setValidationLevel( int validationLevel )
{
this.validationLevel = validationLevel;
return this;
}
} }
...@@ -31,6 +31,7 @@ import hudson.FilePath; ...@@ -31,6 +31,7 @@ import hudson.FilePath;
import hudson.FilePath.FileCallable; import hudson.FilePath.FileCallable;
import hudson.Launcher; import hudson.Launcher;
import hudson.Util; import hudson.Util;
import hudson.cli.VersionCommand;
import hudson.maven.MavenBuild.ProxyImpl2; import hudson.maven.MavenBuild.ProxyImpl2;
import hudson.maven.reporters.MavenFingerprinter; import hudson.maven.reporters.MavenFingerprinter;
import hudson.maven.reporters.MavenMailer; import hudson.maven.reporters.MavenMailer;
...@@ -84,6 +85,7 @@ import org.apache.maven.artifact.versioning.ComparableVersion; ...@@ -84,6 +85,7 @@ import org.apache.maven.artifact.versioning.ComparableVersion;
import org.apache.maven.execution.MavenSession; import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.ReactorManager; import org.apache.maven.execution.ReactorManager;
import org.apache.maven.lifecycle.LifecycleExecutionException; import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.monitor.event.EventDispatcher; import org.apache.maven.monitor.event.EventDispatcher;
import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.project.ProjectBuildingException;
...@@ -498,7 +500,7 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven ...@@ -498,7 +500,7 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
listener.getLogger().println("Found mavenVersion " + mavenVersion + " from file " + mavenInformation.getVersionResourcePath()); listener.getLogger().println("Found mavenVersion " + mavenVersion + " from file " + mavenInformation.getVersionResourcePath());
if(!project.isAggregatorStyleBuild()) { if(!project.isAggregatorStyleBuild()) {
parsePoms(listener, logger, envVars, mvn); parsePoms(listener, logger, envVars, mvn, mavenVersion);
// start module builds // start module builds
logger.println("Triggering "+project.getRootModule().getModuleName()); logger.println("Triggering "+project.getRootModule().getModuleName());
project.getRootModule().scheduleBuild(new UpstreamCause((Run<?,?>)MavenModuleSetBuild.this)); project.getRootModule().scheduleBuild(new UpstreamCause((Run<?,?>)MavenModuleSetBuild.this));
...@@ -523,7 +525,7 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven ...@@ -523,7 +525,7 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
if(!preBuild(listener, project.getPublishers())) if(!preBuild(listener, project.getPublishers()))
return Result.FAILURE; return Result.FAILURE;
parsePoms(listener, logger, envVars, mvn); // #5428 : do pre-build *before* parsing pom parsePoms(listener, logger, envVars, mvn, mavenVersion); // #5428 : do pre-build *before* parsing pom
SplittableBuildListener slistener = new SplittableBuildListener(listener); SplittableBuildListener slistener = new SplittableBuildListener(listener);
proxies = new HashMap<ModuleName, ProxyImpl2>(); proxies = new HashMap<ModuleName, ProxyImpl2>();
List<String> changedModules = new ArrayList<String>(); List<String> changedModules = new ArrayList<String>();
...@@ -682,12 +684,12 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven ...@@ -682,12 +684,12 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
} }
} }
private void parsePoms(BuildListener listener, PrintStream logger, EnvVars envVars, MavenInstallation mvn) throws IOException, InterruptedException { private void parsePoms(BuildListener listener, PrintStream logger, EnvVars envVars, MavenInstallation mvn, String mavenVersion) throws IOException, InterruptedException {
logger.println("Parsing POMs"); logger.println("Parsing POMs");
List<PomInfo> poms; List<PomInfo> poms;
try { try {
poms = getModuleRoot().act(new PomParser(listener, mvn, project)); poms = getModuleRoot().act(new PomParser(listener, mvn, project, mavenVersion));
} catch (IOException e) { } catch (IOException e) {
if (e.getCause() instanceof AbortException) if (e.getCause() instanceof AbortException)
throw (AbortException) e.getCause(); throw (AbortException) e.getCause();
...@@ -997,7 +999,8 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven ...@@ -997,7 +999,8 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
private final boolean nonRecursive; private final boolean nonRecursive;
// We're called against the module root, not the workspace, which can cause a lot of confusion. // We're called against the module root, not the workspace, which can cause a lot of confusion.
private final String workspaceProper; private final String workspaceProper;
public PomParser(BuildListener listener, MavenInstallation mavenHome, MavenModuleSet project) { private final String mavenVersion;
public PomParser(BuildListener listener, MavenInstallation mavenHome, MavenModuleSet project,String mavenVersion) {
// project cannot be shipped to the remote JVM, so all the relevant properties need to be captured now. // project cannot be shipped to the remote JVM, so all the relevant properties need to be captured now.
this.listener = listener; this.listener = listener;
this.mavenHome = mavenHome; this.mavenHome = mavenHome;
...@@ -1012,6 +1015,7 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven ...@@ -1012,6 +1015,7 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
this.privateRepository = null; this.privateRepository = null;
} }
this.alternateSettings = project.getAlternateSettings(); this.alternateSettings = project.getAlternateSettings();
this.mavenVersion = mavenVersion;
} }
/** /**
...@@ -1080,6 +1084,16 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven ...@@ -1080,6 +1084,16 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
privateRepository, settingsLoc ); privateRepository, settingsLoc );
mavenEmbedderRequest.setTransferListener( new SimpleTransferListener(listener) ); mavenEmbedderRequest.setTransferListener( new SimpleTransferListener(listener) );
// FIXME must be configurable tru the ui !!
mavenEmbedderRequest.setProcessPlugins( true );
mavenEmbedderRequest.setResolveDependencies( true );
// FIXME handle 3.1 level when version will be here : no rush :-)
// or made something configurable tru the ui ?
boolean maven3OrLater = new ComparableVersion (mavenVersion).compareTo( new ComparableVersion ("3.0") ) >= 0;
if (maven3OrLater)
mavenEmbedderRequest.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0 );
//mavenEmbedderRequest.setClassLoader( MavenEmbedderUtils.buildClassRealm( mavenHome.getHomeDir(), null, null ) ); //mavenEmbedderRequest.setClassLoader( MavenEmbedderUtils.buildClassRealm( mavenHome.getHomeDir(), null, null ) );
MavenEmbedder embedder = MavenUtil.createEmbedder( mavenEmbedderRequest ); MavenEmbedder embedder = MavenUtil.createEmbedder( mavenEmbedderRequest );
......
...@@ -188,6 +188,10 @@ public class MavenUtil { ...@@ -188,6 +188,10 @@ public class MavenUtil {
mavenEmbedderRequest.getClassLoader() == null ? new MaskingClassLoader( cl ) mavenEmbedderRequest.getClassLoader() == null ? new MaskingClassLoader( cl )
: mavenEmbedderRequest.getClassLoader(); : mavenEmbedderRequest.getClassLoader();
mavenRequest.setProcessPlugins( mavenEmbedderRequest.isProcessPlugins() );
mavenRequest.setResolveDependencies( mavenEmbedderRequest.isResolveDependencies() );
mavenRequest.setValidationLevel( mavenEmbedderRequest.getValidationLevel() );
// TODO check this MaskingClassLoader with maven 3 artifacts // TODO check this MaskingClassLoader with maven 3 artifacts
MavenEmbedder maven = new MavenEmbedder( mavenEmbedderClassLoader, mavenRequest ); MavenEmbedder maven = new MavenEmbedder( mavenEmbedderClassLoader, mavenRequest );
{ {
......
...@@ -3,13 +3,16 @@ package hudson.maven; ...@@ -3,13 +3,16 @@ package hudson.maven;
import hudson.Launcher; import hudson.Launcher;
import hudson.maven.reporters.MavenAbstractArtifactRecord; import hudson.maven.reporters.MavenAbstractArtifactRecord;
import hudson.model.BuildListener; import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.tasks.Maven.MavenInstallation; import hudson.tasks.Maven.MavenInstallation;
import java.io.File; import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.Future;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.jvnet.hudson.test.Bug;
import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.ExtractResourceSCM;
import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.HudsonTestCase;
...@@ -68,8 +71,23 @@ public class Maven3BuildTest extends HudsonTestCase { ...@@ -68,8 +71,23 @@ public class Maven3BuildTest extends HudsonTestCase {
assertTrue( MavenUtil.maven3orLater( b.getMavenVersionUsed() ) ); assertTrue( MavenUtil.maven3orLater( b.getMavenVersionUsed() ) );
} }
@Bug(value=8395)
public void testMaven3BuildWrongScope() throws Exception {
File pom = new File(this.getClass().getResource("test-pom-8395.xml").toURI());
MavenModuleSet m = createMavenProject();
MavenInstallation mavenInstallation = configureMaven3();
m.setMaven( mavenInstallation.getName() );
m.getReporters().add(new TestReporter());
m.setRootPOM(pom.getAbsolutePath());
m.setGoals( "clean validate" );
MavenModuleSetBuild mmsb = m.scheduleBuild2( 0 ).get();
assertBuildStatus( Result.FAILURE, mmsb );
assertTrue( mmsb.getProject().getModules() == null);
}
private static class TestReporter extends MavenReporter { private static class TestReporter extends MavenReporter {
@Override @Override
public boolean end(MavenBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { public boolean end(MavenBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
......
package hudson.maven; package hudson.maven;
import org.jvnet.hudson.test.HudsonTestCase;
import org.jvnet.hudson.test.Bug;
import org.jvnet.hudson.test.ExtractResourceSCM;
import hudson.Launcher; import hudson.Launcher;
import hudson.scm.SubversionSCM;
import hudson.model.BuildListener; import hudson.model.BuildListener;
import hudson.model.Result; import hudson.model.Result;
import hudson.scm.SubversionSCM;
import hudson.tasks.Maven.MavenInstallation;
import hudson.util.NullStream; import hudson.util.NullStream;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import org.jvnet.hudson.test.Bug;
import org.jvnet.hudson.test.ExtractResourceSCM;
import org.jvnet.hudson.test.HudsonTestCase;
import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNException;
/** /**
...@@ -90,4 +92,19 @@ public class MavenBuildTest extends HudsonTestCase { ...@@ -90,4 +92,19 @@ public class MavenBuildTest extends HudsonTestCase {
buildAndAssertSuccess(m.getModule("test$module1")); buildAndAssertSuccess(m.getModule("test$module1"));
buildAndAssertSuccess(m.getModule("test$module1")); buildAndAssertSuccess(m.getModule("test$module1"));
} }
@Bug(value=8395)
public void testMaven2BuildWrongScope() throws Exception {
File pom = new File(this.getClass().getResource("test-pom-8395.xml").toURI());
MavenModuleSet m = createMavenProject();
MavenInstallation mavenInstallation = configureDefaultMaven();
m.setMaven( mavenInstallation.getName() );
m.getReporters().add(new TestReporter());
m.setRootPOM(pom.getAbsolutePath());
m.setGoals( "clean validate" );
MavenModuleSetBuild mmsb = buildAndAssertSuccess(m);
assertFalse( mmsb.getProject().getModules().isEmpty());
}
} }
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.hudson-ci.testcase</groupId>
<artifactId>testcase-wrong-plugin-dep-scope</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<dependencies>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册