Gradle Versions Plugin のご紹介

井上です。

普段 Java でシステム開発を行っているのですが、ビルドツールとして最近は Gradleを使っています。

Gradle は 日本語のドキュメント「Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築」 といった日本語の情報が豊富で、Java界隈におけるビルドツールのデファクトスタンダードとなりつつあります。

Gradle におけるライブラリのバージョンの指定方法

Gradle では、プロジェクトで使用するライブラリを指定することで、そのライブラリ及びライブラリが依存しているライブラリ群を自動的にダウンロードする機構が備わっています。

以下、Java を使ったプロジェクトで JUnit を使用する際のGradle のビルドスクリプト (build.gradle) の例です。

apply plugin: 'java'

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    // (1) 特定のバージョンを指定
    testCompile 'junit:junit:4.11'
    // (2) 動的バージョンで指定 (4系の最新版)
    // testCompile 'junit:junit:4.+'
    // (3) 使用できる最新版を表すプレースホルダで指定
    // testCompile 'junit:junit:latest.release'
}

通常は (1) のように、特定のバージョンを指定しますが、開発中など、常に最新版を使いたい場合は、 (2) (3) のように指定することもできます。

ただし、ライブラリが更新されたことは知りたいけども、実際に最新版を適用するかは、その更新内容を確認した後にしたい場合も多いと思います。

そのような場合、上記の指定方法だけでは対応することができないので、 (1) のように、特定のバージョンを指定した上で、Maven Central Repository などでライブラリの更新状況を都度チェックすることになりますが、とても面倒です。

このような場合に便利な Gradle Versions Plugin を紹介します。

Gradle Versions Plugin とは

Gradle Versions Plugin は、ビルドスクリプトに指定したライブラリの更新情報を一括で確認する機能を提供するGradleのプラグインです。

では、実際に Gradle Versions Plugin の使い方を簡単に見てみましょう。

Gradle Versions Plugin の使い方

以下が、先ほど紹介したビルドスクリプトに Gradle Versions Plugin の設定を追加した例です。

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.11.3'
    }
}

apply plugin: 'java'
apply plugin: 'com.github.ben-manes.versions'

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    // (1) 特定のバージョンを指定
    testCompile 'junit:junit:4.11'
    // (2) 動的バージョンで指定 (4系の最新版)
    // testCompile 'junit:junit:4.+'
    // (3) 使用できる最新版を表すプレースホルダで指定
    // testCompile 'junit:junit:latest.release'
}

上記設定を追加することで、プロジェクトに dependencyUpdates タスクが追加されます

では、実際に dependencyUpdates タスクを実行してみましょう。
以下、dependencyUpdates タスク の実行例です。

% gradle dependencyUpdates                                                                                                                                                        (git)-[master]
:dependencyUpdates

------------------------------------------------------------
: Project Dependency Updates (report to plain text file)
------------------------------------------------------------

The following dependencies are using the latest milestone version:
 - com.github.ben-manes:gradle-versions-plugin:0.11.3

The following dependencies have later milestone versions:
 - junit:junit [4.11 -> 4.12]

Generated report file build/dependencyUpdates/report.txt

BUILD SUCCESSFUL

「Project Dependency Updates」以下に、ライブラリの更新情報が出力されています(標準出力だけでなく、build/dependencyUpdates/report.txt へも出力されています)。
出力内容から以下のことが分かります。

  • Gradle Versions Plugin (com.github.ben-manes:gradle-versions-plugin) は最新版 (0.11.3) を使用している
  • JUnit (junit:junit) は指定したバージョン (4.11) より新しいバージョン (4.12) が存在する

このように、dependencyUpdates タスクを実行するだけで、プロジェクトで使用するライブラリの更新情報を一括で取得することが出来ました。

また、dependencyUpdates タスクにオプションを指定することで、更新情報をreleaseバージョンに限定したり、出力フォーマットを xml や json にすることも可能です。
(詳細は ドキュメント を参照下さい)

