プラグインは、任意のGradleビルドに埋め込まれたTomcat WebコンテナにWebアプリケーションの展開機能を提供します。 Warプラグインを拡張します。現時点では、Tomcatバージョン6.0.x、7.0.x、8.0.x、8.5.x、9.0.xがサポートされています。
このプラグインの典型的なユースケースは、開発中の展開をサポートすることです。このプラグインは、コンテナの迅速な起動時間により、迅速なWebアプリケーション開発を可能にします。 Gradleは、同じJVMで埋め込まれた容器を起動します。現在、コンテナは別のプロセスとして分岐することはできません。このプラグインは、Remote Containerに戦争ファイルを展開することもできません。この機能をお探しの場合は、代わりに貨物プラグインをご覧ください。
プラグインの機能を使用するには、そのバイナリアーティファクトをビルドスクリプトのClassPathに追加してプラグインを適用する必要があります。
プラグインジャーは、ビルドスクリプトのクラスパスで定義する必要があります。 Gradleプラグインポータルで直接利用できます。次のコードスニペットは、それを取得する方法の例を示しています。
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath ' com.bmuschko:gradle-tomcat-plugin:2.7.0 '
}
}JARファイルには2つのプラグインが付属しています。
| プラグイン識別子 | に依存します | タイプ | 説明 |
|---|---|---|---|
| com.bmuschko.tomcat-base | - | Tomcatbaseplugin | ClassPathを事前に構成するTomcatカスタムタスクタイプを提供します。 |
| com.bmuschko.tomcat | com.bmuschko.tomcat-base | Tomcatplugin | 埋め込まれたTomcatコンテナを起動および停止するためのタスクを提供し、 tomcatという名前の拡張機能を公開します。 |
com.bmuschko.tomcatプラグインは、すぐに始めるのに役立ちます。事前に設定されたタスクがあった場合、これが望ましいオプションです。ほとんどのプラグインユーザーはこのオプションを使用します。 Tomcatプラグインを使用するには、ビルドスクリプトに次のコードスニペットを含めます。
apply plugin: 'com.bmuschko.tomcat'
タスクを完全に制御する必要がある場合、または事前に構成されたタスクを使用したくない場合は、 com.bmuschko.tomcat-baseプラグインを使用する必要があります。機能テストのためだけにコンテナをセットアップする場合はそうかもしれません。欠点は、各タスクをビルドスクリプトで個別に構成する必要があることです。 Tomcatベースプラグインを使用するには、ビルドスクリプトに次のコードスニペットを含めます。
apply plugin: 'com.bmuschko.tomcat-base'
さらに、Tomcatランタイムライブラリを構成tomcatに追加する必要があります。現時点では、Tomcatバージョン6.0.x、7.0.x、8.0.x、8.5.x、9.0.xがプラグインによってサポートされています。さまざまなバージョンのTomcatライブラリを混同しないようにしてください。
Tomcat 6.0.x:
repositories {
mavenCentral()
}
dependencies {
def tomcatVersion = ' 6.0.51 '
tomcat " org.apache.tomcat:catalina: ${ tomcatVersion } " ,
" org.apache.tomcat:coyote: ${ tomcatVersion } " ,
" org.apache.tomcat:jasper: ${ tomcatVersion } "
}Tomcat 7.0.x:
repositories {
mavenCentral()
}
dependencies {
def tomcatVersion = ' 7.0.76 '
tomcat " org.apache.tomcat.embed:tomcat-embed-core: ${ tomcatVersion } " ,
" org.apache.tomcat.embed:tomcat-embed-logging-juli: ${ tomcatVersion } " ,
" org.apache.tomcat.embed:tomcat-embed-jasper: ${ tomcatVersion } "
}Tomcat 8.0.x:
repositories {
mavenCentral()
}
dependencies {
def tomcatVersion = ' 8.0.42 '
tomcat " org.apache.tomcat.embed:tomcat-embed-core: ${ tomcatVersion } " ,
" org.apache.tomcat.embed:tomcat-embed-logging-juli: ${ tomcatVersion } " ,
" org.apache.tomcat.embed:tomcat-embed-jasper: ${ tomcatVersion } "
}Tomcat 8.5.x:
Log4J 1.x(Log4Jコミュニティではサポートされなくなった)を介してコンテナロギングを有効にするためにのみ、依存関係のtomcat-embed-logging-juli必要であることに注意してください。 log4j 2.xは、追加のライブラリを宣言することなく、コンテナロギングに使用できます。
repositories {
mavenCentral()
}
dependencies {
def tomcatVersion = ' 8.5.16 '
tomcat " org.apache.tomcat.embed:tomcat-embed-core: ${ tomcatVersion } " ,
" org.apache.tomcat.embed:tomcat-embed-logging-juli:8.5.2 " ,
" org.apache.tomcat.embed:tomcat-embed-jasper: ${ tomcatVersion } "
}
tomcat {
httpProtocol = ' org.apache.coyote.http11.Http11Nio2Protocol '
ajpProtocol = ' org.apache.coyote.ajp.AjpNio2Protocol '
}Tomcat 9.0.x:
Log4J 1.x(Log4Jコミュニティではサポートされなくなった)を介してコンテナロギングを有効にするためにのみ、依存関係のtomcat-embed-logging-juliは必要であることに注意してください。 log4j 2.xは、追加のライブラリを宣言することなく、コンテナロギングに使用できます。
repositories {
mavenCentral()
}
dependencies {
def tomcatVersion = ' 9.0.1 '
tomcat " org.apache.tomcat.embed:tomcat-embed-core: ${ tomcatVersion } " ,
" org.apache.tomcat.embed:tomcat-embed-logging-juli:9.0.0.M6 " ,
" org.apache.tomcat.embed:tomcat-embed-jasper: ${ tomcatVersion } "
}
tomcat {
httpProtocol = ' org.apache.coyote.http11.Http11Nio2Protocol '
ajpProtocol = ' org.apache.coyote.ajp.AjpNio2Protocol '
}com.bmuschko.tomcatプラグインは、次のタスクをすぐに定義しています。
| タスク名 | に依存します | タイプ | 説明 |
|---|---|---|---|
| Tomcatrun | - | Tomcatrun | Tomcatインスタンスを起動し、爆発したWebアプリケーションを展開します。 |
| Tomcatrunwar | - | Tomcatrunwar | Tomcatインスタンスを開始し、戦争を展開します。 |
| トムキャットトップ | - | トムキャットトップ | Tomcatインスタンスを停止します。 |
| Tomcatjasper | - | Tomcatjasper | JSPコンパイラを実行し、JSPページをJasperを使用してJavaソースに変えます。 |
Tomcatプラグインは、WARプラグインと同じレイアウトを使用しています。
Tomcatプラグインは、 tomcatという名前の拡張機能を介して次のプロパティを公開します。
httpPort :TomcatがHTTPリクエストを聞く必要があるTCPポート(デフォルトは8080 )。httpsPort :TomcatがHTTPSリクエストをリッスンする必要があるTCPポート(デフォルトは8443 )。ajpPort :TomcatがAJPリクエストを聞く必要があるTCPポート(デフォルトは8009 )。stopPort :Tomcatが管理者のリクエストをリッスンする必要があるTCPポート(デフォルトは8081 )。stopKey :停止するように要求するときにTomcatにパスするキー(デフォルトはnull )。contextPath :Webアプリケーションが登録されるURLコンテキストパス(デフォルトは戦争名にデフォルト)。enableSSL :HTTPSコネクタを作成するかどうかを判断します(デフォルトはfalseになります)。daemon :Tomcatサーバーがバックグラウンドで実行されるかどうかを指定します。真実の場合、このタスクはサーバーが開始されるとすぐに完了します。 FALSEの場合、このタスクはTomcatサーバーが停止するまでブロックします(デフォルトはfalseになります)。keystoreFile :有効にした場合、SSLに使用するキーストアファイル(デフォルトでは、キーストアが生成されます)。httpProtocol :使用するHTTPプロトコルハンドラークラス名(デフォルトはorg.apache.coyote.http11.Http11Protocol )。httpsProtocol :使用するHTTPSプロトコルハンドラークラス名(デフォルトはorg.apache.coyote.http11.Http11Protocol )。ajpProtocol :使用するAJPプロトコルハンドラークラス名(デフォルトはorg.apache.coyote.ajp.AjpProtocol )。users : username 、 password 、 rolesを持つユーザーのリスト。これらのユーザーとの基本認証でTomcatを構成するために使用されます。次の例コードは、デフォルトのHTTP/HTTPSポートを変更する方法を示しています。 SSLを有効にするために、プロパティをtrue enableSSLプロパティを設定します。 Webアプリケーションは、コンテキストパスsample-appでアクセスできます。
tomcat {
httpPort = 8090
httpsPort = 8091
enableSSL = true
contextPath = ' sample-app '
users {
user {
username = ' user1 '
password = ' 123456 '
roles = [ ' developers ' , ' admin ' ]
}
user {
username = ' user2 '
password = ' abcdef '
roles = [ ' manager ' ]
}
}
}さらに、次のオプションのタスクプロパティを設定できます。
contextPath :URLコンテキストパスWebアプリケーションは下に登録されます(デフォルトは戦争名になります)。webDefaultXml :デフォルトのweb.xml。 org.apache.catalina.servlets.DefaultServletおよびorg.apache.jasper.servlet.JspServletのインスタンスが定義されていない場合は、セットアップされます。additionalRuntimeResources :Webアプリケーションで提供されていない追加のランタイムジャーまたはディレクトリを定義します。URIEncoding :HTTPコネクタ(デフォルトはUTF-8 )でURIバイトをデコードするために使用される文字エンコードを指定します。daemon :Tomcatサーバーがバックグラウンドで実行されるかどうかを指定します。真実の場合、このタスクはサーバーが開始されるとすぐに完了します。 FALSEの場合、このタスクはTomcatサーバーが停止するまでブロックします(デフォルトはfalseになります)。configFile :TomcatコンテキストXMLファイルへのパス(デフォルトはsrc/main/webapp/META-INF/context.xmlであり、 tomcatRunのデフォルトはtomcatRunWarの戦争内でMETA-INF/context.xmlになります)。outputFile :Tomcatログメッセージを書き込むファイル。ファイルが既に存在する場合、新しいメッセージが追加されます。reloadable :コンテキストファイルを使用しない場合は、コンテキストスキャンを強制します(デフォルトはtrue )。keystorePass :有効にした場合、SSLに使用するキーストアパスワード。truststoreFile :SSLに使用するTrustStoreファイル(有効にする場合)。truststorePass :有効にした場合、SSLに使用するトラストストアパスワード。clientAuth :使用するクライアントAuth設定、値false true false wantです。注: keystoreFileとtruststoreFileそれぞれ、 Fileオブジェクトのインスタンスが必要ですfile("/path/my.file")
次の例コードでは、タスクtomcatRunのカスタムコンテキストファイルを宣言します。
tomcatRun . configFile = file( ' context.xml ' ) Jasperコンパイラタスクを構成するには、 tomcat拡張機能のjasper閉鎖内で次のプロパティを設定することを選択できます。
validateXml : web.xmlを検証する必要があるかどうかを決定します(デフォルトはnullになります)。validateTld : web.xmlを検証する必要があるかどうかを決定します(デフォルトはnull )。uriroot :Webアプリケーションルートディレクトリ(デフォルトはsrc/main/webappになります)。webXmlFragment : web.xmlファイルによって参照される生成されたWeb XMLフラグメントファイル。addWebXmlMappings :生成されたWeb XMLフラグメントをweb.xmlファイルに自動的に追加します。注意:これにより、ビルドディレクトリではなく、プロジェクトのweb.xmlファイルが変更されます。outputDir :compiled jspsが登場する出力ディレクトリ(デフォルトはbuild/jasperになります)になります。classdebuginfo :クラスファイルをデバッグ情報でコンパイルする必要があります(デフォルトはtrueです)。compiler :JSPページをコンパイルするために使用するコンパイラAnt。詳細については、ANTドキュメントを参照してください。値が設定されていない場合、ANTを使用する代わりに、デフォルトのEclipse JDT Javaコンパイラが使用されます。デフォルト値はありません。compilerSourceVM :JDKバージョンは、互換性のあるソースファイル(デフォルトは1.6 )です。compilerTargetVM :JDKバージョンは、互換性のある生成されたファイル(デフォルトは1.6 )です。poolingEnabled :タグハンドラープーリングが有効かどうかを判断します。これはコンピレーションオプションです。既にコンパイルされているJSPの動作は変更されません(デフォルトはtrueになります)。errorOnUseBeanInvalidClassAttribute :USEBEANアクションのクラス属性の値が有効なBeanクラスではない場合、Jasperはエラーを発行する必要があります(デフォルトはtrue )。genStringAsCharArray :テキスト文字列をCharアレイとして生成する必要がありますfalseieClassId : <jsp:plugin>タグを使用すると、インターネットエクスプローラーに送信されるクラスID値(デフォルトはclsid:8AD9C840-044E-11D1-B3E9-00805F499D93 )。javaEncoding :JavaファイルをエンコードするJavaソースファイルの生成に使用する(デフォルトはUTF8 )。trimSpaces :アクションまたはディレクティブの間のテンプレートテキスト内の白いスペースをトリミングする必要があります(デフォルトはTrimSpaces.TRUEになります)。xpoweredBy :X-Powered-by Responseヘッダーが生成されたサーブレットによって追加されるかどうかを判断します(デフォルトはfalseになります)。tomcat {
jasper {
validateXml = true
webXmlFragment = file( " $w ebAppDir /WEB-INF/generated_web.xml " )
outputDir = file( " $w ebAppDir /WEB-INF/src " )
}
}JSPを呼び出すときにコンパイルの例外を取得します。私が足りないものはありますか?
あなたが見るかもしれない例外は、おそらくこれに似ています: org.apache.jasper.JasperException: Unable to compile class for JSP 。 Tomcat 7.xおよび8.xでは、ClassPathにECLIPSE ECJ 3.6.xを使用する必要があります。ただし、依存関係のこのバージョンはMaven Centralには存在しません。その依存関係をダウンロードして、独自のリポジトリに配置するか、ドロップできるローカルディスクのリポジトリを定義する必要があります。例は次のとおりです。
repositories {
flatDir name : ' localRepository ' , dirs : ' lib '
} javax.servlet.Servletでjava.lang.ClassCastExceptionを取得するのはなぜですか?
Tomcatは、依存関係の複数のバージョンを持つことに非常に敏感ですjavax.servlet:servlet-api and javax.servlet:jsp-api in classpath。デフォルトでは、埋め込まれたTomcatライブラリの推移的な依存関係としてすでに引き込まれています。あなたが見るかもしれない例外はこれに似ています:
java.lang.ClassCastException: org.springframework.web.servlet.DispatcherServlet cannot be cast to javax.servlet.Servlet
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1062)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1010)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4935)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5262)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5257)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
これを修正するには、JSPおよびサーブレットモジュールの依存関係をこのような範囲でprovidedCompileことを確認してください。
providedCompile ' javax.servlet:servlet-api:2.5 ' ,
' javax.servlet:jsp-api:2.0 'プラグインで起動したTomcatをリモートデバッグするにはどうすればよいですか?
アプリケーションをリモートでデバッグできるようにする場合は、コンテナを起動する前に、 GRADLE_OPTS環境変数に次のJVMオプションを設定する必要があります。選択したポート番号はあなた次第です。
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Tomcatは、指定されたポートで、着信するリモートデバッグ接続をリッスンします。コンテナを起動するときは、次のメッセージが表示されます。
Listening for transport dt_socket at address: 5005
リモートデバッグポートへの接続を構成する方法に関するIDEドキュメントを確認してください。
私のTomcatコンテナは、JNDI DataSourceを使用する必要があります。プロジェクトをセットアップするにはどうすればよいですか?
まず、 tomcat構成を使用して接続プールの依存関係を宣言するようにしなければなりません。
Tomcat 6.0.x:
def tomcatVersion = ' 6.0.35 '
tomcat " org.apache.tomcat:dbcp: ${ tomcatVersion } "詳細については、Maven Centralの座標を参照してください。
後のバージョン:
def tomcatVersion = ' 9.0.8 '
tomcat " org.apache.tomcat:tomcat-dbcp: ${ tomcatVersion } "詳細については、Maven Centralの座標を参照してください。
デフォルトの設定を使用することにした場合、 context.xmlはディレクトリsrc/main/webapp/META-INFに配置します。カスタムロケーションを設定するには、Convention Property configFile使用できます。 tomcatRunとtomcatRunWarタスクに設定する方法の例を以下に示します。
[tomcatRun, tomcatRunWar] * . configFile = file( ' context.xml ' )コンテキスト属性のリストについては、Tomcatドキュメントを参照してください。次の例は、MySQL JNDI DataSourceのセットアップ方法を示しています。
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< Context >
< Resource name = " jdbc/mydatabase "
auth = " Container "
type = " javax.sql.DataSource "
username = " superuser "
password = " secretpasswd "
driverClassName = " com.mysql.jdbc.Driver "
url = " jdbc:mysql://localhost:3306/mydb "
validationQuery = " select 1 "
maxActive = " 10 "
maxIdle = " 4 " />
</ Context >プラグインでホットコード展開を使用するにはどうすればよいですか?
このプラグインは、プロパティreloadableプロパティを介してバイトコードを交換するためのすぐにボックスのサポートを提供します。デフォルトでは、このオプションが判明しているため、追加の構成変更は必要ありません。あなたがする必要があるのは、 tomcatRunによって開始されたコンテナの実行インスタンスを用意することです。お気に入りの編集者を起動し、制作ソースファイルを変更し、保存し、 gradle compileJavaを介して別の端末のソースを再コンパイルします。数秒後にコンテキストがリロードされ、コンテナを実行している端子ウィンドウに反映される動作が表示されるはずです。
Reloading Context with name [/myapp] has started
Reloading Context with name [/myapp] is completed
または、他のコマーシャルバイトコードスワップテクノロジーを使用することもできます。通常、構成は製品固有です。プロジェクトのためにそれをセットアップする方法に関する製品のドキュメントを参照してください。次のセクションでは、GradleとJrebelでプラグインをセットアップする方法について説明します。まず、Jrebelをダウンロードし、マシンにインストールしてライセンスを設定します。バイトコードの変更をスキャンするディレクトリをJrebelに伝えるには、Rebel.xmlファイルを作成する必要があります。 Webモジュールでは、ファイルをbuild/classes/mainの下に配置して、Tomcatプラグインでロードできるようにします。ファイルの構成を作成するために、Gradle Jrebelプラグインが役立ちます。プラグインを使用する必要はありません。また、手作業で構成を作成することもできます。 gradle cleanがファイルを削除することに注意してください。 Multi-ModuleプロジェクトのシナリオでJrebelをセットアップするには、ドキュメントを参照してください。次のコードスニペットには、 rebel.xmlファイルの例が表示されます。
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< application xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance " xmlns = " http://www.zeroturnaround.com "
xsi : schemaLocation = " http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd " >
< classpath >
< dir name = " /Users/ben/dev/projects/mywebproject/build/classes/main " >
</ dir >
</ classpath >
< web >
< link target = " / " >
< dir name = " /Users/ben/dev/projects/mywebproject/src/main/webapp " >
</ dir >
</ link >
</ web >
</ application > Gradle Startupスクリプトを編集し、次の行を追加して、GradleにJrebelエージェントを使用するように指示します。 Jrebelインストールディレクトリを指す環境変数REBEL_HOMEを必ず設定してください。
JAVA_OPTS="-javaagent:$REBEL_HOME/jrebel.jar $JAVA_OPTS"
gradle tomcatRunを使用したWebモジュールの起動時に、Jrebelライセンスが使用されていることと、変更がスキャンされているディレクトリに関する情報が表示されます。 rebel.xmlファイルの例では、次のようになります。
JRebel: Directory '/Users/ben/dev/projects/mywebproject/build/classes/main' will be monitored for changes.
JRebel: Directory '/Users/ben/dev/projects/mywebproject/src/main/webapp' will be monitored for changes.
ファイルが再コンパイルされている場合、JREBELはこれをこのようにコンソールに書き込むことでこれを示します。
JRebel: Reloading class 'de.muschko.web.controller.TestController'.
私のビルドの一部として、コンテナー内統合テストを実行する必要があります。何をする必要がありますか?
通常、ユニットと統合テストは慣習によって分離されます。 1 IntegrationTestの規則は、テストソースファイルの名前を異なる方法で名前を付けることができますTestそれを行うことで、個別に実行できます。統合テストを実行するには、Tomcatタスクをデーモンスレッドとして実行し、テストが完了したらシャットダウンする必要があります。次の例は、この機能を提供するGradleタスクを設定する方法を示しています。もちろん、これはそれを行う唯一の方法です。次の例では、Gradle> = 1.7が必要です。
apply plugin : ' com.bmuschko.tomcat-base '
ext {
tomcatStopPort = 8081
tomcatStopKey = ' stopKey '
}
task integrationTomcatRun( type : com.bmuschko.gradle.tomcat.tasks.TomcatRun ) {
stopPort = tomcatStopPort
stopKey = tomcatStopKey
daemon = true
}
task integrationTomcatStop( type : com.bmuschko.gradle.tomcat.tasks.TomcatStop ) {
stopPort = tomcatStopPort
stopKey = tomcatStopKey
}
task integrationTest( type : Test ) {
include ' **/*IntegrationTest.* '
dependsOn integrationTomcatRun
finalizedBy integrationTomcatStop
}
test {
exclude ' **/*IntegrationTest.* '
}Webアプリケーションソースコードの一部ではないJARファイルまたはディレクトリを追加するにはどうすればよいですか?
タイプAbstractTomcatRunのすべてのタスクは、Webアプリケーションランタイムクラスパスと混合するために使用されるadditionalRuntimeResourcesという名前のプロパティを公開します。
[tomcatRun, tomcatRunWar] . each { task ->
task . additionalRuntimeResources << file( ' /Users/bmuschko/config/props ' )
task . additionalRuntimeResources << file( ' /Users/bmuschko/ext/jars/my.jar ' )
}