2010-12-22 138 views
1

我尝试为Maven Assembly插件创建自定义格式。 我用下面的指令如何对Maven 3创造一些推广:Creating a Custom Build Extension for Maven 3.0Maven 3自定义格式

我的pom.xml的extention:

<?xml version="1.0"?> 
<project 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>my.maven.extention</groupId> 
    <artifactId>pkg</artifactId> 
    <version>0.0.1</version> 
    <name>maven pkg archiver</name> 
    <url>http://maven.apache.org</url> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>org.codehaus.plexus</groupId> 
      <artifactId>plexus-archiver</artifactId> 
      <version>1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-compat</artifactId> 
      <version>3.0.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven</groupId> 
      <artifactId>maven-core</artifactId> 
      <version>3.0.1</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.plexus</groupId> 
       <artifactId>plexus-component-metadata</artifactId> 
       <version>1.5.5</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>generate-metadata</goal> 
          <goal>generate-test-metadata</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

而空类:

import java.io.IOException; 

import org.codehaus.plexus.archiver.AbstractArchiver; 
import org.codehaus.plexus.archiver.Archiver; 
import org.codehaus.plexus.archiver.ArchiverException; 
import org.codehaus.plexus.component.annotations.Component; 

@Component(role = Archiver.class, hint = "pkg") 
public class PkgArchiver extends AbstractArchiver { 

    @Override 
    protected void close() throws IOException { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void execute() throws ArchiverException, IOException { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected String getArchiveType() { 
     return "pkg"; 
    } 

} 

而且在我的Maven项目中使用:

<extensions> 
    <extension> 
     <groupId>my.maven.extention</groupId> 
     <artifactId>pkg</artifactId> 
     <version>0.0.1</version> 
     </extension> 
</extensions> 

但mvn失败:

[错误]无法执行目标org.apache.maven.plugins:maven-assembly-plugin:2.2:项目cl3上的程序集(default-cli):执行org.apache.maven.plugins时发生类型不兼容:maven-assembly-plugin:2.2:assembly:my.maven.extention.pkg.PkgArchiver不能转换为org.codehaus.plexus.archiver.Archiver

我不承认。由于AbstractArchiver实现了org.codehaus.plexus.archiver.Archiver,我的类扩展了这个抽象类。我的建议是:maven为不同的插件使用不同的类加载器。这是我的第一个maven插件,我不明白我该如何解决它。

在此先感谢。

回答

1

我找到答案。我尝试扩展maven-assembly-plugin,但我没有创建扩展或插件,而是将我的jar添加到此插件中的依赖项。

我已经创建简单的Maven项目,pom.xml

<?xml version="1.0"?> 
<project 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>my.maven.extention</groupId> 
    <artifactId>pkg</artifactId> 
    <version>0.0.1</version> 
    <name>maven pkg archiver</name> 
    <url>http://maven.apache.org</url> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>org.codehaus.plexus</groupId> 
      <artifactId>plexus-archiver</artifactId> 
      <version>1.1</version> 
     </dependency> 
    </dependencies> 
</project> 

并添加组件描述src/main/resources/META-INF/plexus/components.xml

<component-set> 
    <components> 
     <component> 
      <role>org.codehaus.plexus.archiver.Archiver</role> 
      <role-hint>pkg</role-hint> 
      <implementation>cmy.maven.extention.pkg.PkgArchiver</implementation> 
      <instantiation-strategy>per-lookup</instantiation-strategy> 
     </component> 
    </components> 
</component-set> 

而且从PkgArchiver class删除anotation。 并在maven-assembly-plugin的依赖项中使用此项目。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2</version> 
    <configuration> 
     <descriptors> 
      <descriptor>${basedir}/src/main/assembly/assembly.xml</descriptor> 
     </descriptors> 
    </configuration> 
    <dependencies> 
     <dependency> 
      <groupId>my.maven.extention</groupId> 
      <artifactId>pkg</artifactId> 
      <version>0.0.1</version> 
     </dependency> 
    </dependencies> 
</plugin> 
0

您需要添加实现角色PlexusIoResourceCollection的第三个组件。

下面的描述对我的作品并得到行家来处理扩展XPI作为存档(ZIP)扩展

<?xml version="1.0" encoding="UTF-8"?> 
<component-set> 
    <components> 

     <component> 
      <role>org.codehaus.plexus.archiver.Archiver</role> 
      <role-hint>xpi</role-hint> 
       <implementation>org.codehaus.plexus.archiver.zip.ZipArchiver</implementation> 
      <instantiation-strategy>per-lookup</instantiation-strategy> 
     </component> 

     <component> 
      <role>org.codehaus.plexus.archiver.UnArchiver</role> 
      <role-hint>xpi</role-hint> 
      <implementation>org.codehaus.plexus.archiver.zip.ZipUnArchiver</implementation> 
      <instantiation-strategy>per-lookup</instantiation-strategy> 
     </component> 

     <component> 
      <role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role> 
      <role-hint>xpi</role-hint> 
      <implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation> 
      <instantiation-strategy>per-lookup</instantiation-strategy> 
     </component> 

    </components> 
</component-set> 

在客户端项目,则需要使用它作为插件依赖性

  <artifactId>maven-assembly-plugin</artifactId> 
      <dependencies> 
       <dependency> 
        <groupId>your.group.id</groupId> 
        <artifactId>xpi-archiver</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
       </dependency> 
      </dependencies> 

使用它作为构建扩展会导致抛出我没有调查过的问题。