このことに対する私の情熱的な憎しみについて複数の記事を書くことができますが、今日はMavenの非常に優れた機能の1つ、つまりアーキタイプについてお話したいと思います。 公式ドキュメント 、Maven onHabréの各チュートリアル( 1、2、3 )で読むことができるのは何ですか?実際、おそらくあなたは自分自身を知っているでしょう。
したがって、アーキタイプはクールであり、1)標準構造を持つ多くのプロジェクトに含まれていれば素晴らしいことです。 2)持っていない人に固定することは可能です。
それが、 Peter LedbrookがRatpackにアーキタイプの完全な欠如を見たときに考えたものです。 その後、プロジェクトを生成するツールであるLazybonesプロジェクトが誕生しました。

この記事では、1)Lazybonesを使用して、テンプレートが既に作成されているプロジェクトを生成する方法を説明します。 2)プロジェクト用の新しいテンプレートを作成します。
既存のLazybonesテンプレートの使用
その後、すべてが非常に短くなります。
- GVMを使用してLazybonesをインストールするか、 Bintrayから配布パッケージをダウンロードします
-
lazybones list
コマンドでどのパターンが存在するかを調べます(またはリポジトリを調べます ) -
lazybones info < >
コマンドを使用して、選択したテンプレートに関する情報を調べます(またはBintrayのテンプレートのpackag-eのreadmeを読みます) - コマンド
lazybones create < > < > < >
を使用してプロジェクトを作成lazybones create < > < > < >
それだけです。注意してくれてありがとう、みんな無料です。 いいえ、しかし今は面白いだけを行います。
独自のプロジェクトテンプレートを作成する
#361 Mavenアーキタイプ ( maven-archetype-quickstart )に精通している可能性が高いため、同様のことを行います(すべての機能を再作成したため、繰り返しを省略します)。
ダウンロードしたインターネットの数を比較して両方のプロジェクトを作成できるだけでなく、テンプレート自体の作成の複雑さも比較できます 。これは、Mavenアーキタイプの作成プロセスがここで完全に説明されているためです。
行きましょう。
私たちが達成したいこと:
- インタラクティブなコマンドラインで
groupId
したgroupId
、artifactId
およびversionを使用して基本的なpom.xmlを作成します - ディレクトリsrc / main / java、src / main / resourcesを作成します(テストでも同じですが、簡単にするために行いません)
- 例のクラスを作成し、インタラクティブコマンドラインで選択した
package
そのpackage
登録し、package
適したディレクトリに配置しpackage
(テストでも同じですが、簡単にするために行いません) - クラスで
main
を生成します。これは、テストフェーズの開始時に対話型コマンドラインを介して選択されたメッセージを出力します - テンプレートを組み立てる
- テンプレートに従ってプロジェクトを作成します
-
mvn test
実行します - 利益
- テンプレートを作成するには、Gradleスクリプトとテンプレートのあるディレクトリが必要です。 レイジーすぎるので、レイジーボーンを実行します。
>lazybones create lazybones-project lzb-templates
その結果、次のことができます。
│build.gradle //チャルボンビルドスクリプト │gradlew // nyxのスクリプト起動ファイル │gradlew.bat // Windows用のスクリプト起動ファイル │README.md //このプロジェクトを説明するファイル │ ├───gradle//スクリプトの補助ディレクトリ │ └───templates//テンプレートの空のディレクトリ
-
templates
ディレクトリに移動し、その中にtemplates
のサブディレクトリを作成し、スカルプトを開始します。 バージョンファイルを作成します。 これはVERSION
と呼ばれ、バージョンのみ(0.1など)が含まれます
> mkdir maven-simple > cd maven simple > echo 0.1>バージョン
- さらに、プロジェクトの作成後に表示される
readme.md
を作成する必要があります。 -
src/main/java
、src/main/resources
ディレクトリを作成します。java
およびそれらからのresources
では、空の.retain
ファイルを配置します
├───maven-simple ││README.md ││バージョン ││ │└───src │└───メイン │├───java ││.retain ││ │└───リソース │.retain
- ここで、テンプレートの世話をしましょう。 pom.xmlから始めましょう。
<project> <modelVersion>4.0.0</modelVersion> <groupId>${groupId}</groupId> <artifactId>${artifactId}</artifactId> <version>${version}</version> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass>${pkg}.App</mainClass> <arguments> <argument>${message}</argument> </arguments> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
AAAAA !!!!!!!
それで、一緒になって、見てください。 あらゆる種類の${...}
注意してください。 これは、create
実行時にユーザーが求める値に変更するものです。 本質的に、これらは単なるGroovyテンプレートトークンです。 Velocity、Freemarker、またはその他のテンプレートハンドラーに精通している場合は、すべてに精通しているでしょう。 しかし、それについては後で。
Hellfire inは、App
main
クラスの単なる起動です。 このクラスのpackage
とmain
に渡すパラメーターをまだ認識していないことに注意してください。 -
App.java
ファイルを見てください:
package ${pkg}; public class App { public static void main(String[] args) { System.out.println(args[0]); } }
ここでは、変数が1つだけあります-ここでもpackage
です。 同時に、mainが引数を出力することがわかります。 これは、テスト段階でMavenの起動中に、ユーザーがcreate
間に選択したメッセージが表示されることを期待していることを意味しcreate
。
これで、すべてのディレクトリとテンプレートができました。
│App.java │lazybones.groovy │pom.xml │README.md │バージョン │ └───src └───メイン ├───java │.retain │ └───リソース 保持する
- そして今、楽しみが始まります。 ディレクトリを解凍した後に実行するポストプロセッサを記述することは残ります。 タスク:1)ユーザーが必要とするすべてのものを見つける、2)パッケージに対応するディレクトリにjavaファイルを転送する、3)テンプレートを処理する。
もちろん、エレガントなGrooveスクリプトはこれに役立ちます。
import static org.apache.commons.io.FileUtils.moveFileToDirectory Map<String,String> props = [:] // ask 2 - , . // . ( , ) . props.groupId = ask(' groupId [org.example]: ', 'org.example') props.artifactId = ask(' artifactId [maven-simple]: ', 'maven-simple') props.version = ask(' [1.0-SNAPSHOT]: ', '1.0-SNAPSHOT') props.pkg = ask(" package [$props.groupId]:", props.groupId) props.message = ask(' ? ', ', !') // processTemplates , . processTemplates 'pom.xml', props // String packageDir = props.pkg.replaceAll(/\./, '/') // moveFileToDirectory(new File(targetDir, 'App.java'), new File(targetDir, "src/main/java/$packageDir"), true) // processTemplates 'src/main/java/**/App.java', props
コメントが、何が起こっているのかを非常に明確に説明することを願っています。 おそらく追加する必要があるのは、ask()
およびprocessTemplates()
メソッドとprocessTemplates()
フィールドが、このスクリプトのカスタムスーパークラスであるuk.co.cacoethes.lazybones.LazybonesScript
クラスからスクリプトに入ることです。 - 収集する時間です。 Lazybonesには、ステップ1で生成したビルドスクリプトで既に構成されているGradle用の独自のプラグインがあります。このプラグインは、ビルド、ローカルキャッシュへのインストール、およびBintrayへのテンプレートの展開のタスクルールを定義します 。 テンプレートは深刻ではないため、Bintrayには配置しませんが、キャッシュにインストールして実行する必要があります。 アセンブリを開始します。
>gradlew installTemplateMavenSimple
:packageTemplateMavenSimple
:installTemplateMavenSimple
BUILD SUCCESSFUL
- テスト中! 新しいディレクトリを作成し、その中のテンプレートからプロジェクトを作成します(すでに見たように)。
>lazybones create maven-simple 0.1 maven-simple
Creating project from template maven-simple 0.1 in 'maven-simple'
groupId [org.example]: com.demo
artifactId [maven-simple]:
[1.0-SNAPSHOT]: 0.1
package [org.example]:org.simple
? , !
-
---------------------------------
. ? .
Project created in maven-simple!
最後のメッセージは、もちろんreadme.md
からreadme.md
ます。 デフォルトではmaven-simple
想定して、artifactId
指定しなかったことに注意してください。
maven-simpleディレクトリに移動して、感心します。
│pom.xml │README.md │ └───src └───メイン ├───java │└───org │└───シンプル │App.java │ └───リソース
pom.xmlを開きます。
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.demo</groupId> <artifactId>maven-simple</artifactId> <version>0.1</version> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass>org.simple.App</mainClass> <arguments> <argument>, !</argument> </arguments> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
すべてがそうであるように。 App.javaを開きます。
package org.simple; public class App { public static void main(String[] args) { System.out.println(args[0]); } }
同じ順序。 Mavenを起動します。
> mvnテスト [情報]プロジェクトをスキャンしています... [情報] [情報] ----------------------------------------------- ------------------------- [情報] maven-simple 0.1の構築 [情報] ----------------------------------------------- ------------------------- [情報] [情報] --- maven-resources-plugin:2.6:リソース(デフォルトリソース)@ maven-simple --- [情報] 0個のリソースをコピーしています [情報] [情報] --- maven-compiler-plugin:2.5.1:compile(default-compile)@ maven-simple --- [情報]コンパイルするものはありません-すべてのクラスが最新です [情報] [情報] --- maven-resources-plugin:2.6:testResources(default-testResources)@ maven-simple --- [情報] [情報] --- maven-compiler-plugin:2.5.1:testCompile(default-testCompile)@ maven-simple --- [情報]コンパイルするソースがありません [情報] [情報] --- maven-surefire-plugin:2.12.4:test(default-test)@ maven-simple --- [情報]実行するテストはありません。 [情報] [情報] >>> exec-maven-plugin:1.2.1:java(デフォルト)@ maven-simple >>> [情報] [情報] <<< exec-maven-plugin:1.2.1:java(デフォルト)@ maven-simple <<< [情報] [情報] --- exec-maven-plugin:1.2.1:java(デフォルト)@ maven-simple --- こんにちは、Habr! [情報] ----------------------------------------------- ------------------------- [情報]成功の構築 [情報] ----------------------------------------------- ------------------------- [情報]合計時間:0.768秒 [情報]終了日:2014年4月4日金02:54:57 IDT 2014 [情報]最終メモリ:7M / 304M [情報] ----------------------------------------------- -------------------------
以上です。 テンプレートからプロジェクトを作成することと、Lazybonesでテンプレート自体を作成することの両方が、シンプルさと優雅さに染み込んでいることを願っています。 これらの単純さと恵みのために、Grooveyに感謝することは多くの点で必要であるように思えます。
恥知らずなPR、あなたは読むことができません
あなたが好きで、優雅さとシンプルさの理由で私に同意し、あなたが少しGrooveを学びたいなら、4月15日にカザンで 、または4月17日にモスクワで私のトレーニングに来てください。 Groovyパンを教えることを約束します。