gradle dependencyUpdates -Drevision=release -DoutputFormatter=json -DoutputDir=/any/path/with/permission

dependencyUpdates タスクを手動で実行するのが面倒な場合は、CI (継続的インテグレーション) で dependencyUpdates タスクの出力を解析し、更新情報があれば通知するといった運用も可能ですね。

まとめ

今回は、ライブラリの更新情報を一括で確認することができる Gradle Versions Plugin を紹介しました。
便利かつ簡単に導入することが出来るので、プロジェクトに導入してみてはいかがでしょうか?

新しく「ドメイン駆動設計のパターン・原則・プラクティス本」が出ました

井上です。 以前、本ブログでドメイン駆動設計(Domain-Driven Design 以下 DDD)のリファレンス本について紹介致しました。 おかげさまで非常に多くの方にご覧頂いたようで、DDDの注目度を改めて感じました。 また、「エリック・エヴァンスのドメイン駆動設計 ソフトウェアの核心にある複雑さに立ち向かう」(以下 DDD本) に続く2冊目ドメイン駆動設計本として、「実践ドメイン駆動設計」(以下 DDD実践本) も出版され、日本におけるDDDへの注目度がさらに増しているように思います。 私自身、普段からDDDを用いた開発を行っているので、日本語で多くのDDD情報が入手できることはとても嬉しい限りです。 そんな中、DDDを冠した「Patterns, Principles, and Practices of Domain-Driven Design」という新しい本 (以下 DDDパターン・原則・プラクティス本) が 2015/4/20 に出版されたようです。

Patterns, Principles, and Practices of Domain-Driven Design

私自身、まだ購入したばかりで流し読みしか出来ていないのですが、簡単に紹介したいと思います。

DDDパターン・原則・プラクティス本とは

本書は、大きく4つのパートから構成されています。概要は以下の通りです。

  • PART I – DDD の哲学 (philosophy) 、原則 (principles) 、プラクティス (practices) について
  • PART II – 境界付けられた境界 (bounded contexts) を統合する 戦略的パターン (strategic patterns) について
  • PART III – 効果的なドメインモデルを作るための 戦術的パターン(tactical patterns) について
  • PART IV – ドメインモデルを活用し効果的なアプリケーションを構築するために適用可能なデザインパターン (design patterns) について

戦術的パターンより戦略的パターンが先に紹介される構成となっており、その点はDDD実践本と同じですね。 また、本書は792ページと非常にボリュームがあります。 DDD本が560ページ、DDD実践本が 656ページであることと比較しても、そのボリュームがわかると思います。 なお、DDD本とDDD実践本のサンプルコードはJavaで記述されていましたが、本書はC#で記述されています。

章構成

