Bundlor 版本擴充套件和屬性替換

工程 | Christopher Frost | 2009 年 5 月 12 日 | ...

簡介

最近,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 指定屬性

要將屬性從 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 指定屬性

從 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 都使用相同的方法進行版本控制。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

搶佔先機

VMware 提供培訓和認證,以加速您的進步。

瞭解更多

獲取支援

Tanzu Spring 在一個簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部