代码之家  ›  专栏  ›  技术社区  ›  mcherm

如何使Jetty动态加载“静态”页面

  •  28
  • mcherm  · 技术社区  · 16 年前

    Jetty maven plugin

    只有一件事让我远离涅盘。我的src/main/webapp目录中有javascript和css文件,Jetty刚刚提供了这些文件。我想能够编辑

    10 回复  |  直到 16 年前
        1
  •  18
  •   Ahmed Ashour chim    4 年前

    Jetty使用内存映射文件来缓冲静态内容,这会导致文件在Windows中锁定。尝试设置 useFileMappedBuffer DefaultServlet false .

    Troubleshooting Locked files on Windows (from the Jetty wiki) 有指示。

        2
  •  16
  •   kybernetikos    13 年前

    你会在网上找到许多建议,包括

    或者重写WebAppContext,或者为init参数使用完全限定的名称。这些建议都不适用于我(使用Jetty 7.2.2)。部分问题是需要在WebAppContext用于服务静态文件的servlet上设置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();
    
        3
  •  10
  •   FUD    12 年前

    this 帖子非常有用,简而言之,只需将配置更改为

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

        4
  •  7
  •   Julien Kronegg    9 年前

    Jetty 9.2 documentation 给出了一个Jetty嵌入式示例,该示例使用 ResourceHandler

    // 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(内存文件映射),因此 locks files on Windows operating systems . 这是一个已知的问题,可以为servlet找到许多解决方法。

    但是,由于此示例不依赖servlet,因此基于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 Integer.MAX_VALUE .

        5
  •  5
  •   Jakub Torbicki    11 年前

    在webdefault.xml中将false设置为useFileMappedBuffer没有 幸运的是,将maxCachedFiles设置为0(也在webdefault.xml中)成功了。

        6
  •  5
  •   Ahmed Ashour chim    4 年前

    我也有这个问题。

    我不想创建任何额外的类,也不想弄乱web.xml

    下面是你能做的:

    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. 这是您的jetty配置:

      <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上下文添加一个属性,该属性将禁用静态资源锁定。

    玩得开心:)

        7
  •  4
  •   Johannes Brodwall    10 年前

    // Startup stuff
    final Server server = new Server(port);
    WebAppContext webAppContext = new WebAppContext(path, "/")
    webAppContext.setInitParam(
            "org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
    
    server.setHandler(webAppContext);
    server.start();
    server.join();
    

    DefaultServlet将查找自己的useFileMappedBuffer副本,该副本似乎设置在Jetty的深处。但是,通过在属性名称前面加上如上所述的前缀,此值是首选值。

        8
  •  0
  •   David Roussel    11 年前

    使用嵌入式Jetty 8.1.10时,“useFileMappedBuffer=false”设置在任何模式下都不起作用。我读了你的密码 DefaultServlet ,它读取属性,但不用于任何用途。

    SelectChannelConnector 以获得继续的好处,但不锁定windows上的文件。如果你只是使用 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);
        }
    }
    

    我已经测试了这个锁定问题,它解决了这个问题。我还没有测试它是否能与Continuations一起工作。

        9
  •  -1
  •   Wojtek    9 年前

    将IntelliJ和Jetty 9与ResourceHandler一起使用时,解决方案之一是编辑目标目录中的静态内容,而不是源文件。

        10
  •  -16
  •   anjanb    16 年前

    执行此操作之前,请删除所有internet临时文件。