文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

javaのビルドをgradleで行う:調査編2:依存から1行で特定jarを除外!

Gradle調査シリーズその2です〜


f:id:treeapps:20180426142529p:plain

javaのビルドをgradleで行う:調査編1:maven・SBTとの違い - 文系プログラマによるTIPSブログ

今回は依存jarから特定のjarを除外するのですが、1行で一気に依存がら特定jarを除外するをやってみました。

この説明では意味が伝わりにくいので、具体的なサンプルを見ていきましょう!

mavenの場合の依存の除外

まずはmavenの場合です。

<dependency>
    <groupId>org.seasar.container</groupId>
    <artifactId>s2-extension</artifactId>
    <version>2.4.45</version>
    <exclusions>
        <exclusion>
            <artifactId>commons-logging</artifactId>
            <groupId>commons-logging</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.seasar.container</groupId>
    <artifactId>s2-framework</artifactId>
    <version>2.4.45</version>
    <exclusions>
        <exclusion>
            <artifactId>commons-logging</artifactId>
            <groupId>commons-logging</groupId>
        </exclusion>
    </exclusions>
</dependency>

maven使いがよく見る光景ですね。

(#^ω^)excludeする作業はもう疲れたぞ!

もしincludeするjarが50個あったらどうでしょうかね。

(;^ω^)m2e pluginで除外できるとはいえこの作業は無いわぁ・・

マルチプロジェクト構成の場合は、親・子でそれぞれ除外が必要という鬼畜仕様。
1jar毎にexcludeを書きたくない、1箇所exclude設定して全jarに対して除外を適用したいですね。

gradleの場合の依存の除外

続いてgradleの場合です。マルチプロジェクト構成です。

subprojects {
    configurations {
        all*.exclude module: 'commons-logging'
        all*.exclude module: 'log4j'
        all*.exclude module: 'slf4j-jdk12'
        all*.exclude module: 'slf4j-jdk14'
    }

    repositories {
        mavenCentral()
        mavenLocal()
    }

    dependencies {
        compile group: 'org.seasar.container', name: 's2-extension', version: '2.4.45'
        compile group: 'org.seasar.container', name: 's2-framework', version: '2.4.45'
    }
}

project(':base') {
}

project(':solr-server') {
    dependencies {
        compile project(':base')
    }
}

configurationsの部分に注目です。

all*.excludeの部分1行につき、全プロジェクトから特定jarを除外!

しているのです。

(`・ω・´)b これがやりたかったのですよ!

この例では、baseプロジェクトを親とし、solr-serverプロジェクトを子としています。
exclude設定は両者に有効で、includeした全jarに対し、commons-logging等のjarをexcludeしています。

mavenのようにcommons-logging依存しているjar毎に、1個づつexcludeする作業が不要なのです!!
リファレンスによると、この設定はコンパイルエラーがでる場合に限り、excludeされない事もあるようです。
これができるおかげで、以下ができます。

  • このjarは不要ですと明示できる。
  • 仮に後から他人がjarをincludeしても自動で除外される。

管理も楽で、且つ他人がjarを追加した際にexcludeし忘れて除外jarが復活する事故も防げます!

今回はここまでです。

javaのビルドをgradleで行う:調査編1:maven・SBTとの違い - 文系プログラマによるTIPSブログ
javaのビルドをgradleで行う:調査編2:依存から1行で特定jarを除外! - 文系プログラマによるTIPSブログ
javaのビルドをgradleで行う:調査編3:seasar系の依存の注意点 - 文系プログラマによるTIPSブログ
javaのビルドをgradleで行う:調査編4:Groovy Librariesの罠 - 文系プログラマによるTIPSブログ



javaのビルドをgradleで行う:実践編1:jsとcssのcombineとminify - 文系プログラマによるTIPSブログ
javaのビルドをgradleで行う:実践編2:静的ファイルの圧縮 - 文系プログラマによるTIPSブログ
javaのビルドをgradleで行う:実践編3:jspの文字列置換(ReplaceTokens) - 文系プログラマによるTIPSブログ
javaのビルドをgradleで行う:実践編4:あれどうやるの?の疑問と自己解決 - 文系プログラマによるTIPSブログ
javaのビルドをgradleで行う:実践編5:マルチプロジェクト時のprovidedCompileについて - 文系プログラマによるTIPSブログ
javaのビルドをgradleで行う:実践編6:高速に実用的な実行可能jarを生成する - 文系プログラマによるTIPSブログ