具体的な章構成は以下のようになっています(日本語訳は私が付けたもので、正式なものではありません) 各パート・章のタイトルを見ていただければ、どのような内容になっているのかある程度想像がつくのではと思います。

  • INTRODUCTION
  • PART I: THE PRINCIPLES AND PRACTICES OF DOMAIN-DRIVEN DESIGN (ドメイン駆動設計の原則とプラクティス)
    • CHAPTER 1: WHAT IS DOMAIN-DRIVEN DESIGN? (ドメイン駆動設計とは何か?)
    • CHAPTER 2: DISTILLING THE PROBLEM DOMAIN (問題ドメインの蒸留)
    • CHAPTER 3: FOCUSING ON THE CORE DOMAIN(コアドメインに注目する)
    • CHAPTER 4: MODEL-DRIVEN DESIGN(モデル駆動設計)
    • CHAPTER 5: DOMAIN MODEL IMPLEMENTATION PATTERNS(ドメインモデル実装パターン)
    • CHAPTER 6: MAINTAINING THE INTEGRITY OF DOMAIN MODELS WITH BOUNDED CONTEXTS(境界づけられたコンテキストのドメインモデルの整合性を維持する)
    • CHAPTER 7: CONTEXT MAPPING(コンテキストマッピング)
    • CHAPTER 8: APPLICATION ARCHITECTURE (アプリケーションアーキテクチャ)
    • CHAPTER 9: COMMON PROBLEMS FOR TEAMS STARTING OUT WITH DOMAIN-DRIVEN DESIGN (ドメイン駆動設計から始めたチームの共通問題)
    • CHAPTER 10: APPLYING THE PRINCIPLES, PRACTICES, AND PATTERNS OF DDD (DDDの原則、プラクティス、パターンを適用する)
  • PART II: STRATEGIC PATTERNS: COMMUNICATING BETWEEN BOUNDED CONTEXTS(戦略的パターン:境界づけられたコンテキスト間のコミュニケーション)
    • CHAPTER 11: INTRODUCTION TO BOUNDED CONTEXT INTEGRATION(境界づけられたコンテキストの統合の概論)
    • CHAPTER 12: INTEGRATING VIA MESSAGING(メッセージングによる統合)
    • CHAPTER 13: INTEGRATING VIA HTTP WITH RPC AND REST (RPCやRESTを用いたHTTPによる統合)
  • PART III: TACTICAL PATTERNS: CREATING EFFECTIVE DOMAIN MODELS(戦術的パターン:効果的なドメインモデルの構築)
    • CHAPTER 14: INTRODUCING THE DOMAIN MODELING BUILDING BLOCKS (ドメインモデリングの構成要素の紹介)
    • CHAPTER 15: VALUE OBJECTS (値オブジェクト)
    • CHAPTER 16: ENTITIES (エンティティ)
    • CHAPTER 17: DOMAIN SERVICES (ドメインサービス)
    • CHAPTER 18: DOMAIN EVENTS (ドメインイベント)
    • CHAPTER 19: AGGREGATES (集約)
    • CHAPTER 20: FACTORIES (ファクトリ)
    • CHAPTER 21: REPOSITORIES (リポジトリ)
    • CHAPTER 22: EVENT SOURCING (イベントソーシング)
  • PART IV: DESIGN PATTERNS FOR EFFECTIVE APPLICATIONS(効果的なアプリケーションのためのデザインパターン)
    • CHAPTER 23: ARCHITECTING APPLICATION USER INTERFACES (アプリケーションのユーザインタフェース設計)
    • CHAPTER 24: CQRS: AN ARCHITECTURE OF A BOUNDED CONTEXT (コマンドクエリ責務分離 : 境界づけられたコンテキストのアーキテクチャ)
    • CHAPTER 25: COMMANDS: APPLICATION SERVICE PATTERNS FOR PROCESSING BUSINESS USE CASES (コマンド:ビジネスユースケースを処理するためのアプリケーションサービスパターン)
    • CHAPTER 26: QUERIES: DOMAIN REPORTING (クエリ:ドメインのレポーティング)

想定する読者

Introduction」の「Who Should Read This Book」で、本書の想定読者について触れています。 以下、上記からの引用です。

It is not a replacement for Domain-Driven Design: Tackling Complexity in the Heart of Software by Eric Evans (Addison-Wesley Professional, 2003). Instead, it takes the concepts introduced by Evans and distills them into simple straightforward prose, with practical examples so that any developer can get up to speed with the philosophy before going on to study the subject in more depth.

ここでは、本書が「DDD本の代用品ではない」と明確に述べていますね。 また、「エヴァンスによって紹介された概念を、単純で (simple) 分かりやすい (straightforward) 散文 (prose) に蒸留する (distill) 」という記述もあります。 これは、DDD本自体が文学的で韻文形式の文章を多く含んでおり、それがDDD本の読みづらさに繋がっていたと思うので、韻文と対比する形で散文 (prose) という言い回しを使うことで、分かりやすさを強調しているのかなと解釈しました。 つまり本書は「DDD本を読むだけでは分かりづらかったDDDの概念を、わかりやすい文章と実践的なコード例を用いて解説する」という内容になっていると思います。 著者が述べている通り、DDD本を既に読まれた方が、理解を深めるための副読本として読むのが良いのかもしれませんね。

