2010-12-16 1 views
4

私は基本的に同じjavascript/CSSとレイアウトテンプレートを使用するいくつかの異なるプロジェクトを持っています。私はこれをすべて私のタペストリー共通プロジェクトに移してそこから参照したいと思います。タペストリーレイアウトとコンポーネントライブラリ

私のタペストリー共通ライブラリには他の共通コンポーネントがありますが、レイアウトが正しく動作するように見えません。私は com/company/tapestrylib/componentscom.company.tapestrylib.components でCommonLayout.javaとCommonLayout.tmlファイルを持っている私のタペストリー共通-libのプロジェクトで

私はそうのように私の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. 

を得るが、私はこれを行うことができます?私も自分のタペストリー共通-libのjarファイルに私の一般的なCSSやJavaScriptのすべてを入れて、例えば使用して、そこからそれらを参照することができます:私は周りを探してきたし、カスタムを作成する上での記事の多くを発見した

<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) 

答えて

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.mixinsmy.tapestry.basepackage.components、ミックスインに行くだろう、などあなたのメインアプリのように。

あなたのライブラリーからのコンポーネントを使用するには、あなたはちょうどあなたが定義したものは何でもそれらを接頭辞:

<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. 

あなたのコンポーネントが自分のフルネームと接頭辞でそこに表示されるはずです。彼らは?

+0

Webアプリケーションの起動時に使用可能なコンポーネントも確認してください。ログには、使用可能なすべてのもの、つまりコアと、適切に設定したコンポーネントライブラリのリストが含まれている必要があります。 – bbcooper

+0

私はこれをすべてチェックし、コンポーネントライブラリからいくつかの一般的な抽象基本コンポーネントを使用しているので、正しく構成されています。おそらく私は間違った場所に共通のレイアウトを配置していますか?私は私のtapestrylib.componentsパッケージにそれを持っています。 – Casey

+0

@Casey:作業基本クラスは、JARがクラスパス上にあり、コンポーネントlibが構成されていないことを意味します。あなたは何を確認しましたか?あなたのアプリケーションでコンポーネントを利用できますか? (ロードされたコンポーネントの完全なリストについては、エラー・レポート・ページまたは起動時のログ出力を参照してください)そうでない場合:コンポーネント・モジュール・クラスを持っていて、モジュール用の正しいベース・パッケージを構成していますか? (編集を参照)はいの場合:マニフェストファイルにそのコンポーネントクラスへの参照が含まれていますか?はいの場合:起動時のログ出力で、失敗したコンポーネントlibについて何か言いますか? – Henning