All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.odavid.maven.plugins.dependencyhandler.AbstractDependencyHandlerMojo.groovy Maven / Gradle / Ivy

package com.github.odavid.maven.plugins.dependencyhandler

import static org.twdata.maven.mojoexecutor.MojoExecutor.*
import groovy.text.SimpleTemplateEngine

import java.nio.file.Files
import java.nio.file.Path

import org.apache.maven.artifact.Artifact
import org.apache.maven.artifact.resolver.filter.AndArtifactFilter
import org.apache.maven.execution.MavenSession
import org.apache.maven.plugin.BuildPluginManager
import org.apache.maven.plugins.annotations.Component
import org.apache.maven.plugins.annotations.Mojo
import org.apache.maven.plugins.annotations.Parameter
import org.apache.maven.plugins.annotations.ResolutionScope
import org.apache.maven.project.MavenProject
import org.apache.maven.shared.artifact.filter.PatternExcludesArtifactFilter
import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter
import com.github.odavid.maven.plugins.groovy.GroovyMojoWithAntLogger

abstract class AbstractDependencyHandlerMojo extends GroovyMojoWithAntLogger{
	
	@Parameter(defaultValue='${project}', readonly=true)
	MavenProject mavenProject
	
	@Parameter(defaultValue='${session}', readonly=true)
	MavenSession mavenSession
	
	@Component
	BuildPluginManager pluginManager
	
	@Parameter(property='dependencyhandler.outputDirectory', defaultValue='${project.build.directory}')
	File outputDirectory
	
	@Parameter(property='dependencyhandler.includeTransitive', defaultValue='true')
	boolean includeTransitive

	@Parameter(property='dependencyhandler.stripVersion', defaultValue='false')
	boolean stripVersion

	@Parameter(property='dependencyhandler.stripClassifier', defaultValue='false')
	boolean stripClassifier

	@Parameter(property='dependencyhandler.includes')
	String includes;

	@Parameter(property='dependencyhandler.excludes')
	String excludes;
	
	@Parameter(property='dependencyhandler.overrideExisting', defaultValue='true')
	boolean overrideExisting;

	@Parameter(property='dependencyhandler.markersDirectory', defaultValue='${project.build.directory}/dependency-maven-plugin-markers')
	File markersDirectory;
	
	@Parameter(property='dependencyhandler.dependencyPluginVersion', defaultValue='2.8')
	String dependencyPluginVersion

	List filterDependencies(){
		AndArtifactFilter filter = new AndArtifactFilter()
		if(includes) {
			List includeList = includes.split(',\\s*')
			log.info("Using include filter: ${includeList}" )
			PatternIncludesArtifactFilter includeFilter = new PatternIncludesArtifactFilter(includeList, false)
			filter.add(includeFilter)
		}
		if(excludes){
			List excludeList = excludes.split(',\\s*')
			log.info("Using exclude filter: ${excludeList}" )
			PatternExcludesArtifactFilter excludeFilter = new PatternExcludesArtifactFilter(excludeList, false)
			filter.add(excludeFilter)
		}
		
		Set artifacts = includeTransitive? mavenProject.getArtifacts() : mavenProject.getDependencyArtifacts()
		def filtered = []
		artifacts.each {
			if(filter.include(it)){
				filtered += it
			}
		}
		filtered
	}
	
	void createSymlinks(List filtered){
		SimpleTemplateEngine templateEngine = new SimpleTemplateEngine()
		String symlinkPattern = '${artifactId}'
		if(!stripVersion){
			symlinkPattern+='-${version}'
		}
		if(!stripClassifier){
			symlinkPattern+= '${dashClassifier}'
		}
		symlinkPattern+='.${type}'
		log.info("Using symlinkPattern: ${symlinkPattern}")
		outputDirectory.mkdirs()
		filtered.each { Artifact it ->
			def artifactMap = [
				'artifactId': it.artifactId,
				'groupId': it.groupId,
				'version': it.version,
				'type': it.type,
				'classifier': it.classifier ?: "",
				'dashClassifier': it.classifier? "-${it.classifier}" : ""]
			def name = templateEngine.createTemplate(symlinkPattern).make(artifactMap)
			File f = new File(outputDirectory, name.toString())
			Path t = f.toPath()
			Path s = it.getFile().toPath()
			log.info("Configured Artifact: ${it} $s -> $t")
			if(overrideExisting && f.exists()){
				f.delete()
			}
			Files.createSymbolicLink(t, s)
		}
	}

	Element[] artifactItems(List filtered){
		def items = filtered.collect { a ->
			def coordinates = [
				element('groupId', a.groupId),
				element('artifactId', a.artifactId),
				element('type', a.type)
			]
			if (a.classifier){
				coordinates += element('classifier', a.classifier)
			}

			Element artifactItem = element('artifactItem', coordinates as Element[])
		} as Element[]
	}
	
	void dependencyMavenPluginCopy(List filtered){
		dependencyMavenPlugin(filtered, 'copy', {
				configuration(
					element(name('stripVersion'), "${stripVersion}"),
					element(name('stripClassifier'), "${stripClassifier}"),
					element(name('outputDirectory'), "${outputDirectory}"),
					element(name('artifactItems'), artifactItems(filtered))
				)
			}
		)
	}
	void dependencyMavenPluginUnpack(List filtered){
		dependencyMavenPlugin(filtered, 'unpack', {
				configuration(
					element(name('markersDirectory'), "${markersDirectory}"),
					element(name('outputDirectory'), "${outputDirectory}"),
					element(name('artifactItems'), artifactItems(filtered))
				)
			}
		)
	}
	
	private void dependencyMavenPlugin(List filtered, String goal, Closure configuration){
		executeMojo(
			plugin(
				groupId('org.apache.maven.plugins'),
				artifactId('maven-dependency-plugin'),
				version(dependencyPluginVersion)
			),
			goal,
			configuration(filtered),
			executionEnvironment(
				mavenProject,
				mavenSession,
				pluginManager
			)
		);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy