You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "Paul Benedict (JIRA)" <ji...@codehaus.org> on 2014/07/02 15:45:20 UTC

[jira] (MNG-4455) Pluggable Artifact types

     [ https://jira.codehaus.org/browse/MNG-4455?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Paul Benedict updated MNG-4455:
-------------------------------

    Fix Version/s:     (was: Issues to be reviewed for 3.x)

> Pluggable Artifact types
> ------------------------
>
>                 Key: MNG-4455
>                 URL: https://jira.codehaus.org/browse/MNG-4455
>             Project: Maven
>          Issue Type: Improvement
>          Components: Artifacts and Repositories
>            Reporter: Kek
>
> First I want to thank to authors of great tool like Maven is.
> And now my wish for Maven improvement:
> Last week I try to make my first maven plugin to add support for my proprietary packaging, the inspiration was from http://stackoverflow.com/questions/1427722/how-do-i-create-a-new-packaging-type-for-maven. 
> This works fine, but I need support following scenario:
> 1) In Project-X  add dependency on Artifact-Y with packaging/type set to "MyArchive"
> 2) Maven resolves this dependency and downloads the artifact to local repository
> 3) When compilation or testing phase occures, the Artifact-Y:MyArchive should be unpacked to some location (when not already unpacked) and the location should be added as classpathElement to project classpath. 
> I know, there is some possibility to use unpack-dependencies goal, but I need to unpack the dependency only ones and share it in multi-module project environment. And second problem is how to modify classpath to add the unpacked location. I found many questions about this functionality on many forums, but no solution. Many people want to add some folder to classpath, but no way. There was one - the system scope in dependency specification, but currently it does not support folders in path.
> So for my solution I create some specialized Mojo for this with following hack-code:
>    
> Set<Artifact> artSet=project.getDependencyArtifacts();
>     for(Artifact art:artSet){
>       if("MyArchive".equals(art.getType())){
>         File sharedFolder = new File("\\\\temp\\maven-shared")
>         UnpackUtility.unpack(art.getFile(),sharedFolder);
>         art.setFile(sharedFolder);
>         art.setResolved(true);
>       }
>     }
> This works fine, but when I use this in M2Eclipse plugin, then the folder is not added to project classpath, because there is not my Mojo plugin executed during classpath resolution.
> I look at m2eclipse source codes and to Maven2 and Maven3 source codes and in my opinion the best way how to add support for this kind of issues ( when somebody want to define its own type of Artifact and provide some plugable logic for its resolution/initialization) will be:
> 1) add and call ArtifactHandler.getClassPathFile() instead of Artifact.getFile() to obtain reference to file or directory to be added to classpath  - the ArtifactHandler could provide specialized implementation for different Artifact types as supported in current version.
> 2) OR add some support for plugable Artifact realizations by type, in current versions there is DefaultArtifactFactory used for Artifact creation like :
> ArtifactHandler handler = artifactHandlerManager.getArtifactHandler( type );
> return new DefaultArtifact( groupId, artifactId, versionRange, desiredScope, type, classifier, handler,optional );
> The code should be changed to:
> ArtifactHandler handler = artifactHandlerManager.getArtifactHandler( type );
> return handler.createArtifact( groupId, artifactId, versionRange, desiredScope, type, classifier,optional );
> Or the ArtifactFactory should be pluggable by Artifact-type in the same way as ArtifactHandler.
> Or some other solution.
> I could contribute these changes to Maven, but I'm not sure, what is the prefered way to follow Maven architecture ideas.



--
This message was sent by Atlassian JIRA
(v6.1.6#6162)