我有一些基本上使用相同的javascript / css和布局模板的不同项目。我想把所有这些都移到我的tapestry-common-lib项目中并从那里引用它。
我的tapestry-common-lib中有其他常见组件,但似乎无法使布局正常工作。
在我的tapestry-common-lib项目中,我在com.company.tapestrylib.components
中有一个CommonLayout.java
和一个CommonLayout.tml文件
com/company/tapestrylib/components
。
我试图在我的Index.tml中引用CommonLayout表单中的另一个项目,如下所示:
<t:commonlayout xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
</t:commonlayout>
然而,每当我访问该页面时,我都会得到一个
Unable to resolve 'commonlayout' to a component class name.
我可以这样做吗?我是否也可以将所有常见的CSS和javascript放入我的tapestry-common-lib jar中,并使用例如来自那里的那些:
<script type="text/javascript" src="${asset:context:/js/jquery-1.4.2.js}"></script>
我一直在环顾四周,发现了很多关于创建自定义组件和组件库的文章,但没有重复使用像我正在尝试的布局。
更新:
我目前正在使用组件库中的其他抽象组件。它们存储在[root] .tapestrylib.base。
中我试图在[root] .tapestrylib.components中存储我的公共布局(Layout.java和Layout.tml)。当我试图从我的其他项目中引用这个布局时,我得到了一个
Unable to resolve 'layout' to a component class name.
我试图像这样使用它:
<html t:type="tapestry-lib/layout" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter">
</html>
这是我得到的实际例外的一部分:
11:28:01 ERROR RequestExceptionHandler - Processing of request failed with uncaught exception: Unable to resolve 'tapestry-lib/layout' to a component class name.
org.apache.tapestry5.ioc.internal.OperationException: Unable to resolve 'tapestry-lib/layout' to a component class name. [at classpath:com/mycompany/webapp/pages/Index.tml, line 1]
at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.logAndRethrow(OperationTrackerImpl.java:102)
at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:69)
at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1057)
at org.apache.tapestry5.internal.pageload.PageLoaderImpl.createAssembler(PageLoaderImpl.java:218)
at org.apache.tapestry5.internal.pageload.PageLoaderImpl.getAssembler(PageLoaderImpl.java:208)
at org.apache.tapestry5.internal.pageload.PageLoaderImpl$3.invoke(PageLoaderImpl.java:180)
at org.apache.tapestry5.internal.pageload.PageLoaderImpl$3.invoke(PageLoaderImpl.java:174)
at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:65)
at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1057)
at org.apache.tapestry5.internal.pageload.PageLoaderImpl.loadPage(PageLoaderImpl.java:173)
at $PageLoader_12d045be613.loadPage($PageLoader_12d045be613.java)
答案 0 :(得分:4)
布局或非布局组件不应该有所作为。
您图书馆的任何组件是否可用? (完整的错误报告[tapestry.production-mode=false
]为您提供了可用组件的列表。)如果没有,您的库可能没有正确设置。
Tapestry通过扫描类路径上所有JAR的清单文件来查找组件库,以查找名为Tapestry-Module-Classes
的条目,并从那里加载组件模块配置。检查JAR中的META-INF/MANIFEST.MF
是否有这样的条目,以及它是否引用了正确的组件模块类。
component library section in the Tapestry docs显示如何设置Maven以自动创建此类条目。
编辑:
组件需要位于模块类中为它们配置的包中:
public class MyTapestryComponentsModule {
public static void contributeComponentClassResolver(
Configuration<LibraryMapping> configuration) {
configuration.add(
new LibraryMapping("myprefix", "my.tapestry.basepackage"));
}
}
因此,任何组件都会进入my.tapestry.basepackage.components
,混合到my.tapestry.basepackage.mixins
等,就像在您的主应用中一样。
要使用库中的组件,只需在其前面加上您定义的内容:
<div t:type="myprefix/MyComponent" ... />
编辑2:
好的,看起来很好。真正有用的是启动时Tapestry日志的可用组件列表。它位于启动后最后打印的服务列表的正上方,应如下所示:
2010-12-20 20:27:07,663 [main] INFO org.apache.tapestry5.services.TapestryModule.ComponentClassResolver - Available components:
ActionLink: org.apache.tapestry5.corelib.components.ActionLink
AddRowLink: org.apache.tapestry5.corelib.components.AddRowLink
etc.
您的组件应以其全名和前缀显示在那里。他们呢?