at.nonblocking.maven.nonsnapshot.NonSnapshotBaseMojo Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of nonsnapshot-maven-plugin Show documentation
Show all versions of nonsnapshot-maven-plugin Show documentation
A Maven plugin to get rid of SNAPSHOT versions and automatically update artifact versions with each build if anything changes.
Such a change can be a scm commit since the last build or a newly available upstream dependency version within a configured range.
/*
* Copyright 2012-2013 the original author or authors.
*
* 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.
*/
package at.nonblocking.maven.nonsnapshot;
import java.io.File;
import java.util.List;
import java.util.Properties;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.PlexusConstants;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.context.Context;
import org.codehaus.plexus.context.ContextException;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.repository.RemoteRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import at.nonblocking.maven.nonsnapshot.exception.NonSnapshotPluginException;
/**
* Base class for NonSnapshot Plugin Mojos.
*
* Does all the parameter handling.
*
* @author Juergen Kofler
*/
abstract class NonSnapshotBaseMojo extends AbstractMojo implements Contextualizable {
private static final Logger LOG = LoggerFactory.getLogger(NonSnapshotBaseMojo.class);
private static final String DEFAULT_TIMESTAMP_QUALIFIER_PATTERN = "yyyyMMddHHmm";
protected static final String DIRTY_MODULES_REGISTRY_FILE = "nonSnapshotDirtyModules.txt";
/**
* The SCM (Source Code Management System) type
*/
@Parameter(defaultValue = "SVN")
private SCM_TYPE scmType;
/**
* SCM Username
*/
@Parameter
private String scmUser;
/**
* SCM Password
*/
@Parameter
private String scmPassword;
@Parameter(defaultValue = "true")
private boolean gitDoPush;
/**
* Defer the actual commit until nonsnapshot:commit is called.
*/
@Parameter(defaultValue = "false")
private boolean deferPomCommit;
@Parameter(defaultValue = "false")
private boolean dontFailOnUpstreamVersionResolution;
/**
* Don't let the build fail if the commit of the POM files fails.
*
* Useful if you run this plugin on a CI Server and don't want to let the build fail when
* a concurrent POM update occurred.
*/
@Parameter(defaultValue = "false")
private boolean dontFailOnCommit;
@Parameter(defaultValue = "${project}")
private MavenProject mavenProject;
@Parameter(required = true)
private String baseVersion;
@Parameter(defaultValue = "false")
private boolean useSvnRevisionQualifier;
@Parameter(defaultValue = DEFAULT_TIMESTAMP_QUALIFIER_PATTERN)
private String timestampQualifierPattern = DEFAULT_TIMESTAMP_QUALIFIER_PATTERN;
@Parameter
private List upstreamDependencies;
/**
* Generate a shell script to incrementally build only dirty artifacts (Maven > 3.2.1 only)
*/
@Parameter(defaultValue = "false")
private boolean generateIncrementalBuildScripts;
/**
* Generate a property file with a property for all changed projects,
* which can be used in jenkins for an incremental build (mvn --project ${NONSNAPSHOT_CHANGED_PROJECTS}).
*/
@Parameter(defaultValue = "false")
private boolean generateChangedProjectsPropertyFile;
/**
* Disable this plugin
*/
@Parameter(defaultValue = "false")
private boolean skip;
@Component(role = MavenPomHandler.class, hint = "default")
private MavenPomHandler mavenPomHandler;
@Component(role = ModuleTraverser.class, hint = "default")
private ModuleTraverser moduleTraverser;
@Component(role = DependencyTreeProcessor.class, hint = "default")
private DependencyTreeProcessor dependencyTreeProcessor;
@Component(role = UpstreamDependencyHandler.class, hint = "default")
private UpstreamDependencyHandler upstreamDependencyHandler;
@Component
private RepositorySystem repositorySystem;
@Parameter(defaultValue = "${repositorySystemSession}")
private RepositorySystemSession repositorySystemSession;
@Parameter(defaultValue = "${project.remoteProjectRepositories}")
private List remoteRepositories;
private List processedUpstreamDependencies;
private ScmHandler scmHandler;
private PlexusContainer plexusContainer;
public void execute() throws MojoExecutionException, MojoFailureException {
if (this.skip) {
LOG.info("NonSnapshot Plugin has been disabled for this project.");
return;
}
LOG.info("Executing NonSnapshot Plugin for project path: {}", this.mavenProject.getBasedir().getAbsolutePath());
postProcessParameters();
internalExecute();
}
protected abstract void internalExecute();
private void postProcessParameters() {
if (this.scmHandler == null) {
LOG.debug("Lookup for ScmHandler implementation of type: {}", this.scmType);
try {
this.scmHandler = this.plexusContainer.lookup(ScmHandler.class, this.scmType.name());
} catch (ComponentLookupException e) {
throw new NonSnapshotPluginException("Unable to instantiate ScmHandler class for type: " + this.scmType, e);
}
if (this.scmHandler == null) {
throw new NonSnapshotPluginException("Unable to instantiate ScmHandler class for type: " + this.scmType);
}
LOG.debug("Found ScmHandler: {}", this.scmHandler.getClass());
}
Properties properties = new Properties();
properties.setProperty("gitDoPush", String.valueOf(this.gitDoPush));
this.scmHandler.init(getMavenProject().getBasedir(), this.scmUser, this.scmPassword, properties);
this.processedUpstreamDependencies = this.upstreamDependencyHandler.processDependencyList(getUpstreamDependencies());
}
protected File getDirtyModulesRegistryFile() {
return new File(this.mavenProject.getBasedir(), DIRTY_MODULES_REGISTRY_FILE);
}
@Override
public void contextualize(Context context) throws ContextException {
this.plexusContainer = (PlexusContainer) context.get(PlexusConstants.PLEXUS_KEY);
}
public SCM_TYPE getScmType() {
return scmType;
}
public void setScmType(SCM_TYPE scmType) {
this.scmType = scmType;
}
public String getScmUser() {
return scmUser;
}
public void setScmUser(String scmUser) {
this.scmUser = scmUser;
}
public String getScmPassword() {
return scmPassword;
}
public void setScmPassword(String scmPassword) {
this.scmPassword = scmPassword;
}
public boolean isGitDoPush() {
return gitDoPush;
}
public void setGitDoPush(boolean gitDoPush) {
this.gitDoPush = gitDoPush;
}
public boolean isDeferPomCommit() {
return deferPomCommit;
}
public void setDeferPomCommit(boolean deferPomCommit) {
this.deferPomCommit = deferPomCommit;
}
public boolean isDontFailOnUpstreamVersionResolution() {
return dontFailOnUpstreamVersionResolution;
}
public void setDontFailOnUpstreamVersionResolution(boolean dontFailOnUpstreamVersionResolution) {
this.dontFailOnUpstreamVersionResolution = dontFailOnUpstreamVersionResolution;
}
public boolean isDontFailOnCommit() {
return dontFailOnCommit;
}
public void setDontFailOnCommit(boolean dontFailOnCommit) {
this.dontFailOnCommit = dontFailOnCommit;
}
public MavenProject getMavenProject() {
return mavenProject;
}
public void setMavenProject(MavenProject mavenProject) {
this.mavenProject = mavenProject;
}
public String getBaseVersion() {
return baseVersion;
}
public void setBaseVersion(String baseVersion) {
this.baseVersion = baseVersion;
}
public boolean isUseSvnRevisionQualifier() {
return useSvnRevisionQualifier;
}
public void setUseSvnRevisionQualifier(boolean useSvnRevisionQualifier) {
this.useSvnRevisionQualifier = useSvnRevisionQualifier;
}
public String getTimestampQualifierPattern() {
return timestampQualifierPattern;
}
public void setTimestampQualifierPattern(String timestampQualifierPattern) {
this.timestampQualifierPattern = timestampQualifierPattern;
}
public List getUpstreamDependencies() {
return upstreamDependencies;
}
public void setUpstreamDependencies(List upstreamDependencies) {
this.upstreamDependencies = upstreamDependencies;
}
public boolean isGenerateIncrementalBuildScripts() {
return generateIncrementalBuildScripts;
}
public void setGenerateIncrementalBuildScripts(boolean generateIncrementalBuildScripts) {
this.generateIncrementalBuildScripts = generateIncrementalBuildScripts;
}
public boolean isGenerateChangedProjectsPropertyFile() {
return generateChangedProjectsPropertyFile;
}
public void setGenerateChangedProjectsPropertyFile(boolean generateChangedProjectsPropertyFile) {
this.generateChangedProjectsPropertyFile = generateChangedProjectsPropertyFile;
}
public boolean isSkip() {
return skip;
}
public void setSkip(boolean skip) {
this.skip = skip;
}
public MavenPomHandler getMavenPomHandler() {
return mavenPomHandler;
}
public void setMavenPomHandler(MavenPomHandler mavenPomHandler) {
this.mavenPomHandler = mavenPomHandler;
}
public ModuleTraverser getModuleTraverser() {
return moduleTraverser;
}
public void setModuleTraverser(ModuleTraverser moduleTraverser) {
this.moduleTraverser = moduleTraverser;
}
public DependencyTreeProcessor getDependencyTreeProcessor() {
return dependencyTreeProcessor;
}
public void setDependencyTreeProcessor(DependencyTreeProcessor dependencyTreeProcessor) {
this.dependencyTreeProcessor = dependencyTreeProcessor;
}
public UpstreamDependencyHandler getUpstreamDependencyHandler() {
return upstreamDependencyHandler;
}
public void setUpstreamDependencyHandler(UpstreamDependencyHandler upstreamDependencyHandler) {
this.upstreamDependencyHandler = upstreamDependencyHandler;
}
public RepositorySystem getRepositorySystem() {
return repositorySystem;
}
public void setRepositorySystem(RepositorySystem repositorySystem) {
this.repositorySystem = repositorySystem;
}
public RepositorySystemSession getRepositorySystemSession() {
return repositorySystemSession;
}
public void setRepositorySystemSession(RepositorySystemSession repositorySystemSession) {
this.repositorySystemSession = repositorySystemSession;
}
public List getRemoteRepositories() {
return remoteRepositories;
}
public void setRemoteRepositories(List remoteRepositories) {
this.remoteRepositories = remoteRepositories;
}
public List getProcessedUpstreamDependencies() {
return processedUpstreamDependencies;
}
public void setProcessedUpstreamDependencies(List processedUpstreamDependencies) {
this.processedUpstreamDependencies = processedUpstreamDependencies;
}
public ScmHandler getScmHandler() {
return scmHandler;
}
public void setScmHandler(ScmHandler scmHandler) {
this.scmHandler = scmHandler;
}
public PlexusContainer getPlexusContainer() {
return plexusContainer;
}
public void setPlexusContainer(PlexusContainer plexusContainer) {
this.plexusContainer = plexusContainer;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy