com.luuuis.maven.smartass.ArchiveDependenciesMojo.groovy Maven / Gradle / Ivy
/*
* Copyright ? 2011 Atlassian Pty Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.luuuis.maven.smartass
import org.apache.maven.project.MavenProject
import org.apache.maven.project.MavenProjectHelper
import org.codehaus.gmaven.mojo.GroovyMojo
/**
* Archive dependencies MOJO.
*
* @goal archive-dependencies
*/
class ArchiveDependenciesMojo extends GroovyMojo
{
/**
* The name of the output file that this MOJO will create.
*
* @parameter default-value='${project.build.finalName}.zip'
*/
String archiveName
/**
* The name of the output file that this MOJO will create.
*
* @parameter default-value='${project.build.finalName}.list'
*/
String listFileName
/**
* The scope to consider when calculating the set of dependencies to archive.
*
* @parameter default-value="runtime"
*/
String includeScope
/**
* Whether to skip the create of the archive
*
* @parameter default-value="${skip.smartass.zip.update}"
*/
boolean skipZipUpdate;
/**
* @parameter expression="${project}"
* @required
* @readonly
*/
MavenProject project
/**
* The Maven project helper.
*
* @component
*/
MavenProjectHelper projectHelper
/**
* The AntBuilder.
*/
AntBuilder ant = new AntBuilder()
/**
* Creates the archive containing the artifacts of this project's dependencies.
*/
void execute()
{
File archive = new File("${project.build.directory}/${archiveName}")
long archiveLastModified = archive.exists() ? archive.lastModified() : 0
if (log.debugEnabled)
{
log.debug "Archive '${archive.absolutePath}' modified on ${new Date(archiveLastModified)}"
}
def allArtifacts = project.dependencyArtifacts.findAll { it.scope == includeScope }
log.debug "Considering all dependencies with '${includeScope}' scope"
// determine what dependencies need to be updated in the archive
def updatedArtifacts = allArtifacts.findAll { it.file.lastModified() > archiveLastModified }
if (log.debugEnabled)
{
allArtifacts.each {
log.debug "Artifact ${it.id} resolves to ${it.file.absolutePath} (modified on ${new Date(it.file.lastModified())})"
}
}
// read the cache and compare it with the current set of dependencies
Set cachedDeps = readDependenciesFromAssFile() as SortedSet
log.debug "Cached dependency set: ${cachedDeps}"
def isOverwrite = false
Set currentDeps = allArtifacts.collect { "${it.groupId}:${it.artifactId}:${it.version}".toString() } as SortedSet
if (archive.exists() && currentDeps != cachedDeps)
{
log.info "Dependency set has changed. Rebuilding archive..."
updatedArtifacts = allArtifacts
isOverwrite = true
}
if (updatedArtifacts && skipZipUpdate) {
log.info "Skipping the update of $archiveName"
}
else if (updatedArtifacts)
{
if (archive.exists() && !isOverwrite)
{
log.info "Updating archive. These artifacts have changed:"
updatedArtifacts.each { log.info " - ${it.groupId}:${it.artifactId}:${it.version}" }
}
// Groovy AntBuilder FTW!
archive.parentFile.mkdirs()
ant.zip(destfile: archive.absolutePath, update: !isOverwrite) {
updatedArtifacts.each { artifact ->
zipfileset(file: artifact.file)
}
}
}
else
{
log.info "Bundled plugins zip is up to date."
}
// attach the bundled plugins zip, then write out the ass file
if (archive.isFile()) {
projectHelper.attachArtifact(project, "zip", null, archive)
}
writeDependenciesToAssFile(currentDeps)
writeArtifactsToListFile(allArtifacts)
}
protected void writeArtifactsToListFile(Collection updatedArtifacts) {
File listFile = new File("${project.build.directory}/${listFileName}")
listFile.parentFile.mkdirs()
listFile.withWriter { writer ->
updatedArtifacts.each { artifact ->
writer.writeLine(artifact.file.getAbsolutePath())
}
}
}
protected Set readDependenciesFromAssFile()
{
File cacheFile = new File("${project.build.directory}/${archiveName}.ass")
return cacheFile.exists() ? cacheFile.readLines() : []
}
protected void writeDependenciesToAssFile(def dependencies)
{
File cacheFile = new File("${project.build.directory}/${archiveName}.ass")
cacheFile.parentFile.mkdirs()
cacheFile.withWriter { writer ->
dependencies.each { dep ->
writer.writeLine(dep)
}
}
}
}