2010-12-16 11 views
4

Ich habe ein paar verschiedene Projekte, die im Grunde die gleiche Javascript/CSS und Layout-Vorlage verwenden. Ich möchte das alles in mein Tapisserie-Common-Lib-Projekt verschieben und es von dort referenzieren.Tapisserie Layouts und Komponentenbibliotheken

Ich habe andere gemeinsame Komponenten in meinem Tapisserie-common-lib, aber kann nicht scheinen, um das Layout zu bekommen richtig zu arbeiten.

In meinem Tapisserie-common-lib-Projekt habe ich eine CommonLayout.java in com.company.tapestrylib.components und eine CommonLayout.tml Datei unter com/company/tapestrylib/components.

Ich versuche, die CommonLayout bilden ein weiteres Projekt in meinem Index.tml wie so zu verweisen:

<t:commonlayout xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> 
</t:commonlayout> 

Jedes Mal, wenn ich die Seite zugreifen erhalte ich eine

Unable to resolve 'commonlayout' to a component class name. 

Kann ich dies tun ? Kann ich alle meine gemeinsamen CSS und JavaScript in meinem Tapisserie-common-lib jar und verweisen auch solche, von dort zum Beispiel mit: auf das Erstellen von benutzerdefinierten

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

Ich habe mir um und haben viele Artikel gefunden Komponenten und Komponentenbibliotheken, aber keine, die Layouts wiederverwenden, wie ich es versuche.

UPDATE:

Ich bin derzeit andere abstrakte Komponenten aus meiner Komponentenbibliothek. Diese sind in [root] .tapestrylib.base gespeichert.

Ich versuche, mein gemeinsames Layout (Layout.java und Layout.tml) in [root] .tapestrylib.components zu speichern. Wenn zu diesem Layout von meinem anderen Projekt zu beziehen versucht, erhalte ich ein

Unable to resolve 'layout' to a component class name. 

Ich versuche, es zu benutzen, wie so:

<html t:type="tapestry-lib/layout" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter"> 
</html> 

Dieser Teil der tatsächlichen Ausnahme ist erhalte ich:

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) 

Antwort

4

Layout oder Nicht-Layout-Komponente sollte keinen Unterschied machen.

Sind irgendwelche Komponenten aus Ihrer Bibliothek verfügbar? (Der vollständige Fehlerbericht [tapestry.production-mode=false] gibt Ihnen eine Liste der verfügbaren Komponenten.) Wenn nicht, ist Ihre Bibliothek wahrscheinlich nicht richtig eingerichtet.

Tapestry findet Komponentenbibliotheken durch Scannen der Manifestdateien aller JARs im Klassenpfad für einen Eintrag mit dem Namen Tapestry-Module-Classes und lädt die Komponentenmodulkonfiguration von dort. Überprüfen Sie, ob der META-INF/MANIFEST.MF in Ihrem JAR einen solchen Eintrag enthält und ob er auf die korrekte Komponentenmodulklasse verweist.

Die component library section in the Tapestry docs zeigt, wie Sie Maven einrichten, um einen solchen Eintrag automatisch zu erstellen.

Edit:

Die Komponenten im Paket sein müssen, die Sie für sie in Ihrem Modul Klasse konfiguriert:

public class MyTapestryComponentsModule { 

    public static void contributeComponentClassResolver(
      Configuration<LibraryMapping> configuration) { 
     configuration.add(
      new LibraryMapping("myprefix", "my.tapestry.basepackage")); 
    } 

} 

So alle Komponenten in my.tapestry.basepackage.components gehen würde, Mixins in my.tapestry.basepackage.mixins, etc ., genau wie in deiner Haupt-App.

Um die Komponenten aus Ihrer Bibliothek verwenden, können Sie sie nur das Präfix mit dem, was Sie definiert:

<div t:type="myprefix/MyComponent" ... /> 

Edit 2:

Okay, das sieht gut aus. Was wirklich nützlich ist, ist die Liste der verfügbaren Komponenten Tapestry-Protokolle beim Start. Es befindet sich direkt über der Liste der Dienste, die nach dem Start zuletzt gedruckt werden, und sollte wie folgt aussehen:

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. 

Ihre Komponenten dort mit ihren vollständigen Namen und Präfix auftauchen sollte. Tun sie?

+0

Überprüfen Sie auch, welche verfügbaren Komponenten Sie bei Ihrer Web-App-Start haben. Das Protokoll sollte eine Liste aller verfügbaren - Kern und von jeder Komponente Bibliotheken, die Sie richtig eingerichtet haben enthalten. – bbcooper

+0

Ich habe das alles überprüft und ich habe es richtig konfiguriert, da ich ein paar allgemeine abstrakte Basiskomponenten aus meiner Komponentenbibliothek verwende. Vielleicht platziere ich das gemeinsame Layout an der falschen Stelle? Ich habe es in meinem Paket "tapestrylib.components". – Casey

+0

@Casey: Eine funktionierende Basisklasse bedeutet lediglich, dass sich die JAR im Klassenpfad befindet und nicht, dass Ihre Komponentenbibliothek konfiguriert ist. Was hast du überprüft? Sind die Komponenten in Ihrer Anwendung verfügbar? (Eine vollständige Liste der geladenen Komponenten finden Sie auf der Fehlerberichtsseite oder der Protokollausgabe beim Start.) Wenn nicht: Verfügen Sie über eine Komponentenmodulklasse und konfigurieren Sie das richtige Basispaket für Ihr Modul? (Siehe Bearbeiten.) Wenn ja: Enthält Ihre Manifestdatei einen Verweis auf diese Komponentenklasse? Wenn ja: Sagt die Protokollausgabe beim Start irgendetwas über eine fehlerhafte Komponentenbibliothek aus? – Henning