我正在使用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声明。为什么这不起作用?
答案 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();