我有几个不同的项目,它们基本上使用相同的 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>
Run Code Online (Sandbox Code Playgroud)
但是,每当我访问该页面时,我都会得到一个
Unable to resolve 'commonlayout' to a component class name.
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?我还可以将所有常见的 css 和 javascript 放入我的tapestry-common-lib jar 中,并使用例如:
<script type="text/javascript" src="${asset:context:/js/jquery-1.4.2.js}"></script>
Run Code Online (Sandbox Code Playgroud)
我一直在环顾四周,发现了很多关于创建自定义组件和组件库的文章,但没有一篇文章像我试图做的那样重用布局。
更新:
我目前正在使用我的组件库中的其他抽象组件。这些存储在 [root].tapestrylib.base 中。
我正在尝试将我的通用布局(Layout.java 和 Layout.tml)存储在 [root].tapestrylib.components 中。尝试从我的其他项目中引用此布局时,我得到一个
Unable to resolve 'layout' to a component class name.
Run Code Online (Sandbox Code Playgroud)
我正在尝试像这样使用它:
<html t:type="tapestry-lib/layout" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter">
</html>
Run Code Online (Sandbox Code Playgroud)
这是我得到的实际异常的一部分:
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)
Run Code Online (Sandbox Code Playgroud)
布局或非布局组件不应该产生影响。
您的库中是否有可用的组件?(完整的错误报告 [ tapestry.production-mode=false] 为您提供了可用组件的列表。)如果没有,您的库可能未正确设置。
Tapestry 通过扫描类路径上所有 JAR 的清单文件来查找名为 的条目Tapestry-Module-Classes,并从那里加载组件模块配置。检查您的 JAR 中是否META-INF/MANIFEST.MF有这样的条目,以及它是否引用了正确的组件模块类。
Tapestry 文档中的组件库部分显示了如何设置 Maven 以自动创建此类条目。
编辑:
这些组件需要位于您在模块类中为其配置的包中:
public class MyTapestryComponentsModule {
public static void contributeComponentClassResolver(
Configuration<LibraryMapping> configuration) {
configuration.add(
new LibraryMapping("myprefix", "my.tapestry.basepackage"));
}
}
Run Code Online (Sandbox Code Playgroud)
因此,任何组件都会进入my.tapestry.basepackage.components、 mixinmy.tapestry.basepackage.mixins等,就像在主应用程序中一样。
要使用库中的组件,只需在它们前面加上您定义的任何内容即可:
<div t:type="myprefix/MyComponent" ... />
Run Code Online (Sandbox Code Playgroud)
编辑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.
Run Code Online (Sandbox Code Playgroud)
您的组件应该显示在那里,并带有它们的全名和前缀。他们吗?