Плагин предоставляет возможности развертывания веб -приложений в встроенный веб -контейнер Tomcat в любой заданной сборке Gradle. Это расширяет плагин военного. В настоящее время поддерживаются версии Tomcat 6.0.x, 7.0.x, 8.0.x, 8.5.x и 9.0.x.
Типичным вариантом использования этого плагина является поддержка развертывания во время разработки. Плагин обеспечивает быстрое разработку веб -приложений из -за быстрого запуска контейнера. Градл запускает встроенный контейнер в той же JVM. В настоящее время контейнер не может быть раздвоен в качестве отдельного процесса. Этот плагин также не может развернуть файл войны в удаленный контейнер. Если вы ищете эту возможность, пожалуйста, посмотрите на плагин груза.
Чтобы использовать функциональность плагина, вам нужно будет добавить его двоичный артефакт к обмену класса сценария вашего сценария и применить плагин.
Плагин JAR должен быть определен в классе вашего сценария сборки. Он напрямую доступен на портале плагина Gradle. На следующем фрагменте кода показан пример того, как его получить:
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath ' com.bmuschko:gradle-tomcat-plugin:2.7.0 '
}
}Файл JAR поставляется с двумя плагинами:
| Идентификатор плагина | Зависит от | Тип | Описание |
|---|---|---|---|
| com.bmuschko.tomcat-base | - | Tomcatbaseplugin | Обеспечивает пользовательские типы задач Tomcat, предварительные конфигурации ClassPath. |
| com.bmuschko.tomcat | com.bmuschko.tomcat-base | Tomcatplugin | Обеспечивает задачи для запуска и остановки встроенного контейнера Tomcat и обнажает расширение с именем tomcat . |
Плагин com.bmuschko.tomcat помогает вам начать быстро. Если вы в порядке, если предварительно настроенные задачи, это предпочтительный вариант. Большинство пользователей плагинов пойдут с этой опцией. Чтобы использовать плагин Tomcat, включите следующий фрагмент кода в свой сценарий сборки:
apply plugin: 'com.bmuschko.tomcat'
Если вам нужен полный контроль над вашими задачами или вы не хотите выполнять предварительные задачи, вы захотите использовать плагин com.bmuschko.tomcat-base . Это может быть так, если вы хотите настроить контейнер исключительно для функционального тестирования. Недостатком является то, что каждая задача должна быть настроена индивидуально в вашем сценарии сборки. Чтобы использовать плагин Tomcat Base, включите следующий фрагмент кода в свой сценарий сборки:
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:
Имейте в виду, что зависимость tomcat-embed-logging-juli требуется только для включения регистрации контейнеров через log4j 1.x (что больше не поддерживает сообщество Log4J). 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:
Имейте в виду, что зависимость tomcat-embed-logging-juli требуется только для включения регистрации контейнеров через log4j 1.x (что больше не поддерживает сообщество Log4J). 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 и развертывает взорванное веб -приложение. |
| Tomcatrunwar | - | Tomcatrunwar | Запускает экземпляр Tomcat и развертывает войну. |
| Tomcatstop | - | Tomcatstop | Останавливает экземпляр Tomcat. |
| Tomcatjasper | - | Tomcatjasper | Запускает компилятор JSP и превращает страницы JSP в источник Java с помощью Jasper. |
Плагин Tomcat использует тот же макет, что и военный плагин.
Плагин Tomcat раскрывает следующие свойства через расширение с именем tomcat :
httpPort : порт TCP, на котором Tomcat должен прослушать HTTP -запросы (по умолчанию к 8080 ).httpsPort : порт TCP, на котором Tomcat должен прослушать запросы HTTPS (по умолчанию к 8443 ).ajpPort : порт TCP, на котором Tomcat должен прослушать запросы AJP (по умолчанию к 8009 ).stopPort : порт TCP, который Tomcat должен прослушать запросы администратора (по умолчанию к 8081 ).stopKey : ключ, который должен пройти в Tomcat при просьбе его остановиться (по умолчанию в null ).contextPath : путь контекста URL, по которому будет зарегистрировано веб -приложение (по умолчанию на имя войны).enableSSL : определяет, должен ли создавать разъем HTTPS (по умолчанию по умолчанию false ).daemon : указывает, должен ли сервер Tomcat работать в фоновом режиме. Когда True, эта задача завершается, как только начался сервер. Когда он 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, мы установили свойство enableSSL в true . Веб-приложение будет доступно в рамках 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 Ваше веб -приложение будет зарегистрировано (по умолчанию на имя войны).webDefaultXml : по умолчанию web.xml. Если он не определяется экземпляр org.apache.catalina.servlets.DefaultServlet и org.apache.jasper.servlet.JspServlet будет настроен.additionalRuntimeResources : определяет дополнительные банки или каталоги времени выполнения, которые не предоставляются веб -приложением.URIEncoding : указывает кодирование символов, используемое для декодирования байтов URI с помощью разъема HTTP (по умолчанию UTF-8 ).daemon : указывает, должен ли сервер Tomcat работать в фоновом режиме. Когда True, эта задача завершается, как только начался сервер. Когда он False, эта задача блокирует до тех пор, пока сервер Tomcat не будет остановлен (по умолчанию false ).configFile : Путь к файлу XML Context Tomcat (по умолчанию в src/main/webapp/META-INF/context.xml для tomcatRun , по умолчанию META-INF/context.xml в войне за tomcatRunWar ).outputFile : файл для записи сообщений журнала Tomcat. Если файл уже существует, будут добавлены новые сообщения.reloadable : заставляет контекстный сканирование, если вы не используете файл контекста (по умолчанию true ).keystorePass : пароль для магазина ключей для использования для SSL, если включен.truststoreFile : файл TrustStore для использования для SSL, если включен.truststorePass : пароль TrustStore для использования для SSL, если включен.clientAuth : настройка ClientAuth для использования, значения могут быть: true , false или want (по умолчанию false ). Примечание: keystoreFile и truststoreFile Каждый требует экземпляра File объекта, например file("/path/my.file")
В следующем примере кода мы объявляем пользовательский контекстный файл для задачи tomcatRun .
tomcatRun . configFile = file( ' context.xml ' ) Чтобы настроить задачу компилятора Jasper, вы можете установить следующие свойства в закрытии jasper расширения tomcat :
validateXml : определяет, следует ли быть подтвержден web.xml (по умолчанию в null ).validateTld : определяет, следует ли быть подтвержден web.xml (по умолчанию в null ).uriroot : Справочник root Web Application (по умолчанию src/main/webapp ).webXmlFragment : сгенерированный файл фрагмента Web XML, на который ссылаются ваш файл web.xml .addWebXmlMappings : автоматически добавьте сгенерированный фрагмент веб -XML в файл web.xml . Внимание: это изменит файл web.xml в проекте, а не в каталог сборки.outputDir : выходной каталог, в котором будет в конечном итоге скомпилированные JSP (по умолчанию build/jasper ).classdebuginfo : если файл класса будет составлен с информацией отладки (по умолчанию к true ).compiler : какой муравей компилятора должен использовать для компиляции страниц JSP. См. Документацию ANT для получения дополнительной информации. Если значение не установлено, то вместо использования ANT будет использоваться компилятор Eclipse Eclipse JDT JAVA. Нет значения по умолчанию.compilerSourceVM : что версия JDK является исходными файлами, совместимыми с (по умолчанию до 1.6 ).compilerTargetVM : что JDK -версия является сгенерированными файлами, совместимыми с (по умолчанию до 1.6 ).poolingEnabled : определяет, включено ли объединение обработчиков тегов. Это вариант компиляции. Это не изменит поведение JSP, которые уже были составлены (по умолчанию к true ).errorOnUseBeanInvalidClassAttribute : Должен ли Jasper допустить ошибку, когда значение атрибута класса в действии asebean не является действительным классом бобов (по умолчанию true ).genStringAsCharArray : следует ли создавать текстовые строки в виде массивов для ЧАР, чтобы в некоторых случаях повысить производительность (по умолчанию false ).ieClassId : значение ID класса, которое будет отправлено в Internet Explorer при использовании <jsp:plugin> теги (по умолчанию в clsid:8AD9C840-044E-11D1-B3E9-00805F499D93 ).javaEncoding : кодирование файла Java для создания исходных файлов Java (по умолчанию UTF8 ).trimSpaces : должны ли белые пространства в тексту шаблона между действиями или директивами быть обрезаны (по умолчанию в TrimSpaces.TRUE ).xpoweredBy : определяет, добавляется ли заголовок ответа x-пиушиваний сгенерированным сервлетом (по умолчанию 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 требует, чтобы вы имели Eclipse ECJ 3.6.x в вашем классе. Тем не менее, эта версия зависимости не существует в Maven Central. Вам придется скачать эту зависимость и поместить ее в свой собственный репозиторий или определить репозиторий на вашем локальном диске, где вы можете его бросить. Вот пример:
repositories {
flatDir name : ' localRepository ' , dirs : ' lib '
} Почему я получаю java.lang.ClassCastException на javax.servlet.Servlet ?
Tomcat очень чувствителен к тому, чтобы иметь несколько версий зависимостей javax.servlet:servlet-api и javax.servlet:jsp-api в своем классе. По умолчанию их уже вводят в качестве транзитивных зависимостей встроенных библиотек 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 запустил плагин?
Если вы хотите иметь возможность отлаживать свое приложение удаленно, вам нужно установить следующие параметры JVM в своей переменной среды GRADLE_OPTS , прежде чем запустить контейнер. Номер порта, который вы выберете, зависит от вас.
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Затем Tomcat будет прослушать указанный порт для входящих подключений с удаленной отладкой. При запуске контейнера вы должны увидеть следующее сообщение:
Listening for transport dt_socket at address: 5005
Проверьте свою документацию IDE о том, как настроить подключение к порту удаленной отладки.
Мой контейнер Tomcat должен использовать данные JNDI. Как настроить свой проект?
Прежде всего, вам нужно убедиться, что объявить зависимость пула соединений, используя конфигурацию 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 в Directory src/main/webapp/META-INF . Чтобы установить пользовательское местоположение, вы можете использовать configFile Свойства Конвенции. Вот пример того, как установить его для задач tomcatRun и tomcatRunWar .
[tomcatRun, tomcatRunWar] * . configFile = file( ' context.xml ' )Пожалуйста, обратитесь к документации Tomcat для списка атрибутов контекста. В следующем примере показано, как настроить дат данных 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 >Как я могу использовать развертывание горячего кода с плагином?
Плагин обеспечивает необычную поддержку для замены байтового кода через reloadable свойств. По умолчанию эта опция выясняется, поэтому вам не нужны дополнительные изменения конфигурации. Все, что вам нужно сделать, это иметь бегущий экземпляр контейнера, инициированный tomcatRun . Запустите свой любимый редактор, измените производственный исходный файл, сохраните его и перекомпилируйте свои источники в другом терминале через gradle compileJava . Через пару секунд контекст перезагружается, и вы должны увидеть поведение, отраженное в окне терминала, в котором работает контейнер:
Reloading Context with name [/myapp] has started
Reloading Context with name [/myapp] is completed
В качестве альтернативы, вы можете использовать другие технологии обмена коммерческим байтовым кодом. Конфигурация обычно специфична для продукта. Пожалуйста, обратитесь к документации продукта о том, как настроить его для вашего проекта. В следующем разделе описывается, как настроить Gradle и плагин с Jrebel. Прежде всего скачать Jrebel, установите его на машине и настройте лицензию. Чтобы сообщить Jrebel, какой каталог сканирует на измененный байтовый код, вам необходимо создать файл Rebel.xml. В вашем веб -модуле поместите файл в build/classes/main чтобы он мог быть загружен плагином Tomcat. Для создания конфигурации файла плагин Gradle Jrebel пригодится. Не требуется использовать плагин. Вы также можете решить создать конфигурацию вручную. Имейте в виду, что gradle clean удалит файл. Для настройки 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 и добавьте в него следующую строку, чтобы сказать Gradle, чтобы использовать агент Jrebel. Пожалуйста, обязательно установите переменную среды REBEL_HOME , которая указывает на ваш каталог установки Jrebel.
JAVA_OPTS="-javaagent:$REBEL_HOME/jrebel.jar $JAVA_OPTS"
При запуске вашего веб -модуля с помощью gradle tomcatRun вы должны увидеть информацию об используемой лицензии 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'.
В качестве части моей сборки необходимо запустить интеграционные тесты в контейнере. Что нужно сделать?
Обычно контрольные тесты и интеграционные тесты хранятся отдельными в соответствии с соглашением. Одно соглашение может состоять в том, чтобы назвать исходные файлы тестирования по -разному, например, интеграционные тесты, всегда заканчивающиеся с помощью суффикса IntegrationTest , модульные тестовые файлы заканчиваются Test . Делая это, вы можете запустить их отдельно. Для запуска интеграционных тестов вы захотите запустить задачу Tomcat в качестве потока Daemon и выключить ее после того, как ваши тесты будут выполнены. В следующем примере демонстрируется, как настроить задачу 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.* '
}Как добавить файлы JAR или каталоги, которые не являются частью исходного кода моего веб -приложения?
Каждая задача типа AbstractTomcatRun раскрывает свойство с именем additionalRuntimeResources , которое используется для смешивания с веб -приложением ClassPath.
[tomcatRun, tomcatRunWar] . each { task ->
task . additionalRuntimeResources << file( ' /Users/bmuschko/config/props ' )
task . additionalRuntimeResources << file( ' /Users/bmuschko/ext/jars/my.jar ' )
}