8

プロパティプレースホルダーを解決する必要があるXMLファイル(urlrewrite.xml)があります。これを実現するために、Mavenフィルタリングを有効にします。これは、アセンブルされたWARファイルに対して正常に機能します。

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>

問題は、maven jetty:runのように、maven-jetty-plugin(Maven Jettyプラグイン)を使用して開発モードでアプリケーションを実行しようとした場合です。

問題のファイルurlrewrite.xmlはsrc/main / resourcesディレクトリにあるため、最終的に/ WEB-INF / classes(またはmaven jetty:runの場合はtarget / classes)になります。

URLRewriteFilter構成は、構成ファイルの場所を次のように指定します。

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    <init-param>
        <param-name>confPath</param-name>
        <param-value>/WEB-INF/classes/urlrewrite.xml</param-value>
    </init-param>
</filter>

これは展開時に機能します。ただし、jetty mavenプラグインを使用すると、URLRewriteは構成ファイルをロードするためにcontext.getResourceAsString( "/ WEB-INF / classes / urlrewrite.xml")を使用するため、NullPointerExceptionで終了します。Jettyは、ワークスペースからアプリケーションを実行すると/ WEB-INF / classes/...をsrc/main / webapp / WEB-INF / ...に解決するため、これに対してnullを返します。WARがまだアセンブルされていないため、ファイルはそこに存在しません。代わりに、target / classes/urlrewrite.xmlからリソースをプルする必要があります。

それがわかりにくい場合は、回避策を見つけるためにJettyの第一人者である必要があると思われるため、おそらくこの質問に答えることはできません(ヒント:それは挑戦です!)。

誰かがこれを回避する方法を知っていますか?また、アベイルズを知るために次の回避策を試しました。

  1. urlrewrite.xmlを新しいディレクトリsrc/main / webResourcesの下に置き、それをmaven warプラグイン<webReources>に追加して、フィルタリングを有効にします。これにより、WARがパッケージ化されたときにその内容が適切な場所にコピーされますが、jetty:runで使用できるようにはなりません。
  2. 思い出せない他のハック...(覚えていれば更新されます)

要約すると、maven-jetty-pluginは、maven jetty:runコマンドで使用できるようにするために、ファイルがsrc / main / resources /webapp/挿入パスとファイル名の下にある必要があります...

助けてくれてありがとう...

よろしくお願いいたします。ロイドフォース

4

4 に答える 4

12

私自身の質問に答えました。

  1. maven-jetty-pluginを少なくとも6.1.12にアップグレードします

  2. 「複数のWebAppソースディレクトリの構成」に関するこのWikiページを参照してください(jetty-6.1.12.rc2およびjetty-7.0.0pre3以降で使用可能)

  3. pom.xmlに魔法を追加します。

まず、フィルタリングされたWebリソース用の新しいディレクトリ(src / main / webResources)を追加し、<resource>要素を追加します。

        <resource>
            <directory>src/main/webResources</directory>
            <filtering>true</filtering>
            <targetPath>../jettyFilteredResources</targetPath>
        </resource>

これにより、ファイルがtarget / jettyFilteredResourcesにコピーされます(これについては後で参照します)。このディレクトリはパッケージ化されたWARファイルにコピーされません。これは突堤専用です。

次の要素をmaven-war-plugin<configuration>要素に追加します。

                <webResources>
                    <resource>
                        <directory>src/main/webResources</directory>
                        <filtering>true</filtering>
                    </resource>
                </webResources>

これにより、すべてが実際のWARファイル用にパッケージ化されます。

最後に、<baseResource>要素に次のスニペットを追加して、特にコピーしたリソースを使用するようにjettyに指示します。

<baseResource implementation="org.mortbay.resource.ResourceCollection">                        
    <resourcesAsCSV>src/main/webapp,target/jettyFilteredResources</resourcesAsCSV>
</baseResource>

これですべてが機能します!(まあ、技術的にはまだ本番WARをテストしていませんが、...何とか...それも機能するはずです)。

誰かがより良い答えを持っているなら、私は答えが妥当な時間(例えば1日)で提供されればそれを受け入れます。

于 2011-09-19T19:23:17.657 に答える
3

私はこの他の質問の答えがより良いと思います:

jetty:runを使用するときにリソースフィルターを実行する

基本的に、「mvn jetty:run」を実行する代わりに、「mvn jetty:run-exploded」を使用する必要があります。

唯一の欠点は、WARファイルをビルドする必要があることです。これは、場合によってはコストがかかる可能性があります。それがあなたにとって問題ではないなら、私はそれがより良いと思います。

于 2012-09-10T21:38:38.223 に答える
2

これをpom.xmlに追加します。

    <resources>
        <resource>
            <directory>src/main/webapp/WEB-INF</directory>
            <filtering>true</filtering>
            <targetPath>../jettyFilteredResources</targetPath>
        </resource>
    </resources>

組み込みのJettyサーバーは次のようになります。

        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.1.3.v20140225</version>
            <configuration>
                <webAppConfig>
                    <descriptor>target/jettyFilteredResources/web.xml</descriptor>
                </webAppConfig>
                <scanIntervalSeconds>3</scanIntervalSeconds>
            </configuration>
        </plugin>

woila!インスピレーションを与えてくれた@les2に感謝します;-)

于 2014-07-08T09:30:21.703 に答える
0

私は別の方法を見つけました。

プロジェクトをビルドし、ターゲットフォルダーを追加のクラスパスとして追加します。

<webAppConfig>
    ....
    <extraClasspath>${basedir}/target/mywebapp</extraClasspath>
    ....
</webAppConfig>
于 2014-10-02T13:10:18.400 に答える