Gradeを使って配布されているWarファイルをjetty上で動作させる

やりたいこと

ソース環境をGradleを使ってビルドして、Jettyで起動するのではなく、
配布されてるwarファイルをjettyへデプロイして、起動して、サクッと動作させたい。
warファイルは既に手元にある状態で、ソースからのビルドはしたくない。

java -jar xxx.war」 で動かせるものもあるけど、
そうなっていないWarファイルを手軽に動かしたい。





jettyでwarファイルのデプロイはどうやる?

リファレンスだと、

プロジェクトレイアウト
Jettyプラグインは、Warプラグインと同じレイアウトを使用します。

warファイルってどこにあったっけ?

samples\webApplication\quickstart で試す。

─build
│  ├─classes
│  │  └─main
│  │      └─org
│  │          └─gradle
│  │              └─sample
│  │                      Greeter.class
│  │
│  ├─dependency-cache
│  ├─libs
│  │      quickstart.war  ←デプロイしたWarファイル
│  │
---->8 ばっさり 8<----
│      └─war
│              MANIFEST.MF
│
└─src
    └─main
        ├─java
        │  └─org
        │      └─gradle
        │          └─sample
        │                  Greeter.java
        │
        ├─resources
        │      greeting.txt
        │
        └─webapp
                index.jsp

libs/XXX.war におけばよさそうだ。





構成

.
│  build.gradle
│
└─build
    └─libs
            webapp-quickstart.war

build.gradle

samples\webApplication\quickstart を真似る

apply plugin: 'war'
apply plugin: 'jetty'


httpPort = 8080
stopPort = 9451
stopKey = 'foo'





実行

Gradle jettyRunwar
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:war
> Building > :jettyRunWar > Running at http://localhost:8080/DeloyAndRun

実行してるディレクトリ名になってしまってる。
build\libs\DeloyAndRun.war ができてるし。





warファイル名を設定

war {
    baseName = 'quickstart'
    archiveName = "webapp-quickstart.war"
    from 'war' 
}




実行

gradle jettyRunWar
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:war
> Building > :jettyRunWar > Running at http://localhost:8080/quickstart





結果

あれ??
f:id:orangeclover:20131026163700p:plain


f:id:orangeclover:20131026163710p:plain





原因

warファイルが置き換わってる

2013/10/26  16:03               261 webapp-quickstart.war

何が動いてる?

Gradle -i jettyRunWar
Starting Build
Settings evaluated using empty settings script.
Projects loaded. Root project using build file 'C:\workspace\Gradle_SandBox\DeloyAndRun\build.gradle'.
Included projects: [root project 'DeloyAndRun']
Evaluating root project 'DeloyAndRun' using build file 'C:\workspace\Gradle_SandBox\DeloyAndRun\build.gradle'.
Starting file lock listener thread.
All projects evaluated.
Selected primary task 'jettyRunWar'
Tasks to be executed: [task ':compileJava', task ':processResources', task ':classes', task ':war', task ':jettyRunWar']
:compileJava (Thread[main,5,main]) started.
:compileJava
Skipping task ':compileJava' as it has no source files.
:compileJava UP-TO-DATE
:compileJava (Thread[main,5,main]) completed. Took 0.652 secs.
:processResources (Thread[main,5,main]) started.
:processResources
Skipping task ':processResources' as it has no source files.
:processResources UP-TO-DATE
:processResources (Thread[main,5,main]) completed. Took 0.052 secs.
:classes (Thread[main,5,main]) started.
:classes
Skipping task ':classes' as it has no actions.
:classes UP-TO-DATE
:classes (Thread[main,5,main]) completed. Took 0.034 secs.
:war (Thread[main,5,main]) started.
:war
Skipping task ':war' as it is up-to-date (took 0.113 secs).
:war UP-TO-DATE
:war (Thread[main,5,main]) completed. Took 0.521 secs.
:jettyRunWar (Thread[main,5,main]) started.
:jettyRunWar
Executing task ':jettyRunWar' (up-to-date check took 0.001 secs) due to:
  Task has not declared any outputs.
Configuring Jetty for root project 'DeloyAndRun'
Logging to Logger[org.mortbay.log] via org.mortbay.log.Slf4jLog
Context path = /quickstart
Tmp directory =  determined at runtime
Web defaults = org/mortbay/jetty/webapp/webdefault.xml
Web overrides =  none
Starting jetty 6.1.25 ...
jetty-6.1.25
No Transaction manager found - if your webapp requires one, please configure one.
Started SelectChannelConnector@0.0.0.0:8080
> Building > :jettyRunWar > Running at http://localhost:8080/quickstart

warタスクが動作してるから、空のwarファイルができるのか。


jettyRunWarタスクはwarタスクに依存してる
f:id:orangeclover:20131026163753p:plain


Warタスクを実行しないようにすればいいのかだら、-x Warをつける

Gradle jettyRunWar -x War
> Building > :jettyRunWar > Running at http://localhost:8080/quickstart



f:id:orangeclover:20131026164107p:plain






でも、-x Warを付け忘れると、Warファイルが上書きされてしまうので、どうにかしたい。
依存関係でどにかできるか?

warタスクを除外するのはどうする?
15.8.3. タスクの有効化と無効化
これでいけそう。

task warRun {
    war.enabled = false
    dependsOn jettyRunWar
}





実行結果

Gradle warRun
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:war SKIPPED
> Building > :jettyRunWar > Running at http://localhost:8080/quickstart



f:id:orangeclover:20131026164107p:plain





環境

------------------------------------------------------------
Gradle 1.8
------------------------------------------------------------

Build time:   2013-09-24 07:32:33 UTC
Build number: none
Revision:     7970ec3503b4f5767ee1c1c69f8b4186c4763e3d

Groovy:       1.8.6
Ant:          Apache Ant(TM) version 1.9.2 compiled on July 8 2013
Ivy:          2.2.0
JVM:          1.7.0_45 (Oracle Corporation 24.45-b08)
OS:           Windows 7 6.1 amd64

添削歓迎

ここ間違ってるよ
こうした方がよくないか?
こういうことなんじゃないかな。
この環境だとこうなるよ
などなど
方法は、コメント、はてブTwitter @orange_clover宛 で、お願いします。





Gradle in Action

Gradle in Action

Amazon