web-dev-qa-db-ja.com

Mavenの新しいパッケージタイプを作成するにはどうすればよいですか?

私はMavenでjarファイルを作成する必要がありますが、「foobar」拡張子を付けてリポジトリにインストールする必要があります。独自のパッケージタイプを用意して、それらのアーティファクトをパッケージングで識別できるようにするといいでしょう。

これを行うために新しいパッケージタイプを設定できますか?

31
talk to frank

あなたが説明したようにするには、パッケージ化されたMavenプロジェクトを作成しますjar(述べられたように here 、mojoがないので)定義)。 src/main/resources/META-INF/plexusサブフォルダーで、次の内容のcomponents.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で、packageing要素に必要なタイプを宣言し、カスタムパッケージが提供されるようにプラグインを指定したことを確認します。 <extensions> true </ extensions>を宣言すると、プラグインがパッケージングや型ハンドラーを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は、components.xmlで指定された「.foobar」拡張子の付いたリポジトリにファイルを配信します

44
Rich Seller

リッチセラーの元の回答のフォローアップ:

彼が推奨するパッケージタイプ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>

この設定は、プラグインドキュメントの例 here で見つかりました。

maven-pluginパッケージタイプのライフサイクルでは、plugin:descriptorゴールがgenerate-resourcesフェーズにバインドされています。これは Sonatypeの公式ドキュメント で指定されています。

3
KomodoDave