読者です 読者をやめる 読者になる 読者になる

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

Gradle

やりたいこと

ソース環境を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 Effective Implementation Guide

Gradle Effective Implementation Guide


Gradle in Action

Gradle in Action


Gradle Beyond the Basics

Gradle Beyond the Basics



Building and Testing with Gradle

Building and Testing with Gradle


プログラミングGROOVY

プログラミングGROOVY