| 在过去的几年中,这个插件已经看到了许多发行版。感谢所有参与其中的人!不幸的是,我没有太多时间做出贡献了。在实践中,这意味着从我的终点开始的活动,对问题的响应能力和新版本的响应能力要少得多。 |
| 我正在积极寻找愿意接受该项目维护和实施的贡献者。如果您有兴趣,并且希望看到这个插件继续蓬勃发展,请给我发送邮件。 |
该插件通过利用货物蚂蚁任务,为任何给定的Gradle构建中的本地和远程容器提供了Web应用程序的部署功能。该插件支持战争和耳朵伪像。
该插件的典型用例是在开发过程中支持部署。请记住,货物使用热热部署,随着时间的流逝,填充了运行容器的JVM进程的Permgen内存。不断部署工件将不可避免地导致java.lang.OutOfMemoryError 。货物确实支持通过所谓的货运守护程序支持容器管理功能(远程容器的启动/停止)。但是,在连续的部署方案中,您通常需要执行更复杂的操作。
要使用插件的功能,您将需要将其二进制文物添加到构建脚本的classpath中并应用插件。
插件罐需要在构建脚本的类路径中定义。它可在Gradle插件门户网站上使用。以下代码片段显示了如何使用buildscript语法检索它的示例:
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath 'com.bmuschko:gradle-cargo-plugin:2.9.0'
}
}
JAR文件带有两个插件:
| 插件标识符 | 取决于 | 类型 | 描述 |
|---|---|---|---|
| com.bmuschko.cargo-bas | - | 肌eplugin | 提供货物自定义的任务类型,预配置班级路径和部署。 |
| com.bmuschko.cargo | com.bmuschko.cargo-bas | cargoplugin | 提供一组本地和远程货物任务,并揭示配置的扩展。 |
com.bmuschko.cargo插件可帮助您快速启动。如果您只需要处理单个容器产品,这是可取的选项。大多数插件用户都会使用此选项。要使用货物插件,请在构建脚本中包含以下代码段:
apply plugin: 'com.bmuschko.cargo'
如果您需要对部署任务进行完全控制,则需要使用com.bmuschko.cargo-base插件。缺点是,每个任务都必须在构建脚本中单独配置。要使用货物基础插件,请在构建脚本中包含以下代码段:
apply plugin: 'com.bmuschko.cargo-base'
com.bmuschko.cargo-base插件已经设置了货物的依赖项。为此,它选择了库的默认版本。另外,您可以定义货物库的自定义版本。为此,请在dependencies关闭中使用cargo配置名称,并记住下面:
dependencies {
def cargoVersion = '1.9.10'
cargo "org.codehaus.cargo:cargo-core-uberjar:$cargoVersion",
"org.codehaus.cargo:cargo-licensed-dtds:$cargoVersion",
"org.codehaus.cargo:cargo-ant:$cargoVersion"
}
cargo插件预先定义以下任务:
| 任务名称 | 取决于 | 类型 | 描述 |
|---|---|---|---|
| cargodeployremote | - | cargodeployremote | 部署可部署到远程容器的。 |
| Cargougneployremote | - | Cargougneployremote | 从远程容器中部署的不部件。 |
| 碳纤维脂毛 | - | 碳纤维脂毛 | 重新启动可部署到远程容器。 |
| cargorunlocal | - | cargorunlocal | 启动本地容器,部署可部署的容器,并等待用户按CTRL + C停止。 |
| cargostartlocal | - | cargostartlocal | 启动本地容器,部署可部署,然后执行其他任务(例如,执行测试)。 |
| 碳胶质线 | - | 碳胶质线 | 重新部署在本地容器上可部署。 |
| 矿物世界 | - | 矿物世界 | 停止本地容器。 |
| congoconfigurelocal | - | congoconfigurelocal | 配置本地容器。 |
货物插件使用与战争插件相同的布局。
货物插件定义了cargo关闭中的以下约定属性:
containerId :您要定位的容器ID。请参阅货物网站上受支持的容器的列表。port :TCP端口容器响应(默认为8080)。在cargo中,您可以在名为deployable关闭中定义1..n部署伪像的可选属性。每个部署工件将在其自身关闭中指定:
file :任何可以传递给project.files(对象...)的类型,并解析到一个文件或目录,包括任意工件,爆炸的战争目录和要部署到容器的依赖配置(默认为Project/Module toveart -war -war -war或ear文件)。context :Container在Containe上处理您的Web应用程序的上下文(默认为WAR/EAR名称)。请记住,如果您只想部署Gradle Project/模块定义的工件,则不必定义deployable封闭。
在cargo中,您可以在名为remote的封闭中定义远程容器的属性:
protocol :远程容器的协议(默认为http )。hostname :遥控容器的主机名。username :远程容器(可选)的用户名凭据。password :远程容器(可选)的密码凭据。在cargo中,您可以在名为local的关闭中定义本地容器的属性:
jvmArgs :本地容器的JVM论点。outputFile :您本地容器的日志文件(默认写入控制台)。logFile :您本地容器的货物日志文件(默认写入控制台)。logLevel :使用(可选)运行容器的日志级别。有效水平low , medium和high 。homeDir :您当地容器安装的主目录。configHomeDir :当地容器配置的主目录。configFile :要添加到容器的配置中的配置文件。 configFile是一个封闭本身,要求您提供属性files和toDir 。应将FileCollection用作files属性,而toDir应为String 。可以通过创建多个配置configFile闭合来定义多个配置文件目的地。rmiPort :与此服务器通信时要使用的端口,例如启动和停止它。startStopTimeout :超时(以MS)确定容器是否成功启动或停止(默认为120000ms)。extraClasspath :为本地集装箱类Path(可选)提供额外元素的FileCollection 。sharedClasspath :为应用程序类Path的额外FileCollection而不是本地容器(可选)提供额外元素。在local和remote中,您可以定义特定于容器的属性。这些特性可以在货物主页上查找。以下示例显示了如何为本地tomcat容器设置AJP端口:
cargo {
local {
containerProperties {
property 'cargo.tomcat.ajp.port', 9099
}
}
}
本地容器可以使用传递给它的系统属性。以下示例显示了如何设置名为myproperty的单个系统属性:
cargo {
local {
systemProperties {
property 'myproperty', 'myvalue'
}
}
}
如果您决定使用ZIP安装程序货物将自动下载您的容器。您可以在闭合installer中定义其属性。安装程序仅适用于“本地”货物任务。
installUrl :从从中下载容器分发的URL。downloadDir dir:目标目录将容器分配下载到。extractDir :目录将下载的容器分配提取到。请参阅货物主页上的各个配置属性。所有这些属性都可以被项目属性覆盖。项目属性的名称与货物手册中的名称相同。
如果要在解决容器分布时从Gradle依赖缓存中受益,则可以在配置安装程序时使用配置而不是URL:
configurations {
tomcat
}
dependencies {
tomcat "org.apache.tomcat:tomcat:9.0.14@zip"
}
cargo {
local {
installer {
installConfiguration = configurations.tomcat
}
}
}
cargo {
containerId = 'tomcat6x'
port = 9090
deployable {
context = 'myawesomewebapp'
}
remote {
hostname = 'cloud.internal.it'
username = 'superuser'
password = 'secretpwd'
}
local {
homeDir = file('/home/user/dev/tools/apache-tomcat-6.0.32')
outputFile = file('build/output.log')
startStopTimeout = 60000
containerProperties {
property 'cargo.tomcat.ajp.port', 9099
}
}
}
我想在执行货物部署任务时自动组装项目的工件。
任务cargoRunLocal并不自动取决于assemble任务。其背后的原因是,您可能不想部署项目的工件,或者您的项目不会产生战争或耳朵文件。相反,您可能需要部署一个或多个外部工件。如果您的工作流程看起来像“编译代码”,“生成工件”和“部署”,那么您使货物部署任务取决于assemble任务。这是一个例子:
cargoRunLocal.dependsOn assemble
我正在研究多项目构建。我可以将相同的货物配置应用于我的所有网络项目吗?
Gradle允许按照某些标准过滤副标。要注入构建根项目的相关配置,您将需要确定所有应用WAR插件的子标题(当然,同一概念适用于EAR项目)。使用configure方法应用货物插件和您的配置,如以下代码段所示:
def webProjects() {
subprojects.findAll { subproject -> subproject.plugins.hasPlugin('war') }
}
gradle.projectsEvaluated {
configure(webProjects()) {
apply plugin: 'com.bmuschko.cargo'
cargo {
containerId = 'tomcat7x'
remote {
hostname = 'localhost'
username = 'manager'
password = 'manager'
}
}
}
}
我想向我的容器部署多个工件。我该怎么做?
您将在单独的deployable闭合中指定每个工件。每个关闭都应分配唯一的URL上下文。以下示例说明了如何将三个不同工件的货物设置部署到当地的Tomcat中:
cargo {
containerId = 'tomcat6x'
port = 9090
deployable {
file = file('/home/foo/bar/web-services.war')
context = 'web-services'
}
deployable {
file = file('/home/foo/bar/web-app.war')
context = 'web-app'
}
deployable {
file = file('/home/foo/bar/enterprise-app.ear')
context = 'enterprise-app'
}
local {
homeDir = file('/home/user/dev/tools/apache-tomcat-6.0.32')
}
}
有没有办法让货物自动安装我想使用的容器?
货物允许定义一个自动下载并安装在本地磁盘上的容器。您需要做的就是指定installer关闭。以下代码段下载,安装和使用Tomcat 7:
cargo {
containerId = 'tomcat7x'
local {
installer {
installUrl = 'http://apache.osuosl.org/tomcat/tomcat-7/v7.0.27/bin/apache-tomcat-7.0.27.zip'
downloadDir = file("$buildDir/download")
extractDir = file("$buildDir/extract")
}
}
}
我想将配置文件添加到我的本地容器中。我该怎么做?
对于本地容器,可以使用名为configFile的封闭式,以定义您要在运行时使用该文件的源文件和目录。如果您需要将文件复制到一个以上的目的地中,则只需创建多个configFile封闭即可。
cargo {
containerId = 'jboss5x'
local {
configFile {
files = project.files('src/main/jboss5/login-config.xml')
toDir = 'conf'
}
configFile {
files = project.files('src/main/jboss5/login-config.xml', 'src/main/jboss5/sample-users.properties')
toDir = 'conf/props'
}
}
}
要添加二进制文件,您应该使用file关闭:
cargo {
containerId = 'glassfish3x'
local {
file {
file = file('../config/db/mysql-connector-java-5.1.23-bin.jar')
toDir = 'lib'
}
}
}
我想设置并配置自己的货物任务,以适用于一个以上的容器。可以做到吗?
绝对地。货物基础插件提供了设置部署任务所需的所有任务。您需要做的就是创建一个或多个任务并配置强制性属性。以下示例显示了如何为Tomcat和Jetty设置本地容器任务:
apply plugin: 'com.bmuschko.cargo-base'
task myTomcatRun(type: com.bmuschko.gradle.cargo.tasks.local.CargoRunLocal) {
containerId = 'tomcat7x'
homeDir = file('/home/user/dev/tools/apache-tomcat-7.0.42')
}
task myJettyRun(type: com.bmuschko.gradle.cargo.tasks.local.CargoRunLocal) {
containerId = 'jetty9x'
homeDir = file('/home/user/dev/tools/jetty-distribution-9.0.4.v20130625')
}
我想创建部署任务,以将部署到多个远程容器中。我该怎么做?
Gradle允许根据您的构建脚本逻辑动态创建任务。下面的示例显示了如何创建三个Tomcat部署任务以及如何借助简单的数据结构来配置它们。在脚本结束时,我们还添加了另一个触发部署到所有远程容器的任务。
class RemoteContainer {
String name
String hostname
Integer port
String username
String password
}
def remoteContainers = [new RemoteContainer(name: 'tomcat1', hostname: 'remote-tomcat1',
port: 9090, username: 'admin', password: 's3cr3t'),
new RemoteContainer(name: 'tomcat2', hostname: 'remote-tomcat2',
port: 8050, username: 'deployer', password: 'qwerty'),
new RemoteContainer(name: 'tomcat3', hostname: 'remote-tomcat3',
port: 8888, username: 'su', password: 'powerful')]
apply plugin: 'com.bmuschko.cargo-base'
remoteContainers.each { config ->
task "deployRemote${config.name.capitalize()}"(type: com.bmuschko.gradle.cargo.tasks.remote.CargoDeployRemote) {
description = "Deploys WAR to remote Tomcat '${config.name}'."
containerId = 'tomcat7x'
hostname = config.hostname
port = config.port
username = config.username
password = config.password
}
}
task deployToAllRemoteTomcats {
dependsOn remoteContainers.collect { "deployRemote${it.name.capitalize()}" }
description = 'Deploys to all remote Tomcat containers.'
group = 'deployment'
}
在远程部署之前,我想重新启动我的容器。可以做到吗?
是的,借助货物守护程序功能,这是可能的。请参阅货物在线文档,以设置货物守护程序JVM流程并配置容器。使用此插件,您可以使用自定义任务来启动和停止容器。以下示例停止,开始然后重新部署了一个工件。
apply plugin: 'com.bmuschko.cargo'
cargo {
...
}
ext.tomcat7HandleId = 'tomcat7'
task cargoDaemonStop(type: com.bmuschko.gradle.cargo.tasks.daemon.CargoDaemonStop) {
handleId = tomcat7HandleId
}
task cargoDaemonStart(type: com.bmuschko.gradle.cargo.tasks.daemon.CargoDaemonStart) {
handleId = tomcat7HandleId
}
cargoDaemonStart.mustRunAfter cargoDaemonStop
cargoRedeployRemote.dependsOn cargoDaemonStop, cargoDaemonStart