Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Any way to specify a FileSet as command line parameter?

Tags:

maven

mojo

I'm creating a Mojo which doesn't need a project to run.

I would like to use something similar to org.apache.maven.model.FileSet (providing multiple directories with includes and excludes) as a @parameter but my problem is that I need to be able to set those values using command line.

Any idea how to achieve this?

like image 441
Cristiano Avatar asked Jul 24 '15 22:07

Cristiano


2 Answers

See:

  • Guide to Developing Java Plugins, Parameter Types With Multiple Values
  • Using Plugin Tools Java5 Annotations
  • Maven Plugin Tool for Annotations, Supported Annotations
  • org.apache.maven.model.FileSet

POM

  <groupId>so</groupId>
  <artifactId>multiple-values-maven-plugin</artifactId>
  <version>1.0</version>
  <packaging>maven-plugin</packaging>

  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>3.3.3</version>
    </dependency>

    <dependency>
      <groupId>org.apache.maven.plugin-tools</groupId>
      <artifactId>maven-plugin-annotations</artifactId>
      <version>3.4</version>
      <scope>provided</scope><!-- annotations are needed only to build the plugin -->
    </dependency>
  </dependencies>

  <!-- This latest plugin has to be used if using Java 8 classes. -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-plugin-plugin</artifactId>
        <version>3.4</version>
      </plugin>
    </plugins>
  </build>

Mojo

package so;

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import org.apache.maven.model.FileSet;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

@Mojo( name = "values", requiresProject = false )
public class MultipleValuesMojo extends AbstractMojo
    {
    @Parameter( property = "array", required = true )
    private String[] array;

    @Parameter( property = "list", required = true )
    private List<String> list;

    @Parameter( property = "set", required = true )
    private String[] setElements;
    private Set<String> set;

    @Parameter( property = "map", required = true )
    private String[] mapEntries;
    private Map<String, String> map;

    @Parameter( property = "includes", required = true )
    private List<String> includes;

    @Parameter( property = "excludes", required = true )
    private List<String> excludes;

    @Override
    public void execute() throws MojoExecutionException
        {
        getLog().info( "Array: " + Arrays.toString( array ) );
        getLog().info( " List: " + list.toString() );
        set = Arrays.stream( setElements ).collect( Collectors.toSet() ); // with Java >=8
        addSetElementsToSet(); // with Java <8
        getLog().info( "  Set: " + set.toString() );
        map = Arrays.stream( mapEntries ).collect( Collectors.toMap( s -> s, s -> s ) ); // with Java >=8
        putMapEntriesToMap(); // with Java <8
        getLog().info( "  Map: " + map.toString() );

        getLog().info( "Includes: " + includes.toString() );
        getLog().info( "Excludes: " + excludes.toString() );

        FileSet fileSet = new FileSet();
        fileSet.setIncludes( includes );
        fileSet.setExcludes( excludes );
        getLog().info( " FileSet: " + fileSet.toString() );
        } // execute()

    private void addSetElementsToSet()
        {
        set = new HashSet<String>( setElements.length );
        for ( String entry : setElements )
            {
            set.add( entry );
            }
        } // addSetElementsToSet()

    private void putMapEntriesToMap()
        {
        map = new HashMap<String, String>( mapEntries.length );
        for ( String entry : mapEntries )
            {
            int equalsPosition = entry.indexOf( "=" );
            map.put(
                entry.substring( 0, equalsPosition ),
                entry.substring( equalsPosition + 1 ) );
            }
        } // putMapEntriesToMap()

    } // MultipleValuesMojo

Run

mvn so:multiple-value-maven-plugin:values
  -Darray=VALUE_1,VALUE_2,VALUE_3
  -Dlist=VALUE_1,VALUE_2,VALUE_3
  -Dset=VALUE_1,VALUE_2,VALUE_3
  -Dmap=KEY_1=VALUE_1,KEY_2=VALUE_2,KEY_3=VALUE_3
  -Dincludes=/,/usr/*
  -Dexcludes=/root,/tmp 

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building multiple-values-maven-plugin 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- multiple-values-maven-plugin:1.0:values (default-cli) @ multiple-values-maven-plugin ---
[INFO] Array: [VALUE_1, VALUE_2, VALUE_3]
[INFO]  List: [VALUE_1, VALUE_2, VALUE_3]
[INFO]   Set: [VALUE_3, VALUE_2, VALUE_1]
[INFO]   Map: {KEY_1=VALUE_1, KEY_3=VALUE_3, KEY_2=VALUE_2}
[INFO] Includes: [/, /usr/*]
[INFO] Excludes: [/root, /tmp]
[INFO]  FileSet: FileSet {directory: null, PatternSet [includes: {/, /usr/*}, excludes: {/root, /tmp}]}
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.671 s
[INFO] Finished at: 2015-07-25T21:44:09+02:00
[INFO] Final Memory: 11M/115M
[INFO] ------------------------------------------------------------------------
like image 91
Gerold Broser Avatar answered Oct 13 '22 18:10

Gerold Broser


Anyone looking for the solution:

-D<some-property>.fileSet=['path-to-fileset']

did the trick for me. It might require slight modification, depending on a plugin you're configuring, but you get the idea.

Tested on Maven 3.5.0

like image 1
Alexander Biryukov Avatar answered Oct 13 '22 17:10

Alexander Biryukov