Plugin ini menyediakan kemampuan penyebaran aplikasi web ke wadah web Tomcat tertanam di setiap lulusan yang diberikan. Itu memperluas plugin perang. Saat ini versi Tomcat 6.0.x, 7.0.x, 8.0.x, 8.5.x dan 9.0.x didukung.
Kasing penggunaan yang khas untuk plugin ini adalah untuk mendukung penyebaran selama pengembangan. Plugin ini memungkinkan pengembangan aplikasi web yang cepat karena waktu startup cepat kontainer. Gradle memulai wadah tertanam dalam JVM yang sama. Saat ini, wadah tidak dapat dipotong sebagai proses terpisah. Plugin ini juga tidak dapat menggunakan file perang ke wadah jarak jauh. Jika Anda mencari kemampuan ini, silakan lihat plugin kargo sebagai gantinya.
Untuk menggunakan fungsionalitas plugin, Anda perlu menambahkan artefak binernya ke classpath skrip build Anda dan menerapkan plugin.
Toples plugin perlu didefinisikan di classpath skrip build Anda. Ini langsung tersedia di Portal Plugin Gradle. Cuplikan kode berikut menunjukkan contoh tentang cara mengambilnya:
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath ' com.bmuschko:gradle-tomcat-plugin:2.7.0 '
}
}File JAR dilengkapi dengan dua plugin:
| Identifier Plugin | Tergantung | Jenis | Keterangan |
|---|---|---|---|
| com.bmuschko.tomcat-base | - | Tomcatbaseplugin | Menyediakan tipe tugas khusus Tomcat, pra-konfigurasi classpath. |
| com.bmuschko.tomcat | com.bmuschko.tomcat-base | Tomcatplugin | Memberikan tugas untuk memulai dan menghentikan wadah Tomcat tertanam dan memperlihatkan ekstensi bernama tomcat . |
Plugin com.bmuschko.tomcat membantu Anda memulai dengan cepat. Jika Anda baik -baik saja jika tugas yang telah dikonfigurasi sebelumnya, ini adalah opsi yang lebih disukai. Sebagian besar pengguna plugin akan menggunakan opsi ini. Untuk menggunakan plugin Tomcat, sertakan cuplikan kode berikut dalam skrip build Anda:
apply plugin: 'com.bmuschko.tomcat'
Jika Anda memerlukan kontrol penuh atas tugas Anda atau tidak ingin menggunakan tugas yang telah dikonfigurasi sebelumnya, Anda akan ingin menggunakan plugin com.bmuschko.tomcat-base . Itu mungkin terjadi jika Anda ingin mengatur wadah semata -mata untuk pengujian fungsional. Kelemahannya adalah bahwa setiap tugas harus dikonfigurasi secara individual dalam skrip build Anda. Untuk menggunakan plugin dasar Tomcat, sertakan cuplikan kode berikut dalam skrip build Anda:
apply plugin: 'com.bmuschko.tomcat-base'
Selain itu, pustaka runtime Tomcat perlu ditambahkan ke konfigurasi tomcat . Saat ini versi Tomcat 6.0.x, 7.0.x, 8.0.x, 8.5.x dan 9.0.x didukung oleh plugin. Pastikan Anda tidak mencampur perpustakaan Tomcat dari versi yang berbeda.
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:
Perlu diketahui bahwa ketergantungan tomcat-embed-logging-juli hanya diperlukan untuk mengaktifkan penebangan kontainer melalui log4j 1.x (yang tidak lagi didukung oleh komunitas log4j). LOG4J 2.x dapat digunakan untuk penebangan kontainer tanpa menyatakan perpustakaan tambahan.
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:
Perlu diketahui bahwa ketergantungan tomcat-embed-logging-juli hanya diperlukan untuk mengaktifkan penebangan kontainer melalui log4j 1.x (yang tidak lagi didukung oleh komunitas log4j). LOG4J 2.x dapat digunakan untuk penebangan kontainer tanpa menyatakan perpustakaan tambahan.
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 '
} Plugin com.bmuschko.tomcat mendefinisikan tugas-tugas berikut di luar kotak:
| Nama tugas | Tergantung | Jenis | Keterangan |
|---|---|---|---|
| Tomcatrun | - | Tomcatrun | Mulai instance Tomcat dan menyebarkan aplikasi web yang meledak ke sana. |
| Tomcatrunwar | - | Tomcatrunwar | Mulai instance Tomcat dan menyebarkan perang ke sana. |
| tomcatstop | - | Tomcatstop | Menghentikan instance Tomcat. |
| Tomcatjasper | - | Tomcatjasper | Menjalankan kompiler JSP dan mengubah halaman JSP menjadi sumber Java menggunakan Jasper. |
Plugin Tomcat menggunakan tata letak yang sama dengan plugin perang.
Plugin Tomcat memperlihatkan properti berikut melalui ekstensi bernama tomcat :
httpPort : Port TCP yang harus didengarkan Tomcat untuk permintaan HTTP (default ke 8080 ).httpsPort : Port TCP yang harus didengarkan Tomcat untuk permintaan HTTPS (default ke 8443 ).ajpPort : Port TCP yang harus didengarkan Tomcat untuk permintaan AJP (default ke 8009 ).stopPort : Port TCP yang harus didengarkan Tomcat untuk permintaan admin (default ke 8081 ).stopKey : Kunci untuk diteruskan ke Tomcat saat memintanya untuk berhenti (default ke null ).contextPath : Jalur konteks URL di mana aplikasi web akan terdaftar (default ke nama perang).enableSSL : Menentukan apakah konektor HTTPS harus dibuat (default ke false ).daemon : Menentukan apakah server Tomcat harus berjalan di latar belakang. Ketika benar, tugas ini selesai segera setelah server telah dimulai. Saat salah, tugas ini memblokir sampai server Tomcat dihentikan (default ke false ).keystoreFile : File keystore yang akan digunakan untuk SSL, jika diaktifkan (secara default, keystore akan dihasilkan).httpProtocol : Nama kelas HTTP Protocol Handler yang akan digunakan (default ke org.apache.coyote.http11.Http11Protocol ).httpsProtocol : Nama kelas penangan protokol https yang akan digunakan (default ke org.apache.coyote.http11.Http11Protocol ).ajpProtocol : Nama kelas penangan protokol AJP yang akan digunakan (default ke org.apache.coyote.ajp.AjpProtocol ).users : Daftar pengguna dengan username , password , dan roles . Digunakan untuk mengonfigurasi Tomcat dengan otentikasi dasar dengan pengguna ini. Kode contoh berikut menunjukkan cara mengubah port http/https default. Untuk mengaktifkan SSL, kami mengatur properti enableSSL ke true . Aplikasi Web akan dapat diakses di bawah sample-app jalur konteks.
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 ' ]
}
}
}Selain itu, Anda dapat mengatur properti tugas opsional berikut:
contextPath : Jalur Konteks URL Aplikasi web Anda akan terdaftar di bawah (default ke nama perang).webDefaultXml : Web.xml default. Jika tidak didefinisikan sebagai instance org.apache.catalina.servlets.DefaultServlet dan org.apache.jasper.servlet.JspServlet akan diatur.additionalRuntimeResources : Menentukan stoples runtime tambahan atau direktori yang tidak disediakan oleh aplikasi web.URIEncoding : Menentukan pengkodean karakter yang digunakan untuk mendekode byte URI oleh konektor HTTP (default ke UTF-8 ).daemon : Menentukan apakah server Tomcat harus berjalan di latar belakang. Ketika benar, tugas ini selesai segera setelah server telah dimulai. Saat salah, tugas ini memblokir sampai server Tomcat dihentikan (default ke false ).configFile : Jalur ke file XML konteks tomcat (default ke src/main/webapp/META-INF/context.xml untuk tomcatRun , default ke META-INF/context.xml dalam perang untuk tomcatRunWar ).outputFile : File untuk menulis pesan log tomcat ke. Jika file sudah ada pesan baru akan ditambahkan.reloadable : memaksa pemindaian konteks jika Anda tidak menggunakan file konteks (default ke true ).keystorePass : Kata sandi keystore untuk digunakan untuk SSL, jika diaktifkan.truststoreFile : File TrustStore yang akan digunakan untuk SSL, jika diaktifkan.truststorePass : Kata sandi truststore untuk digunakan untuk SSL, jika diaktifkan.clientAuth : Pengaturan ClientAuth untuk digunakan, Nilai mungkin: true , false atau want (default ke false ). Catatan: keystoreFile dan truststoreFile masing -masing memerlukan instance file objek File misalnya file("/path/my.file")
Dalam kode contoh berikut, kami mendeklarasikan file konteks khusus untuk tugas tomcatRun .
tomcatRun . configFile = file( ' context.xml ' ) Untuk mengonfigurasi tugas Jasper Compiler, Anda dapat memilih untuk mengatur properti berikut dalam penutupan jasper dari ekstensi tomcat :
validateXml : Menentukan apakah web.xml harus divalidasi (default ke null ).validateTld : Menentukan apakah web.xml harus divalidasi (default ke null ).uriroot : Direktori Root Aplikasi Web (default ke src/main/webapp ).webXmlFragment : File fragmen XML Web yang dihasilkan untuk direferensikan oleh file web.xml Anda.addWebXmlMappings : Secara otomatis menambahkan fragmen XML Web yang dihasilkan ke file web.xml . PERHATIAN: Ini akan memodifikasi file web.xml dalam proyek, bukan direktori build.outputDir : Direktori Output JSP yang dikompilasi akan berakhir (default untuk build/jasper ).classdebuginfo : Jika file kelas dikompilasi dengan informasi debugging (default ke true ).compiler : Semut kompiler mana yang harus digunakan untuk mengkompilasi halaman JSP. Lihat dokumentasi semut untuk informasi lebih lanjut. Jika nilainya tidak diatur, maka kompiler JDT Java Eclipse default akan digunakan alih -alih menggunakan Ant. Tidak ada nilai default.compilerSourceVM : Versi JDK apa yang kompatibel dengan file sumber dengan (default ke 1.6 ).compilerTargetVM : Versi JDK apa yang dibuat oleh file yang dihasilkan dengan (default ke 1.6 ).poolingEnabled : Menentukan apakah pengumpulan penangan tag diaktifkan. Ini adalah opsi kompilasi. Ini tidak akan mengubah perilaku JSP yang telah dikompilasi (default ke true ).errorOnUseBeanInvalidClassAttribute : Haruskah Jasper mengeluarkan kesalahan ketika nilai atribut kelas dalam tindakan UseBean bukan kelas kacang yang valid (default ke true ).genStringAsCharArray : Haruskah string teks dihasilkan sebagai array char, untuk meningkatkan kinerja dalam beberapa kasus (default ke false ).ieClassId : Nilai ID kelas yang akan dikirim ke Internet Explorer saat menggunakan tag <jsp:plugin> (default ke clsid:8AD9C840-044E-11D1-B3E9-00805F499D93 ).javaEncoding : Pengkodean file java untuk digunakan untuk menghasilkan file sumber java (default ke UTF8 ).trimSpaces : Haruskah spasi putih dalam teks template antara tindakan atau arahan dipangkas (default ke TrimSpaces.TRUE ).xpoweredBy : Menentukan apakah header respons X-powered-by ditambahkan oleh servlet yang dihasilkan (default ke false ).tomcat {
jasper {
validateXml = true
webXmlFragment = file( " $w ebAppDir /WEB-INF/generated_web.xml " )
outputDir = file( " $w ebAppDir /WEB-INF/src " )
}
}Saya mendapatkan pengecualian kompilasi saat memanggil JSP. Apakah ada sesuatu yang saya lewatkan?
Pengecualian yang mungkin Anda lihat mungkin mirip dengan yang ini: org.apache.jasper.JasperException: Unable to compile class for JSP . Tomcat 7.x dan 8.x mengharuskan Anda memiliki Eclipse ECJ 3.6.x di Classpath Anda. Namun, versi ketergantungan ini tidak ada di Maven Central. Anda harus mengunduh ketergantungan itu dan memasukkannya ke dalam repositori Anda sendiri atau menentukan repositori pada disk lokal Anda di mana Anda dapat memasukkannya. Berikut adalah contohnya:
repositories {
flatDir name : ' localRepository ' , dirs : ' lib '
} Mengapa saya mendapatkan java.lang.ClassCastException di javax.servlet.Servlet ?
Tomcat sangat sensitif untuk memiliki beberapa versi dependensi javax.servlet:servlet-api dan javax.servlet:jsp-api di classpath-nya. Secara default mereka sudah ditarik sebagai dependensi transitif dari perpustakaan Tomcat yang tertanam. Pengecualian yang mungkin Anda lihat terlihat mirip dengan yang ini:
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)
Untuk memperbaikinya, pastikan Anda mendefinisikan dependensi modul JSP dan servlet Anda dengan ruang lingkup providedCompile seperti ini:
providedCompile ' javax.servlet:servlet-api:2.5 ' ,
' javax.servlet:jsp-api:2.0 'Bagaimana cara saya men -debug tomcat saya dimulai dengan plugin?
Jika Anda ingin dapat men -debug aplikasi Anda dari jarak jauh, Anda harus mengatur opsi JVM berikut di variabel lingkungan GRADLE_OPTS Anda sebelum memulai wadah. Nomor port yang Anda pilih terserah Anda.
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Tomcat kemudian akan mendengarkan port yang ditentukan untuk koneksi debugging jarak jauh yang masuk. Saat memulai wadah, Anda akan melihat pesan berikut:
Listening for transport dt_socket at address: 5005
Periksa dokumentasi IDE Anda tentang cara mengkonfigurasi penghubung ke port debugging jarak jauh.
Wadah Tomcat saya perlu menggunakan JNDI DataSource. Bagaimana cara mengatur proyek saya?
Pertama -tama Anda harus memastikan untuk mendeklarasikan ketergantungan kumpulan koneksi menggunakan konfigurasi tomcat .
Tomcat 6.0.x:
def tomcatVersion = ' 6.0.35 '
tomcat " org.apache.tomcat:dbcp: ${ tomcatVersion } "Lihat Koordinat di Maven Central untuk detailnya.
Versi yang lebih baru:
def tomcatVersion = ' 9.0.8 '
tomcat " org.apache.tomcat:tomcat-dbcp: ${ tomcatVersion } "Lihat Koordinat di Maven Central untuk detailnya.
Jika Anda memutuskan untuk menggunakan pengaturan default, tempatkan context.xml Anda di direktori src/main/webapp/META-INF . Untuk mengatur lokasi khusus, Anda dapat menggunakan Convention Property configFile . Berikut adalah contoh tentang cara mengaturnya untuk tugas tomcatRun dan tomcatRunWar .
[tomcatRun, tomcatRunWar] * . configFile = file( ' context.xml ' )Silakan merujuk ke dokumentasi Tomcat untuk daftar atribut konteks. Contoh berikut menunjukkan cara mengatur sumber data mysql jndi.
<? 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 >Bagaimana cara menggunakan penyebaran kode panas dengan plugin?
Plugin ini menyediakan dukungan out-of-the-box untuk menukar kode byte melalui properti reloadable . Secara default, opsi ini ternyata sehingga Anda tidak memerlukan perubahan konfigurasi tambahan. Yang perlu Anda lakukan adalah memiliki instance berjalan dari wadah yang diprakarsai oleh tomcatRun . Fire editor favorit Anda, ubah file sumber produksi, simpan dan kompilasi kembali sumber Anda di terminal lain melalui gradle compileJava . Setelah beberapa detik konteksnya dimuat ulang dan Anda harus melihat perilaku yang tercermin di jendela terminal yang menjalankan wadah:
Reloading Context with name [/myapp] has started
Reloading Context with name [/myapp] is completed
Atau, Anda dapat menggunakan teknologi pertukaran kode byte commerial lainnya. Konfigurasi biasanya spesifik produk. Silakan merujuk ke dokumentasi produk tentang cara mengaturnya untuk proyek Anda. Bagian berikut menjelaskan cara mengatur lulusan dan plugin dengan Jrebel. Pertama -tama unduh jrebel, instal di mesin Anda dan atur lisensi. Untuk memberi tahu Jrebel direktori mana yang akan dipindai untuk kode byte yang diubah, Anda perlu membuat file rebel.xml. Di modul web Anda, tempatkan file di bawah build/classes/main sehingga dapat dimuat oleh plugin Tomcat. Untuk membuat konfigurasi file, plugin Gradle Jrebel berguna. Tidak diharuskan menggunakan plugin. Anda juga dapat memutuskan untuk membuat konfigurasi dengan tangan. Ingatlah bahwa gradle clean akan menghapus file. Untuk menyiapkan JREBEL dalam skenario proyek multi-modul, silakan merujuk ke dokumentasi. Cuplikan kode berikut menunjukkan contoh file 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 > Edit skrip startup Gradle Anda dan tambahkan baris berikut ke dalamnya untuk memberi tahu Gradle untuk menggunakan agen Jrebel. Pastikan untuk mengatur variabel lingkungan REBEL_HOME yang menunjuk ke direktori instalasi JREBEL Anda.
JAVA_OPTS="-javaagent:$REBEL_HOME/jrebel.jar $JAVA_OPTS"
Pada startup modul web Anda menggunakan gradle tomcatRun Anda akan melihat informasi tentang lisensi JRebel yang digunakan dan direktori yang dipindai untuk perubahan. Untuk contoh kami file rebel.xml , akan terlihat seperti ini:
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.
Jika sebuah file telah dikompilasi ulang, JREBEL menunjukkan ini dengan menulisnya ke konsol seperti ini:
JRebel: Reloading class 'de.muschko.web.controller.TestController'.
Perlu menjalankan tes integrasi in-container sebagai bagian dari build saya. Apa yang perlu dilakukan?
Biasanya tes unit dan integrasi tetap terpisah berdasarkan konvensi. Salah satu konvensi dapat untuk memberi nama file sumber uji secara berbeda misalnya tes integrasi selalu berakhir dengan IntegrationTest Suffix, file unit uji diakhiri dengan Test . Dengan melakukan itu, Anda dapat menjalankannya secara terpisah. Untuk menjalankan tes integrasi, Anda ingin menjalankan tugas Tomcat sebagai benang daemon dan mematikannya setelah tes Anda selesai. Contoh berikut menunjukkan cara mengatur tugas gradle yang menyediakan fungsionalitas ini. Tentu saja ini hanya satu cara untuk melakukannya. Contoh berikut membutuhkan lulusan> = 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.* '
}Bagaimana cara menambahkan file atau direktori JAR yang bukan bagian dari kode sumber aplikasi web saya?
Setiap tugas tipe AbstractTomcatRun memperlihatkan properti bernama additionalRuntimeResources yang digunakan untuk bercampur dengan classpath runtime aplikasi web.
[tomcatRun, tomcatRunWar] . each { task ->
task . additionalRuntimeResources << file( ' /Users/bmuschko/config/props ' )
task . additionalRuntimeResources << file( ' /Users/bmuschko/ext/jars/my.jar ' )
}