макеты гобеленов и библиотеки компонентов - PullRequest
4 голосов
/ 16 декабря 2010

У меня есть несколько разных проектов, которые в основном используют один и тот же javascript / css и шаблон макета. Я хочу перенести все это в мой проект tapestry-common-lib и ссылаться на него оттуда.

У меня есть другие общие компоненты в моем tapestry-common-lib, но, похоже, не получается заставить макет работать должным образом.

В моем проекте tapestry-common-lib у меня есть CommonLayout.java в com.company.tapestrylib.components и файл CommonLayout.tml под com/company/tapestrylib/components.

Я пытаюсь сослаться на форму CommonLayout на другой проект в моем Index.tml следующим образом:

<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 в jar-файл tapestry-common-lib и сослаться на них, используя, например:

<script type="text/javascript" src="${asset:context:/js/jquery-1.4.2.js}"></script>

Я осматривался и нашел множество статей о создании пользовательских компонентов и библиотек компонентов, но ни одна из них не использовала макеты так, как я пытаюсь.

UPDATE:

В настоящее время я использую другие абстрактные компоненты из моей библиотеки компонентов. Они хранятся в [root] .tapestrylib.base.

Я пытаюсь сохранить мой общий макет (Layout.java и Layout.tml) в [root] .tapestrylib.components. При попытке обратиться к этому макету из моего другого проекта, я получаю

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)

1 Ответ

4 голосов
/ 17 декабря 2010

Компонент макета или не макета не должен иметь значения.

Доступны ли какие-либо компоненты из вашей библиотеки?(Полный отчет об ошибке [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"));
   }

}

Таким образом, любые компоненты будут добавляться в 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.

Ваши компоненты должны отображаться там с полным именем и префиксом.Есть ли они?

...