编写模块
您可以定义全局或特定于主题的包含主题模块的添加项,此主题模块通过主题概要文件适用于不同的作用域。模块使用 plugin.xml 或 JSON 文件定义其添加项。
- 系统模块
- 通过使用 plugin.xml 文件作为门户网站类路径中的压缩文件或 Web 模块的组成部分,或者作为 Web 模块的 WEB-INF 目录中的单一文件,可用于系统中所有主题。必须在主题模块的扩展点 com.ibm.portal.resourceaggregator.module 中声明主题模块。
- 特定于主题的模块
- 此模块只能由在其 contributions 文件夹中的 JSON 文件中对其进行定义的主题引用。Contributions 文件夹是缺省文件夹,但可以通过在主题上设置 resourceaggregation.contributions.folder 元数据来更改位置,这与 profiles 一样。这些文件由系统进行自动扫描,并且为主题注册的添加项。
- XML 模式
下图描述了此扩展点的 XML 模式:

以下代码是 plugin.xml 文件的示例,在此示例中,模块部署在具有上下文根 res:{war:context-root}/ 的 Web 应用程序中。
<extension point="com.ibm.portal.resourceaggregator.module" id="testModuleExtension1">
<module id="testModule1" version="1.0">
<capability id="capabilityA" value="1.0.0"/>
<capability id="capabilityB" value="1.5"/>
<prereq id="testModuleA"/>
<prereq id="testModuleB" minVersion="1.2.3.4"/>
<prereq id="testModuleC" type="optional"/>
<title lang="en" value="en Module"/>
<title lang="de" value="de Module"/>
<title lang="es" value="es Module"/>
<description lang="en" value="one two three"/>
<description lang="de" value="ein zwei drei"/>
<description lang="es" value="uno dos tres"/>
<contribution type="head">
<sub-contribution type="css">
<uri value="res:{war:context-root}/css/helloWorld.css" />
<!-- define alternate styles for right to left -->
<uri type="rtl" value="res:{war:context-root}/css/helloWorld_rtl.css" />
<!-- define alternate styles for an iPad -->
<uri deviceClass="tablet+iOS" value="res:{war:context-root}/css/helloWorld_iPad.css" />
</sub-contribution>
<sub-contribution type="js">
<uri value="res:{war:context-root}/js/helloWorldHead.js" />
</sub-contribution>
<sub-contribution type="markup">
<uri value="res:{war:context-root}/markup/helloWorldHead.html" />
</sub-contribution>
</contribution>
<contribution type="config">
<sub-contribution type="js">
<uri value="res:{war:context-root}/js/helloWorldBody_root.js" />
<!-- define alternate js for when the Portal is using different languages -->
<uri lang="en" value="res:{war:context-root}/js/helloWorldBody_en.js" />
<uri lang="de" value="res:{war:context-root}/js/helloWorldBody_de.js" />
<uri lang="es" value="res:{war:context-root}/js/helloWorldBody_es.js" />
<!-- define alternate js for debugging purposes in LTR and RTL environments -->
<uri type="debug" value="res:{war:context-root}/js/helloWorldBody_debug.js" />
<uri type="debug,rtl" value="res:{war:context-root}/js/helloWorldBody_debug_rtl.js" />
</sub-contribution>
<sub-contribution type="config_dynamic">
<uri value="res:{war:context-root}/jsp/helloWorldBodyConfig.jsp" />
</sub-contribution>
<sub-contribution type="config_static">
<uri value="res:{war:context-root}/jsp/helloWorldBodyStatic.jsp" />
</sub-contribution>
</contribution>
<contribution type="menu">
<sub-contribution type="json">
<uri value="res:{war:context-root}/js/helloWorld.json" />
</sub-contribution>
</contribution>
<contribution type="dyn-cs">
<sub-contribution type="markup" ref-id="some_dynamic_spot_id">
<uri value="res:{war:context-root}/jsp/helloWorldDynamicSpot.jsp" />
</sub-contribution>
</contribution>
<moduleActivation extensionID="com.ibm.portal.resourceaggregator.util.ResourceEnvironmentProviderModuleActivationHandler">
<parameter name="rep" value="RESOURCE_ENV_PROVIDER_NAME" />
<parameter name="key" value="KEY_IN_RESOURCE_ENV_PROVIDER"/>
</moduleActivation>
<runtimeActivation>
<condition deviceClass="tablet"/>
</runtimeActivation>
</module>
</extension>
<extension point="com.ibm.portal.resourceaggregator.module" id="testModuleExtension2">
<module id="testModule2" version="1.0">
<!-- Some other module... -->
</module>
</extension>
<extension point="com.ibm.portal.resourceaggregator.module" id="testModuleExtension3">
<module id="testModule3" version="1.0">
<!-- One last module... -->
</module>
</extension>
以下代码是 myModules.json 文件的一个示例,此文件存储在主题的 contributions 文件夹中。使用以下规则调整在 plugin.xml 文件中使用的结构、键和值以符合 JSON 格式。
- 允许在同一个级别中有多个子条目的键以复数形式使用。例如,prereq 变成 prereqs,capability 变成 capabilities。
- 文件路径以正斜杠开头,且解析为相对于主题根文件夹。
- 无法在 WebDAV 外部处理 JSP 文件。所有相对于主题根的资源必须为静态类型(例如,js、CSS 或 HTML)。
{
"modules":[{
"id":"testModule1",
"version":"1.0",
"capabilities":[{
"id":"capabilityA",
"value":"1.0.0"
},
{
"id":"capabilityB",
"value":"1.5"
}
],
"prereqs":[{
"id":"testModuleA"
},
{
"id":"testModuleB",
"minVersion":"1.2.3.4"
},
{
"id":"testModuleC",
"type":"optional"
}
],
"titles":[{
"lang":"en",
"value":"en Module"
},
{
"lang":"de",
"value":"de Module"
},
{
"lang":"es",
"value":"es Module"
}
],
"descriptions":[{
"lang":"en",
"value":"one two three"
},
{
"lang":"de",
"value":"ein zwei drei"
},
{
"lang":"es",
"value":"uno dos tres"
}
],
"contributions":[{
"type":"head",
"sub-contributions":[{
"type":"css",
"uris":[{
"value":"/css/helloWorld.css"
},
// define alternate styles for right to left
{
"value":"/css/helloWorld_rtl.css",
"type":"rtl"
},
// define alternate styles for an iPad
{
"value":"/css/helloWorld_iPad.css",
"deviceClass":"tablet+iOS"
}]
},
{
"type":"js",
"uris":[{
"value":"/js/helloWorldHead.js"
}]
},
{
"type":"markup",
"uris":[{
"value":"/markup/helloWorldHead.html"
}]
}]
},{
"type":"config",
"sub-contributions":[{
"type":"js",
"uris":[{
"value":"/js/helloWorldBody_root.js"
},
// define alternate js for when the Portal is using different languages
{
"value":"/js/helloWorldBody_en.js",
"lang":"en"
},
{
"value":"/js/helloWorldBody_de.js",
"lang":"de"
},
{
"value":"/js/helloWorldBody_es.js",
"lang":"es"
},
// define alternate js for debugging purposes in LTR and RTL environments
{
"value":"/js/helloWorldBody_debug.js",
"type":"debug"
},
{
"value":"/js/helloWorldBody_debug_rtl.js",
"type":"debug,rtl"
}]
},
{
"type":"config_dynamic",
"uris":[{
"value":"/config/helloWorldBodyConfig.js"
}]
},
{
"type":"config_static",
"uris":[{
"value":"/config/helloWorldBodyStatic.js"
}]
}]
},{
"type":"menu",
"sub-contribution":[{
"type":"json",
"uris":[{
"value":"/js/helloWorld.json"
}]
}]
},{
"type":"dyn-cs",
"sub-contribution":[{
"type":"markup",
"ref-id":"some_dynamic_spot_id",
"uris":[{
"value":"/html/helloWorldDynamicSpot.html"
}]
}]
}],
"moduleActivation":{
"extensionID":"com.ibm.portal.resourceaggregator.util.ResourceEnvironmentProviderModuleActivationHandler",
"parameters":[{
"name":"rep",
"value":"RESOURCE_ENV_PROVIDER_NAME"
},
{
"name":"key",
"value":"KEY_IN_RESOURCE_ENV_PROVIDER"
}]
},
"runtimeActivation":[{
"condition":{
"deviceClass":"tablet"
}
}]
},{
"id":"testModule2",
"version":"1.0"
// Some other module...
},{
"id":"testModule3",
"version":"1.0"
// One last module...
}]
}
Web 模块的添加项 URI
- {war:context-root}
- 此变量访存包含的 WAR 文件的上下文根,并将其插入相应位置。它只对定义为 WAR 文件的一部分的模块有效。这不适用于 WebDAV 中定义的模块,或类装入层次结构中的其他某个位置(例如,共享应用程序)。