提交 c8459682 编写于 作者: K kohsuke

[FIXED HUDSON-1088] Reader $M2_HOME/conf/settings.xml. In 1.235.

git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@10773 71c3de6d-444a-0410-be80-ed276b4c234a
上级 0dc4161b
......@@ -5,6 +5,7 @@ import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.ItemGroup;
import hudson.triggers.Trigger;
import hudson.tasks.Maven.ProjectWithMaven;
import java.util.HashSet;
import java.util.Set;
......@@ -14,7 +15,8 @@ import java.util.Set;
*
* @author Kohsuke Kawaguchi
*/
public abstract class AbstractMavenProject<P extends AbstractMavenProject<P,R>,R extends AbstractBuild<P,R>> extends AbstractProject<P,R> {
public abstract class AbstractMavenProject<P extends AbstractMavenProject<P,R>,R extends AbstractBuild<P,R>> extends AbstractProject<P,R>
implements ProjectWithMaven {
protected AbstractMavenProject(ItemGroup parent, String name) {
super(parent, name);
}
......
......@@ -87,6 +87,7 @@ import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.lang.reflect.Field;
import hudson.Util;
......@@ -166,6 +167,21 @@ public class MavenEmbedder
*/
private boolean alignWithUserInstallation;
/**
* Installation of Maven. We don't really read jar files from here,
* but we do read <tt>conf/settings.xml</tt>.
*
* <p>
* For compatibility reasons, this field may be null,
* when {@link MavenEmbedder} is invoked from old plugins
* who don't give us this value.
*/
private final File mavenHome;
public MavenEmbedder(File mavenHome) {
this.mavenHome = mavenHome;
}
// ----------------------------------------------------------------------
// Accessors
// ----------------------------------------------------------------------
......@@ -714,6 +730,21 @@ public class MavenEmbedder
settingsBuilder = (MavenSettingsBuilder) embedder.lookup( MavenSettingsBuilder.ROLE );
if(mavenHome!=null) {
// set global settings.xml.
// Maven figures this out from system property, which is obviously not set
// for us. So we need to override this private field.
try {
Field field = settingsBuilder.getClass().getDeclaredField("globalSettingsFile");
// getAbsoluteFile is probably not necessary, but just following what DefaultMavenSettingsBuilder does
field.set(settingsBuilder,new File(mavenHome,"conf/settings.xml").getAbsoluteFile());
} catch (NoSuchFieldException e) {
throw new MavenEmbedderException(e);
} catch (IllegalAccessException e) {
throw new MavenEmbedderException(e);
}
}
try
{
settings = settingsBuilder.buildSettings();
......
......@@ -21,6 +21,7 @@ import hudson.model.Node;
import hudson.model.Resource;
import hudson.tasks.LogRotator;
import hudson.tasks.Publisher;
import hudson.tasks.Maven.MavenInstallation;
import hudson.util.DescribableList;
import org.apache.maven.project.MavenProject;
import org.kohsuke.stapler.StaplerRequest;
......@@ -375,6 +376,11 @@ public final class MavenModule extends AbstractMavenProject<MavenModule,MavenBui
}
}
@Override
public MavenInstallation inferMavenInstallation() {
return getParent().inferMavenInstallation();
}
/**
* List of active {@link MavenReporter}s configured for this module.
*/
......
......@@ -406,6 +406,11 @@ public final class MavenModuleSet extends AbstractMavenProject<MavenModuleSet,Ma
return modules.get(rootModule);
}
@Override
public MavenInstallation inferMavenInstallation() {
return getMaven();
}
@Override
protected Set<ResourceActivity> getResourceActivities() {
final Set<ResourceActivity> activities = new HashSet<ResourceActivity>();
......
......@@ -6,6 +6,7 @@ import hudson.FilePath.FileCallable;
import hudson.Launcher;
import hudson.Util;
import hudson.tasks.BuildWrapper;
import hudson.tasks.Maven.MavenInstallation;
import hudson.maven.MavenBuild.ProxyImpl2;
import hudson.maven.reporters.MavenFingerprinter;
import hudson.model.AbstractBuild;
......@@ -371,7 +372,7 @@ public final class MavenModuleSetBuild extends AbstractBuild<MavenModuleSet,Mave
logger.println("Parsing POMs");
List<PomInfo> poms;
try {
poms = project.getModuleRoot().act(new PomParser(listener,project.getRootPOM(),project.getProfiles()));
poms = project.getModuleRoot().act(new PomParser(listener,project.getMaven(),project.getRootPOM(),project.getProfiles()));
} catch (IOException e) {
if (e.getCause() instanceof AbortException)
throw (AbortException) e.getCause();
......@@ -621,10 +622,12 @@ public final class MavenModuleSetBuild extends AbstractBuild<MavenModuleSet,Mave
* takes an effect even when {@link PomParser} runs in a slave.
*/
private final boolean versbose = debug;
private final MavenInstallation mavenHome;
private final String profiles;
public PomParser(BuildListener listener, String rootPOM, String profiles) {
public PomParser(BuildListener listener, MavenInstallation mavenHome, String rootPOM, String profiles) {
this.listener = listener;
this.mavenHome = mavenHome;
this.rootPOM = rootPOM;
this.profiles = profiles;
}
......@@ -662,7 +665,7 @@ public final class MavenModuleSetBuild extends AbstractBuild<MavenModuleSet,Mave
logger.println("Parsing "+pom);
try {
MavenEmbedder embedder = MavenUtil.createEmbedder(listener, profiles);
MavenEmbedder embedder = mavenHome.createEmbedder(listener,profiles);
MavenProject mp = embedder.readProject(pom);
Map<MavenProject,String> relPath = new HashMap<MavenProject,String>();
MavenUtil.resolveModules(embedder,mp,getRootPath(),relPath,listener);
......
package hudson.maven;
import hudson.model.TaskListener;
import hudson.model.BuildListener;
import hudson.AbortException;
import hudson.model.BuildListener;
import hudson.model.TaskListener;
import hudson.model.AbstractProject;
import hudson.tasks.Maven.MavenInstallation;
import hudson.tasks.Maven.ProjectWithMaven;
import org.apache.maven.embedder.MavenEmbedderException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Mirror;
import org.apache.maven.SettingsConfigurationException;
import org.apache.maven.artifact.manager.WagonManager;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import java.io.File;
import java.io.IOException;
......@@ -23,22 +17,46 @@ import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Iterator;
/**
* @author Kohsuke Kawaguchi
*/
public class MavenUtil {
/**
* @deprecated
* Use {@link MavenInstallation#createEmbedder(BuildListener, String)}
* or other overloaded versions that infers maven home.
*/
public static MavenEmbedder createEmbedder(TaskListener listener, String profiles) throws MavenEmbedderException, IOException {
return createEmbedder(listener,(File)null,profiles);
}
/**
* This version tries to infer mavenHome by looking at a project.
*
* @see #createEmbedder(TaskListener, File, String)
*/
public static MavenEmbedder createEmbedder(TaskListener listener, AbstractProject<?,?> project, String profiles) throws MavenEmbedderException, IOException {
MavenInstallation m=null;
if (project instanceof ProjectWithMaven)
m = ((ProjectWithMaven) project).inferMavenInstallation();
return createEmbedder(listener,m!=null?m.getHomeDir():null,profiles);
}
/**
* Creates a fresh {@link MavenEmbedder} instance.
*
* @param listener
* This is where the log messages from Maven will be recorded.
* @param mavenHome
* Directory of the Maven installation. We read {@code conf/settings.xml}
* from here. Can be null.
* @param profiles
* Profiles to activate/deactivate. Can be null.
*/
public static MavenEmbedder createEmbedder(TaskListener listener, String profiles) throws MavenEmbedderException, IOException {
MavenEmbedder maven = new MavenEmbedder();
public static MavenEmbedder createEmbedder(TaskListener listener, File mavenHome, String profiles) throws MavenEmbedderException, IOException {
MavenEmbedder maven = new MavenEmbedder(mavenHome);
ClassLoader cl = MavenUtil.class.getClassLoader();
maven.setClassLoader(new MaskingClassLoader(cl));
......
......@@ -55,7 +55,7 @@ public class RedeployPublisher extends Publisher {
listener.getLogger().println("Deploying artifacts to "+url);
try {
MavenEmbedder embedder = MavenUtil.createEmbedder(listener, null);
MavenEmbedder embedder = MavenUtil.createEmbedder(listener,build.getProject(),null);
ArtifactRepositoryLayout layout =
(ArtifactRepositoryLayout) embedder.getContainer().lookup( ArtifactRepositoryLayout.ROLE,"default");
ArtifactRepositoryFactory factory =
......
......@@ -170,7 +170,7 @@ public abstract class MavenAbstractArtifactRecord<T extends AbstractBuild<?,?>>
new TaskThread(this,ListenerAndText.forFile(logFile)) {
protected void perform(TaskListener listener) throws Exception {
try {
MavenEmbedder embedder = MavenUtil.createEmbedder(listener, null);
MavenEmbedder embedder = MavenUtil.createEmbedder(listener,getBuild().getProject(),null);
ArtifactRepositoryLayout layout =
(ArtifactRepositoryLayout) embedder.getContainer().lookup( ArtifactRepositoryLayout.ROLE,"default");
ArtifactRepositoryFactory factory =
......
......@@ -6,14 +6,13 @@ import hudson.maven.MavenBuild;
import hudson.maven.MavenEmbedder;
import hudson.maven.MavenModule;
import hudson.maven.MavenModuleSetBuild;
import hudson.maven.MavenUtil;
import hudson.model.Action;
import hudson.model.TaskListener;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.deployer.ArtifactDeployer;
import org.apache.maven.artifact.deployer.ArtifactDeploymentException;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.installer.ArtifactInstallationException;
import org.apache.maven.artifact.installer.ArtifactInstaller;
import org.apache.maven.artifact.repository.ArtifactRepository;
......@@ -106,8 +105,7 @@ public class MavenArtifactRecord extends MavenAbstractArtifactRecord<MavenBuild>
/**
* Installs the artifact to the local Maven repository.
*/
public void install(TaskListener listener) throws MavenEmbedderException, IOException, ComponentLookupException, ArtifactInstallationException {
MavenEmbedder embedder = MavenUtil.createEmbedder(listener,null);
public void install(MavenEmbedder embedder) throws MavenEmbedderException, IOException, ComponentLookupException, ArtifactInstallationException {
ArtifactHandlerManager handlerManager = (ArtifactHandlerManager) embedder.lookup(ArtifactHandlerManager.ROLE);
ArtifactInstaller installer = (ArtifactInstaller) embedder.lookup(ArtifactInstaller.class.getName());
ArtifactFactory factory = (ArtifactFactory) embedder.lookup(ArtifactFactory.class.getName());
......@@ -119,8 +117,6 @@ public class MavenArtifactRecord extends MavenAbstractArtifactRecord<MavenBuild>
for (MavenArtifact aa : attachedArtifacts)
installer.install(aa.getFile(parent),aa.toArtifact(handlerManager,factory,parent),embedder.getLocalRepository());
embedder.stop();
}
public void recordFingerprints() throws IOException {
......
......@@ -10,6 +10,9 @@ import hudson.tasks.BuildWrappers;
import hudson.tasks.Builder;
import hudson.tasks.Fingerprinter;
import hudson.tasks.Publisher;
import hudson.tasks.Maven;
import hudson.tasks.Maven.ProjectWithMaven;
import hudson.tasks.Maven.MavenInstallation;
import hudson.triggers.Trigger;
import hudson.util.DescribableList;
import net.sf.json.JSONObject;
......@@ -29,7 +32,7 @@ import java.util.Set;
* @author Kohsuke Kawaguchi
*/
public abstract class Project<P extends Project<P,B>,B extends Build<P,B>>
extends AbstractProject<P,B> implements SCMedItem, DescribableList.Owner {
extends AbstractProject<P,B> implements SCMedItem, DescribableList.Owner, ProjectWithMaven {
/**
* List of active {@link Builder}s configured for this project.
......@@ -129,18 +132,23 @@ public abstract class Project<P extends Project<P,B>,B extends Build<P,B>>
@Override
public boolean isFingerprintConfigured() {
synchronized(publishers) {
for (Publisher p : publishers) {
if(p instanceof Fingerprinter)
return true;
}
for (Publisher p : publishers) {
if(p instanceof Fingerprinter)
return true;
}
return false;
}
@Override
public MavenInstallation inferMavenInstallation() {
for (Builder builder : builders) {
if (builder instanceof Maven)
return ((Maven) builder).getMaven();
}
return null;
}
//
//
//
// actions
//
......
......@@ -8,6 +8,9 @@ import hudson.Launcher.LocalLauncher;
import hudson.Util;
import hudson.EnvVars;
import hudson.StructuredForm;
import hudson.maven.MavenEmbedder;
import hudson.maven.MavenUtil;
import hudson.maven.RedeployPublisher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
......@@ -21,6 +24,7 @@ import hudson.util.StreamTaskListener;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.DataBoundConstructor;
import org.apache.maven.embedder.MavenEmbedderException;
import javax.servlet.ServletException;
import java.io.File;
......@@ -324,6 +328,34 @@ public class Maven extends Builder {
}
}
public MavenEmbedder createEmbedder(BuildListener listener, String profiles) throws MavenEmbedderException, IOException {
return MavenUtil.createEmbedder(listener,getHomeDir(),profiles);
}
private static final long serialVersionUID = 1L;
}
/**
* Optional interface that can be implemented by {@link AbstractProject}
* that has "contextual" {@link MavenInstallation} associated with it.
*
* <p>
* Code like {@link RedeployPublisher} uses this interface in an attempt
* to use the consistent Maven installation attached to the project.
*
* @since 1.235
*/
public interface ProjectWithMaven {
/**
* Gets the {@link MavenInstallation} associated with the project.
* Can be null.
*
* <p>
* If the Maven installation can not be uniquely determined,
* it's often better to return just one of them, rather than returning
* null, since this method is currently ultimately only used to
* decide where to parse <tt>conf/settings.xml</tt> from.
*/
MavenInstallation inferMavenInstallation();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册