まとめ

今回は、DDDパターン・原則・プラクティス本について簡単に紹介しました。 DDDへの理解を深めるために有用そうな内容になっているので、少しづつ読み進めていきたいと思います。 興味のある方は手に取ってみてはいかがでしょうか?(個人的には日本語訳されることを期待しています)

Coderetreatを題材にした設計本

井上です。

Coderetreat (*1)というイベントをご存知でしょうか?
Coderetreat とは、ソフトウェア開発と設計の基本を学ぶためのイベントで、以下のような特徴があります。

  • 一日掛かりで行われる(5〜6セッション)
  • 参加者はペアでコードを書く(ペアプログラミング)
  • 1セッションは45分間
  • ライフゲーム (*2)」を題材とする
  • 各セッション終了後にコードを削除する
  • 各セッションで新しいペアを組む
  • セッションが進むにつれて制約を課す

また、CodeRetreatを世界中で同日に開催する 「Global Day of Coderetreat」 というものもあり、世界中で活発に開催されているイベントで、日本でも度々開催されています。(*3)
私もCodeRetreatに参加したことがあるのですが、一日掛かりのイベントなので大変な集中力を要しますが、とても勉強になりました。

そんな Coderetreat を題材にした設計本(洋書)を見つけたので紹介します。

続きを読む

ドメイン駆動設計のリファレンス本

井上です。

現在、ドメイン駆動設計(Domain Driven Desing . 以下 DDD)を用いて開発を行っています。

DDDの参考書籍といえば、もちろん「エリック・エヴァンスのドメイン駆動設計 ソフトウェアの核心にある複雑さに立ち向かう」(以下 DDD本)ですが、その著者であるエリック・エヴァンスが最近(2014/9/22)「Domain-Driven Design Reference: Definitions and Pattern Summaries」という新しい本(以下 DDDリファレンス本)を出していることに気がつきました。

DDDリファレンス本とは

早速DDDリファレンス本を取り寄せてみました。88ページと非常にコンパクトな本になっています。

続きを読む

Effective Java 第2版 を可視化する

井上です。

どのプログラム言語においても、必読書と呼ばれる本が何冊か存在すると思います。
私は長らく使っているJavaでは「Effective Java 第2版」が真っ先に挙げられると思います。

この本、初版が出版されたのが2001年、第2版が出版されたのが2008年なのですが、諸事情により一時期絶版になっていました。
しかし、今年の3月にめでたく再販となりました。
私自身、今でもたまに読み返す程手放せない本になっています。
#ただ、2008年出版ということもあり、バージョンとしては Java 5 対応の内容となっており、Java 8 対応の第3版の発売を期待したいところです。

さて、Effective Java のような技術書を読む場合、皆さんはどのように読み進めるでしょうか?最初から順に読む人も多いのではないでしょうか?
しかし、Effective Java を初めて読む人がその方法で読もうとすると、理解するのがとても難しいです。
なぜなら、この本、前後関係なく他の項目への参照が大変多いのです。

続きを読む

パッケージ間の循環依存を自動で検出する

はじめまして。井上です。

私は仙台でフリーランスのエンジニアとして活動しています。
以前は仙台のSIerに勤務していたのですが、ギルドワークス設立と同時に退職し、それ以来ギルドワークスと一緒に仕事をしております。
そのような縁もあり、本ブログで記事を書くことになりました。どうぞよろしくお願いします。

さて、私は長らくJavaでシステム開発を行っていることもあり、以下のような分野に興味があり、仙台でも勉強会を主催したりしています。

  • オブジェクト指向設計
  • デザインパターン
  • TDD(テスト駆動開発)
  • DDD(ドメイン駆動設計)

本ブログでは、主に上記に関連するような記事を投稿していきたいと思います。

パッケージ間の循環依存を自動で検出する

さて、今回はパッケージ間の循環依存の自動検出について取り上げます。

続きを読む