領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多最近 Bundlor 的 M3 里程碑已經發布(論壇公告)。此里程碑增加了對屬性替換和版本擴充套件的支援。這篇部落格文章解釋瞭如何使用這些新功能來提高生成的 Manifest 的質量。
Bundlor 現在可用於將任何屬性值替換到您的 Manifest 模板中。
Bundle-Name: ${name}
Bundle-Description: Test bundle using new version of Kernel at ${com.springsource.kernel}
Import-Template: com.springsource.kernel.*;version="${com.springsource.kernel}"
此語法允許您為 ${name} 和 ${com.springsource.kernel} 指定屬性佔位符,並在執行時用實際值替換它們。這些值傳遞的方式取決於正在使用的 Bundlor 前端。
當從命令列執行 Bundlor 時,它將使用所有可作為系統屬性的屬性,這不包括任何環境變數。命令列指令碼將傳遞透過 -D 傳入的任何變數,因此以下內容將為 ${com.springsource.kernel} 屬性提供值“2.0.0.RELEASE”,併為 ${name} 屬性提供值“Kernel test bundle”。
bundlor.sh \
transform \
--bundle ./org.springframework.integration.jar \
--manifest ./template.mf \
--outputfile ./target/org.springframework.integration.jar \
-Dcom.springsource.kernel=2.0.0.RELEASE \
-Dname="Kernel test bundle"
要將屬性從 Maven 構建傳入 Bundlor,您應該在 Maven 專案檔案中的專案元素下定義一個新的(或新增到現有的)屬性元素。
<properties>
<name>${project.name}</name>
<com.springsource.kernel>2.0.0.RELEASE</com.springsource.kernel>
</properties>
這將使用 ${com.springsource.kernel} 的替換值“2.0.0.RELEASE”和 ${name} 的替換值(Maven 專案的名稱)執行 Bundlor。
當從 Ant 呼叫 Bundlor 任務時,可以在任務上提供一個額外的屬性,該屬性傳入一個 Ant 屬性集,該屬性集將傳遞給 Bundlor。
<bundlor:bundlor>
bundlePath="${basedir}/org.springframework.integration.jar"
outputPath="${basedir}/target/org.springframework.integration.jar"
bundleVersion="2.0.0.BUILD-${timestamp}"
manifestTemplatePath="${basedir}/template.mf">
<propertyset>
<property name="name" value="${ant.project.name}"/>
<property name="com.springsource.kernel" value="2.0.0.RELEASE"/>
</propertyset>
</bundlor:bundlor>
這將執行 Bundlor 併為 ${com.springsource.kernel} 提供替換值“2.0.0.RELEASE”,併為 ${name} 提供替換值(Ant 專案的名稱)。
屬性替換可以發生在清單模板的值中的任何位置。它甚至可以用於替換“Import-Template”版本。單獨來看,匯入中的單個版本並不是很有用,因為它限制性太強,但自動將版本擴充套件為版本範圍是有用的。可以在冒號後面提供一個版本擴充套件模式,該模式將應用於版本以生成版本範圍。
Import-Template: com.springsource.kernel.*;version="${com.springsource.kernel:[=.=.=.=, +1.0.0)}",
org.apache.commons.logging.*;version="${org.apache.commons.logging:[=.=.=.=, =.=.+1)}"
版本擴充套件作用於儲存合法 OSGi 版本號的變數。根據該版本號,擴充套件分為 4 個部分:主版本、次版本、微版本和限定符。如果提供的屬性不是有效的 OSGi 版本,則 Bundlor 將失敗並丟擲異常,說明提供的屬性不是有效的版本字串。
| 此版本號的前三個部分可以在擴充套件中替換如下 | |
| = | 等於變數中的值 |
| [+/-]n | 將變數中的值按此數量調整 |
| n | 用此值替換變數中的值。這通常只用於放置 0 |
| 第四個部分(限定符)只能進行以下替換 | |
| = | 等於變數中的值 |
| 任何合法的限定符值。 | 用此值替換變數中的值 |
${com.springsource.kernel} 的生成版本範圍和給定版本 1.2.0 將是 [1.2.0, 2.0.0)。這意味著將使用從 1.2.0 到(但不包括)2.0.0 的最高可用版本。對於 ${org.apache.commons.logging} 和給定版本 1.4.0,生成的版本範圍將是 [1.4.0, 1.4.1),這更具限制性,因為它只允許對 1.4.0 版本的限定符進行更改,並且不允許使用 1.4.1.xxx 及更高版本。如果一個模式將用於多個匯入,則可以為其指定一個名稱並多次使用。模板清單中使用了新的頭來指定命名的版本擴充套件模式。
Import-Template:
org.apache.commons.codec.*;version="${org.apache.commons.codec:apache}",
org.apache.commons.logging.*;version="${org.apache.commons.logging:apache}",
org.hibernate.*;version="${org.hibernate:hibernate}"
org.myorg.*;version="${org.myorg:(=.=.=.=, =.+1.0.=]}"
Version-Patterns:
apache;pattern="[=.=.=.=, +1.0.0)",
hibernate;pattern="[=.=.=.=, =.=.+1)"
這顯示了定義多個模式並將其用於多個匯入。apache 模式將提供從所提供版本到但不包括下一個主版本的版本範圍。hibernate 模式將提供從所提供版本到但不包括下一個微版本的版本範圍。還有一個匯入定義了內聯版本擴充套件模式,該模式可以在同一模板中與命名模式一起很好地使用。內聯模式顯示了更不尋常的用法。它將建立一個版本範圍,從但不包括所提供版本到幷包括具有相同限定符的下一個次要版本。
結合使用這些技術,可以生成可靠的清單。正確使用版本擴充套件將確保生成的清單具有足夠的限制性以阻止不必要的連線,但又足夠靈活以允許微小的更改。在編寫模板清單時,應對每個相關捆綁包採取務實的方法,因為並非所有捆綁包都採用相同的方法進行版本控制。