搶佔先機
VMware 提供培訓和認證,以加速您的進步。
瞭解更多最近,Bundlor 的 M3 里程碑已釋出 (論壇公告)。此里程碑增加了對屬性替換和版本擴充套件的支援。 這篇部落格文章解釋瞭如何使用這些新功能來提高生成的 Manifests 的質量。
現在可以使用 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 專案檔案的 project 元素下定義一個新的(或新增到現有的)properties 元素。
<properties> <name>${project.name}</name> <com.springsource.kernel>2.0.0.RELEASE</com.springsource.kernel> </properties>
這將執行 Bundlor,其中 ${com.springsource.kernel}
的替換值為 '2.0.0.RELEASE',${name}
的替換值為 Maven 專案的名稱。
從 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 專案名稱的替換值。
屬性替換可以發生在 Manifest 模板值的任何位置。 它甚至可以用於替換“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 個部分:major、minor、micro 和 qualifier。 如果提供的屬性不是有效的 OSGi 版本,則 Bundlor 將失敗,並出現異常,指出提供的屬性不是有效的版本字串。
此版本號的前三個段可以在擴充套件中替換如下 | |
= | 等於變數中的值 |
[+/-]n | 將變數中的值調整此數量 |
n | 用此值替換變數中的值。 這通常僅用於放入 0 |
第四段(qualifier)只能採用以下替換 | |
= | 等於變數中的值 |
任何合法的 qualifier 值。 | 用此值替換變數中的值 |
${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 的 qualifier 進行更改,而不會允許使用來自 1.4.1.xxx 及以上的版本。如果要為多個匯入使用模式,則可以使用名稱指定該模式並多次使用。 在 Template Manifest 中使用一個新的標頭來指定命名的版本擴充套件模式。
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 模式將給出從提供的版本到但不包括下一個微版本的版本範圍。 還有一個使用內聯版本擴充套件模式定義的匯入,可以在同一模板中與命名模式一起使用。 內聯模式顯示了更不尋常的用法。 它將建立一個從(但不包括)提供的版本到(包括)具有相同 qualifier 的下一個次要版本的版本範圍。
透過一起使用這些技術,可以生成可靠的 manifests。 正確使用版本擴充套件將確保生成的 manifests 足夠嚴格以阻止不需要的連線,但又足夠靈活以允許進行小的更改。 編寫 Template Manifest 時,應針對每個相關 bundle 採取務實的方法,因為並非所有 bundle 都使用相同的方法進行版本控制。