28

私は Java Web アプリケーションを構築していますが、従来の「コード - コンパイル - デプロイ - テスト」サイクルが嫌いです。小さな変更を 1 つ入力すると、コンパイルやデプロイを行わなくても、すぐに結果が表示されます。

幸いなことに、Jettyはこれに最適です。純粋な Java Web サーバーです。ビルド ツリーから直接読み込む Jetty を起動できる、非常に優れたMaven プラグインが付属しています。war ファイルをパッケージ化したりデプロイしたりする必要はありません。scanInterval 設定もあります。これをゼロ以外の値にすると、Java ファイルとさまざまな構成ファイルの変更が監視され、変更を行った数秒後に自動的に再デプロイされます。

私を涅槃から遠ざけていることはただ一つ。src/main/webapp ディレクトリに javascript ファイルと css ファイルがあり、Jetty によって処理されます。これらを編集して、ブラウザでページを更新したときに変更が表示されるようにしたいと考えています。残念ながら、Jetty はこれらのファイルを開いたままにしておくため、(Windows 上で) 実行中にそれらを変更することはできません。

Jetty がこれらのファイルを手放して編集できるようにする方法を知っている人はいますか?

4

10 に答える 10

18

Jetty は、メモリ マップト ファイルを使用して静的コンテンツをバッファリングします。これにより、Windows でファイル ロックが発生します。を に設定useFileMappedBufferDefaultServletてみてくださいfalse

Windows でのロックされたファイルのトラブルシューティング (Jetty wiki から)に説明があります。

于 2008-10-09T02:13:56.730 に答える
16

上記の回答の 1 つは、xml で jetty を構成する場合に正確に当てはまりますが、このオプションをコードで (組み込みサーバー用に) 構成する場合、答えは異なり、そのページにはありません。

以下を含む多くの提案がオンラインで見つかります。

context.getInitParams().put("useFileMappedBuffer", "false");

または、WebAppContext をオーバーライドするか、init パラメーターに完全修飾名を使用します。これらの提案はどれもうまくいきませんでした (Jetty 7.2.2 を使用)。問題の一部は、コンテキストではなく、WebAppContext が静的ファイルを提供するために使用しているサーブレットで useFileMappedBuffer オプションを設定する必要があることでした。

最後に、単純な ServletContextHandler でこのようなことをしました

// Startup stuff
final Server server = new Server(port);
ServletContextHandler handler = new ServletContextHandler();
handler.setResourceBase(path);

SessionManager sm = new HashSessionManager();
SessionHandler sh = new SessionHandler(sm);
handler.setSessionHandler(sh);

DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holder = new ServletHolder(defaultServlet);
holder.setInitParameter("useFileMappedBuffer", "false");
handler.addServlet(holder, "/");

server.setHandler(handler);
server.start();
server.join();
于 2011-02-13T17:37:01.500 に答える
10

Although this is a Old problem but i found this post very helpful, in short just change your config to

            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <configuration>
                <connectors>
                    <connector implementation="org.eclipse.jetty.server.bio.SocketConnector">
                        <port>8080</port>
                    </connector>
                </connectors>
                </configuration>
            </plugin>

This disables the NIO support in Jetty ( but it should not be problem for debug puropse for simple cases ).

于 2012-06-12T20:34:41.480 に答える
7

Jetty 9.2 のドキュメントResourceHandlerには、サーブレットの代わりに を使用して静的ファイルを提供するための Jetty Embedded の例が示されています。

// Create a basic Jetty server object that will listen on port 8080.  Note that if you set this to port 0
// then a randomly available port will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases.
Server server = new Server(8080);

// Create the ResourceHandler. It is the object that will actually handle the request for a given file. It is
// a Jetty Handler object so it is suitable for chaining with other handlers as you will see in other examples.
ResourceHandler resource_handler = new ResourceHandler();
// Configure the ResourceHandler. Setting the resource base indicates where the files should be served out of.
// In this example it is the current directory but it can be configured to anything that the jvm has access to.
resource_handler.setDirectoriesListed(true);
resource_handler.setWelcomeFiles(new String[]{ "index.html" });
resource_handler.setResourceBase(".");

// Add the ResourceHandler to the server.
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
server.setHandler(handlers);

// Start things up! By using the server.join() the server thread will join with the current thread.
// See "http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join()" for more details.
server.start();
server.join();

