提交 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;
import java.io.File;
import java.util.Properties;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.sonatype.aether.transfer.TransferListener;
/**
......@@ -52,7 +53,26 @@ public class MavenEmbedderRequest
* @since 1.393
*/
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
* This is where the log messages from Maven will be recorded.
......@@ -69,8 +89,7 @@ public class MavenEmbedderRequest
* Optional alternate settings.xml file.
*/
public MavenEmbedderRequest( TaskListener listener, File mavenHome, String profiles, Properties systemProperties,
String privateRepository, File alternateSettings )
{
String privateRepository, File alternateSettings ) {
this.listener = listener;
this.mavenHome = mavenHome;
this.profiles = profiles;
......@@ -79,91 +98,104 @@ public class MavenEmbedderRequest
this.alternateSettings = alternateSettings;
}
public TaskListener getListener()
{
public TaskListener getListener() {
return listener;
}
public MavenEmbedderRequest setListener( TaskListener listener )
{
public MavenEmbedderRequest setListener( TaskListener listener ) {
this.listener = listener;
return this;
}
public File getMavenHome()
{
public File getMavenHome() {
return mavenHome;
}
public MavenEmbedderRequest setMavenHome( File mavenHome )
{
public MavenEmbedderRequest setMavenHome( File mavenHome ) {
this.mavenHome = mavenHome;
return this;
}
public String getProfiles()
{
public String getProfiles() {
return profiles;
}
public MavenEmbedderRequest setProfiles( String profiles )
{
public MavenEmbedderRequest setProfiles( String profiles ) {
this.profiles = profiles;
return this;
}
public Properties getSystemProperties()
{
public Properties getSystemProperties() {
return systemProperties;
}
public MavenEmbedderRequest setSystemProperties( Properties systemProperties )
{
public MavenEmbedderRequest setSystemProperties( Properties systemProperties ) {
this.systemProperties = systemProperties;
return this;
}
public String getPrivateRepository()
{
public String getPrivateRepository() {
return privateRepository;
}
public MavenEmbedderRequest setPrivateRepository( String privateRepository )
{
public MavenEmbedderRequest setPrivateRepository( String privateRepository ) {
this.privateRepository = privateRepository;
return this;
}
public File getAlternateSettings()
{
public File getAlternateSettings() {
return alternateSettings;
}
public MavenEmbedderRequest setAlternateSettings( File alternateSettings )
{
public MavenEmbedderRequest setAlternateSettings( File alternateSettings ) {
this.alternateSettings = alternateSettings;
return this;
}
public TransferListener getTransferListener()
{
public TransferListener getTransferListener() {
return transferListener;
}
public MavenEmbedderRequest setTransferListener( TransferListener transferListener )
{
public MavenEmbedderRequest setTransferListener( TransferListener transferListener ) {
this.transferListener = transferListener;
return this;
}
public ClassLoader getClassLoader()
{
public ClassLoader getClassLoader() {
return classLoader;
}
public MavenEmbedderRequest setClassLoader( ClassLoader classLoader )
{
public MavenEmbedderRequest setClassLoader( ClassLoader classLoader ) {
this.classLoader = classLoader;
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;
import hudson.FilePath.FileCallable;
import hudson.Launcher;
import hudson.Util;
import hudson.cli.VersionCommand;
import hudson.maven.MavenBuild.ProxyImpl2;
import hudson.maven.reporters.MavenFingerprinter;
import hudson.maven.reporters.MavenMailer;
......@@ -84,6 +85,7 @@ import org.apache.maven.artifact.versioning.ComparableVersion;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.ReactorManager;
import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.monitor.event.EventDispatcher;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingException;
......@@ -498,7 +500,7 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
listener.getLogger().println("Found mavenVersion " + mavenVersion + " from file " + mavenInformation.getVersionResourcePath());
if(!project.isAggregatorStyleBuild()) {
parsePoms(listener, logger, envVars, mvn);
parsePoms(listener, logger, envVars, mvn, mavenVersion);
// start module builds
logger.println("Triggering "+project.getRootModule().getModuleName());
project.getRootModule().scheduleBuild(new UpstreamCause((Run<?,?>)MavenModuleSetBuild.this));
......@@ -523,7 +525,7 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
if(!preBuild(listener, project.getPublishers()))
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);
proxies = new HashMap<ModuleName, ProxyImpl2>();
List<String> changedModules = new ArrayList<String>();
......@@ -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");
List<PomInfo> poms;
try {
poms = getModuleRoot().act(new PomParser(listener, mvn, project));
poms = getModuleRoot().act(new PomParser(listener, mvn, project, mavenVersion));
} catch (IOException e) {
if (e.getCause() instanceof AbortException)
throw (AbortException) e.getCause();
......@@ -997,7 +999,8 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
private final boolean nonRecursive;
// We're called against the module root, not the workspace, which can cause a lot of confusion.
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.
this.listener = listener;
this.mavenHome = mavenHome;
......@@ -1012,6 +1015,7 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
this.privateRepository = null;
}
this.alternateSettings = project.getAlternateSettings();
this.mavenVersion = mavenVersion;
}
/**
......@@ -1080,6 +1084,16 @@ public class MavenModuleSetBuild extends AbstractMavenBuild<MavenModuleSet,Maven
privateRepository, settingsLoc );
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 ) );
MavenEmbedder embedder = MavenUtil.createEmbedder( mavenEmbedderRequest );
......
......@@ -188,6 +188,10 @@ public class MavenUtil {
mavenEmbedderRequest.getClassLoader() == null ? new MaskingClassLoader( cl )
: mavenEmbedderRequest.getClassLoader();
mavenRequest.setProcessPlugins( mavenEmbedderRequest.isProcessPlugins() );
mavenRequest.setResolveDependencies( mavenEmbedderRequest.isResolveDependencies() );
mavenRequest.setValidationLevel( mavenEmbedderRequest.getValidationLevel() );
// TODO check this MaskingClassLoader with maven 3 artifacts
MavenEmbedder maven = new MavenEmbedder( mavenEmbedderClassLoader, mavenRequest );
{
......
......@@ -3,13 +3,16 @@ package hudson.maven;
import hudson.Launcher;
import hudson.maven.reporters.MavenAbstractArtifactRecord;
import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.tasks.Maven.MavenInstallation;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.concurrent.Future;
import org.apache.commons.io.FileUtils;
import org.jvnet.hudson.test.Bug;
import org.jvnet.hudson.test.ExtractResourceSCM;
import org.jvnet.hudson.test.HudsonTestCase;
......@@ -68,8 +71,23 @@ public class Maven3BuildTest extends HudsonTestCase {
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 {
@Override
public boolean end(MavenBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
......
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.scm.SubversionSCM;
import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.scm.SubversionSCM;
import hudson.tasks.Maven.MavenInstallation;
import hudson.util.NullStream;
import java.io.File;
import java.io.IOException;
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;
/**
......@@ -90,4 +92,19 @@ public class MavenBuildTest extends HudsonTestCase {
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.
先完成此消息的编辑!
想要评论请 注册