| 在過去的幾年中,這個插件已經看到了許多發行版。感謝所有參與其中的人!不幸的是,我沒有太多時間做出貢獻了。在實踐中,這意味著從我的終點開始的活動,對問題的響應能力和新版本的響應能力要少得多。 |
| 我正在積極尋找願意接受該項目維護和實施的貢獻者。如果您有興趣,並且希望看到這個插件繼續蓬勃發展,請給我發送郵件。 |
該插件通過利用貨物螞蟻任務,為任何給定的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