为什么我的Atlassian Confluence requireResource包括不工作?

时间:2014-12-19 18:18:56

标签: velocity confluence

我正在使用Atlassian Confluence 5.3.4

我有一个Velocity模板,其中包含以下行:

#requireResource("com.mycompany.confluence.plugins.my-plugin:my-resources")

然后,在我的atlassian-plugin.xml文件中,我有以下部分:

<web-resource key="my-resources" name="My Resources">
    <resource type="download" name="stylesheet.css" location="templates/css/stylesheet.css"/>
    <resource type="download" name="JavaScript.js" location="templates/js/JavaScript.js"/>
</web-resource>

我的项目结构如下:

src/main/resources/templates/css/stylesheet.css
src/main/resources/templates/js/JavaScript.js

然而,当我编译我的插件并将其安装到Confluence时,没有任何作用。我的CSS无法渲染,浏览器无法找到我的JavaScript函数。我甚至无法在生成的HTML文件的标题中找到JavaScript和CSS声明。为什么这不起作用?

2 个答案:

答案 0 :(得分:3)

我知道这个问题已经有几个月了,但本周我使用Confluence 5.7.1遇到了同样的问题。

我的相似情况

我试图从Confluence servlet插件模块渲染Velocity模板(在我的atlassian-plugin.xml中声明)。我正在创建一个上下文来传递给模板,该模板只是一个新的HashMap并将自定义参数添加到它,然后渲染模板。下面的doGet中的Servlet代码:

Map<String, Object> contextMap = new HashMap<String, Object>();
contextMap.put("key1", "MyValue1");
contextMap.put("key2", "MyValue2");
VelocityUtils.writeRenderedTemplate(resp.getWriter(), /templates/myTemplate.vm", contextMap);

然而,这样做意味着没有必需的资源Velocimacro需要实际获取资源的WebResourceManager。

修复

这个问题的另一个答案是使用WebResourceManager,我可以看到它已被弃用。此修复程序使用捆绑在Confluence JAR中的非弃用类,这些类已经是插件的一部分。

使用MacroUtils.defaultVelocityContext().get("webResourceManager");,您可以获得com.atlassian.confluence.plugin.webresource.DefaultConfluenceWebResourceManager的实例。这就是在Confluence Macro插件中渲染Velocity模板用于允许#requireResource(...)工作的原因。

但是,更好的方法是通过创建类型为com.atlassian.confluence.plugin.webresource.ConfluenceWebResourceManager的实例变量(即接口)来使用依赖注入,然后在您正在使用的类的构造函数中设置它(首选V2插件)或在类中创建一个setter方法(用于V1插件),如:

public void setConfluenceWebResourceManager(ConfluenceWebResourceManager confluenceWebResourceManager) {
    this.confluenceWebResourceManager = confluenceWebResourceManager;
}

确保您为contextMap设置密钥的String类型,并为值设置Object类型,然后将confluenceWebResourceManager对象放入上下文地图中密钥为“webResourceManager”。

最终代码如下所示:

Map<String, Object> contextMap = new HashMap<String, Object>();
contextMap.put("key1", "MyValue1");
contextMap.put("key2", "MyValue2");
contextMap.put("webResourceManager", confluenceWebResourceManager);
VelocityUtils.writeRenderedTemplate(resp.getWriter(), /templates/myTemplate.vm", contextMap);

这样可以正确使用我的资源。

答案 1 :(得分:0)

我也遇到了这个问题。 我有两个解决方案:

第一个解决方案,使用直接链接:(你必须传递$ baseUrl或使用现有的webAction,我不记得确切)

<script src="$baseUrl/download/resources/com.mycompany.confluence.plugins.my-plugin:my-resources/JavaScript.js"></script>

第二个解决方案,使用WebResourceManager

$!webResourceManager.requireResource("com.dasannetworks.vn.atlasplugins.ditto-cost-center:my-web-resources")

使用$ webResourceManager从控制器传递,如下所示:

WebResourceManager webResourceManager = ComponentAccessor.getWebResourceManager();