2011-08-28 10 views
17

が由来するプロジェクトへの依存関係が に含まれるプロジェクトスケルトンを生成するMavenのアーキタイプを作成しています。Mavenのアーキタイプにアーキタイププロジェクトのバージョンを埋め込む方法は?

例えば、原点プロジェクトは次のようになります。

origin/archetype/... archetype for generating project 
     /core/... core services 
     /extra/... extra services 

と原型がそうのような 依存関係が含まれているPOMでプロジェクトが生成されます。私はSOMEVERSIONになりたい

<dependencies> 
    <dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>origin-core</artifactId> 
    <version>SOMEVERSION</code> 
    </dependency> 
</dependencies> 

をバージョン の原点プロジェクトのアーキタイプがビルドされ、リポジトリにインストールされていることを確認します。

原点プロジェクトは、バージョン1.0-SNAPSHOTにあり、mvn install EDであれば、私は原型が origin-core 1.0-SNAPSHOTへの依存を生成したいです。そして起点プロジェクトがリリースされ、自動的に がバージョン1.0にバンプされたら、私は origin-core 1.0に依存関係を生成したいと思っています。

基本的にをアーキタイプ POMのベロシティ変数に使用したいと思いますが、これは可能ではないようです。

私がここでやろうとしていることを達成する他の方法はありますか?

答えて

32

私は数日前にMavenのメーリングリストで上記の質問をして転落しました。幸いにも、私は結局私自身でそれを理解しました。

src/main/resources/archetype-resources/pom.xmlファイルのMavenフィルタリングを使用して、アーキタイプを構築するときに現在のプロジェクトバージョンで置き換えることができます。ここで

は、どのように行うのです:あなたの原型ファイルが自然${variable}すべての場所でだとあなたがそれらを望んでいないがありますので

は何か(上archetype-resources/pom.xmlファイルをフィルタリングしていない可能にするために、あなたのarchetype/pom.xmlファイルを変更しますビルド時に置換されるようにするには、アーキタイプが作成されたときにそれらを置換する必要があります)。

<pluginManagement> 
    <plugins> 
    ... 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-resources-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
     <escapeString>\</escapeString> 
     </configuration> 
    </plugin> 
    </plugins> 
</pluginManagement> 
:フィルタするとき、あなたは彼らが原型生成時に置換することができるようにそのまま維持する必要がある、あなたの原型のポンポン内のすべての変数をエスケープすることができるように

<resources> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>archetype-resources/pom.xml</include> 
    </includes> 
    </resource> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>archetype-resources/pom.xml</exclude> 
    </excludes> 
    </resource> 
</resources> 

、使用するエスケープ文字を有効にします

(上記の<resources><pluginManagement>の要素は、POMの<build>要素内に配置する必要があります。)あなたは原型プロジェクトのバージョンが挿入されるようにしたいあなたの原型のポンポン、中

使用${project.version}、および原型発生時刻まで無置換残るべき他のすべての変数をエスケープ:

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>\${groupId}</groupId> 
    <artifactId>\${artifactId}</artifactId> 
    <version>\${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    </dependencies> 

</project> 
+0

まさに私が必要としたものです。どうもありがとう。 –

+0

魅力的な作品です!ありがとう。 – Malvin

+0

これはとても甘く、優れた投稿です。 – ocarlsen

12

代替これがそうのように行われている

受け入れ答えにソリューションがarchetype's descriptor/metadataファイルのデフォルトプロパティをフィルタリングすることである。

のみフィルタリングのmavenこのファイルをフィルタリング:

<resources> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>META-INF/maven/archetype-metadata.xml</include> 
    </includes> 
</resource> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>META-INF/maven/archetype-metadata.xml</exclude> 
    </excludes> 
</resource> 
</resources> 

原型メタデータファイル:

<archetype-descriptor ...> 
    <requiredProperties> 
     <requiredProperty key="projectVersion"> 
      <defaultValue>${project.version}</defaultValue> 
     </requiredProperty> 
    </requiredProperties> 

    ... 
</archetype-descriptor> 

と原型のPOMは、それがプロジェクトのバージョンとしてprojectVersion必要なプロパティ値を使用することを除いて前のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>${groupId}</groupId> 
    <artifactId>${artifactId}</artifactId> 
    <version>${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${projectVersion}</version> 
    </dependency> 
    </dependencies> 

</project> 

このアプローチには、アーキタイプのPOM内のすべてのプロパティ値とそれに伴うリソースプラグイン設定をエスケープする必要がないという利点があります。個人的には、そのすべてがかなり醜く、エラーが発生しやすいことがわかります。

これは、ユーザーがアーキタイプを生成するときにプロジェクトのバージョンを確認または変更するよう求められたことを意味します。シナリオに応じて、これは良いか悪いかと考えられます。

+0

このソリューションは、受け入れられたソリューションよりもはるかに優れています。これは大変ありがとうございます。多くの時間を節約します –

-1

私はむしろばかげて試してみたところ、うまくいったようです。私は私のMETA-INF/mavenの/原型-metadata.xmlファイルに以下を追加しました:

<requiredProperties> 
    <requiredProperty key="archetypeVersion"> </requiredProperty> 
</requiredProperties> 

あなたはそれがデフォルトでそれについて知っていると思うだろうが、そう、これはそれを使用することを思い出させるように思われません。おそらくそれはmavenのバグが原因です。

+0

対話モードを使用していて、アーキタイプのテストリソースをフィルタリングする必要がある場合は、動作しません。オプションで@PhilManderの答えに依存して仕事をすることができます。 – LoganMzz

関連する問題