Пользовательский формат Maven 3

Я пытаюсь создать собственный формат для плагина сборки maven. Я использую следующую инструкцию по созданию расширений для maven 3: Создание пользовательского расширения сборки для Maven 3.0

Мой 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>
        <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:assembly (default-cli) в проекте cl3: произошла несовместимость типов при выполнении 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, и я не понимаю, как его исправить.

Заранее спасибо.


person Pavel Drobushevich    schedule 22.12.2010    source источник


Ответы (2)


Я нашел ответ. Я пытаюсь расширить maven-assembly-plugin, и мне не нужно создавать расширение или плагин, но я добавляю свою банку к зависимостям в этом плагине.

Я создал простой проект 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. И используйте этот проект в зависимостях 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>
person Pavel Drobushevich    schedule 22.12.2010

Вам нужно добавить третий компонент, реализующий роль PlexusIoResourceCollection.

Следующий дескриптор работает для меня и заставляет maven обрабатывать расширение 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>

Использование его в качестве расширения сборки приводит к проблемам приведения, которые я не исследовал.

person user1593165    schedule 08.02.2016