Как создать новый тип упаковки для Maven? - PullRequest
29 голосов
/ 15 сентября 2009

У меня есть требование для создания jar-файлов с Maven, но их необходимо установить в репозиторий с расширением «foobar», и было бы неплохо, если бы у них был свой тип упаковки, чтобы мы могли идентифицировать эти артефакты с помощью упаковка.

Можно ли для этого установить новый тип упаковки?

Ответы [ 2 ]

42 голосов
/ 15 сентября 2009

Чтобы сделать, как вы описали, создайте проект Maven с упаковкой jar (как указано здесь , так как не будет определений mojo). В подпапке src / main / resources / META-INF / plexus создайте файл component.xml со следующим содержимым (если вы хотите, чтобы тип упаковки был «my-custom-type», измените его на «foobar», если вы по желанию).

<component-set>
  <components>
    <component>
      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
      <role-hint>my-custom-type</role-hint>
      <implementation>
        org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping
      </implementation>
      <configuration>
    <phases>
      <!--use the basic jar lifecycle bindings, add additional 
          executions in here if you want anything extra to be run-->          
      <process-resources>
        org.apache.maven.plugins:maven-resources-plugin:resources
      </process-resources>
      <package>
        org.apache.maven.plugins:maven-jar-plugin:jar
      </package>
      <install>
        org.apache.maven.plugins:maven-install-plugin:install
      </install>
      <deploy>
        org.apache.maven.plugins:maven-deploy-plugin:deploy
      </deploy>
    </phases>
      </configuration>
    </component>
    <component>
      <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
      <role-hint>my-custom-type</role-hint>
      <implementation>
        org.apache.maven.artifact.handler.DefaultArtifactHandler
      </implementation>
      <configuration>
        <!--the extension used by Maven in the repository-->
        <extension>foobar</extension>
        <!--the type used when specifying dependencies etc.-->
        <type>my-custom-type</type>
        <!--the packaging used when declaring an implementation of 
          the packaging-->
        <packaging>my-custom-type</packaging>
      </configuration>
    </component>
  </components>
</component-set>

Затем в pom, который должен иметь нестандартную упаковку, объявите требуемый тип в элементе упаковки и убедитесь, что вы указали плагин, чтобы можно было добавить нестандартную упаковку. Объявление true сообщает Maven, что плагин предоставляет Maven обработчики упаковки и / или типа.

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>name.seller.rich</groupId>
  <artifactId>test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>my-custom-type</packaging>
  <build>
    <plugins>
      <plugin>
        <groupId>name.seller.rich.maven.plugins</groupId>
        <artifactId>maven-foobar-plugin</artifactId>
        <version>0.0.1</version>
        <!--declare that this plugin contributes the component extensions-->
        <extensions>true</extensions>
      </plugin>
    </plugins>
  </build> 
</project>

Когда проект упакован, это будет jar с расширением .jar, однако, когда он установлен / развернут, Maven доставит файл в хранилище с расширением ".foobar", как указано в файле component.xml.

3 голосов
/ 12 декабря 2012

В ответ на оригинальный ответ богатого продавца:

Если он рекомендует использовать тип упаковки jar, то, скорее всего, в проекте, где вы ссылаетесь на свой плагин, вы получите:

[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] The plugin descriptor for the plugin Plugin [com.ocado.mvn.packaging:Jar-Gem] was not found. Please verify that the plugin JAR /home/ndb/.m2/repository/com/ocado/mvn/packaging/Jar-Gem/1.0.0/Jar-Gem-1.0.0.jar is intact.

Это потому, что в сгенерированном вами JAR-файле отсутствует дескриптор плагина.

Вы можете использовать следующее, чтобы обойти ошибку No mojo definitions.., которую он упоминает:

<packaging>maven-plugin</packaging>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-plugin-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
            </configuration>
        </plugin>
    </plugins>
</build>

Эта конфигурация была найдена в плагине документации здесь .

Жизненный цикл maven-plugin типа упаковки имеет цель plugin:descriptor, связанную с фазой generate-resources. Это указано в официальной документации Sonatype .

...