Jetty は NIO (メモリ内ファイル マッピング) を使用するため、Windows オペレーティング システム上のファイルをロックします。これは既知の問題であり、サーブレットには多くの回避策があります。

ただし、この例はサーブレットに依存していないため、webapp パラメーター (useFileMappedBuffer、maxCachedFiles) に基づく関連する回答は機能しません。

メモリ内ファイル マッピングを防止するには、次の構成行を追加する必要があります。

resource_handler.setMinMemoryMappedContentLength(-1);

注: Javadoc に書かれているとおり (および nimrodm によって通知されます) : the minimum size in bytes of a file resource that will be served using a memory mapped buffer, or -1 for no memory mapped buffers. ただし、 value で同じ動作が得られましたInteger.MAX_VALUE

このパラメーターが設定されると、Jetty は Windows で静的ファイルを提供し、それらを編集することができます。

于 2015-05-21T20:45:29.580 に答える
5

私もこの問題を抱えていました。

そして、追加のクラスを作成したり、web.xmlをいじったりしたくありませんでした

したがって、ここでできることは次のとおりです。

あなたのプロジェクトがMavenベースで、(たとえば)「my-web-app」と呼ばれていると仮定します

  1. ファイルを作成するmy-web-app/jetty/jetty-config.xml

  2. このものを中に入れます:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configure class="org.eclipse.jetty.webapp.WebAppContext">
       <Call name="setInitParameter">
         <Arg>org.eclipse.jetty.servlet.Default.useFileMappedBuffer</Arg>
         <Arg>false</Arg>
       </Call>
    </Configure>
    
  3. 桟橋の設定は次のとおりです。

    <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <configuration>
            <httpConnector>
                <host>localhost</host>
                <port>8801</port>
            </httpConnector>
            <webApp>
                <contextPath>/${project.artifactId}</contextPath>
            </webApp>
            <contextXml>${project.basedir}/jetty/jetty-config.xml</contextXml>
        </configuration>
    </plugin>
    

このソリューションは、静的リソースのロックを無効にする属性を servlet-context に追加します。

楽しむ :)

于 2016-03-08T09:02:22.633 に答える
0

組み込みの Jetty 8.1.10 を使用する場合、「useFileMappedBuffer=false」設定はどのモードでも機能しません。のコードをDefaultServlet読み、プロパティを読み取りますが、何にも使用されません。

代わりに、バッファーの作成が構成されている場所を調べたところ、サブクラス化SelectChannelConnectorして継続の利点を得ることができましたが、ウィンドウでファイルをロックする必要はありませんでした。をそのまま使用するorg.mortbay.jetty.bio.SocketConnectorと、継続サポートが得られません。

これが私の例です:

import org.eclipse.jetty.io.Buffers.Type;
import org.eclipse.jetty.server.nio.SelectChannelConnector;

/**
 * A Connector that has the advantages NIO, but doesn't lock files in Windows by
 * avoiding memory mapped buffers.
 * <p> 
 * It used to be that you could avoid this problem by setting "useFileMappedBuffer" as described in 
 * http://stackoverflow.com/questions/184312/how-to-make-jetty-dynamically-load-static-pages
 * However that approach doesn't seem to work in newer versions of jetty.
 * 
 * @author David Roussel
 * 
 */
public class SelectChannelConnectorNonLocking extends SelectChannelConnector {

    public SelectChannelConnectorNonLocking() {
        super();

        // Override AbstractNIOConnector and use all indirect buffers
        _buffers.setRequestBufferType(Type.INDIRECT);
        _buffers.setRequestHeaderType(Type.INDIRECT);
        _buffers.setResponseBufferType(Type.INDIRECT);
        _buffers.setResponseHeaderType(Type.INDIRECT);
    }
}

ロックの問題についてこれをテストしたところ、問題が修正されました。継続で動作することはまだテストしていません。

于 2013-04-26T11:30:28.167 に答える
-16

おそらくそれを保持しているのはブラウザです。

IE内:ツール| インターネットオプション| [インターネット一時ファイル]>[設定]で、[ページにアクセスするたびに]ラジオボタンをクリックします。OKを押します。

その前に、インターネット一時ファイルをすべて削除してください。

于 2008-10-08T19:44:02.430 に答える