[SPRING] Jetty가 "정적"페이지를 동적으로로드하도록 만드는 방법
SPRINGJetty가 "정적"페이지를 동적으로로드하도록 만드는 방법
Java 웹 응용 프로그램을 구축하고 있으며 기존의 "코드 컴파일 배포 테스트"주기가 싫습니다. 하나의 작은 변경을 입력하고 결과를 즉시보고 컴파일하고 배포 할 필요가 없습니다.
다행히도, 부두는 이것에 아주 좋습니다. 그것은 순수 자바 웹 서버입니다. 그것은 빌드 파일에서 직접 Jetty를 읽을 수있게 해주는 정말 멋진 Maven 플러그인과 함께 제공됩니다 - war 파일을 패키지하거나 deploy 할 필요가 없습니다. 심지어 scanInterval 설정도 있습니다.이 값을 0이 아닌 값으로 설정하면 Java 파일 및 변경 사항에 대한 다양한 구성 파일을보고 변경 한 후 자동으로 다시 배포합니다.
너바나에서 나를 지켜주는 것은 한 가지 뿐이야. 내 src / main / webapp 디렉토리에 javty와 css 파일이 있고 방금 Jetty가 제공합니다. 브라우저에서 페이지를 새로 고침 할 때이를 편집하고 변경 사항을 표시 할 수있게하고 싶습니다. 불행하게도, Jetty는이 파일들을 열어 두어 실행 중일 때 (Windows에서) 수정할 수 없습니다.
누구든지 Jetty가이 파일을 보내어 편집 할 수있게 한 다음 후속 요청에 대해 편집 된 파일을 제공하는 방법을 알고 있습니까?
해결법
-
==============================
1.Jetty는 메모리 맵 파일을 사용하여 정적 내용을 버퍼링합니다. 이로 인해 Windows에서 파일 잠금이 발생합니다. DefaultServlet에 useFileMappedBuffer를 false로 설정해보십시오.
Jetty는 메모리 맵 파일을 사용하여 정적 내용을 버퍼링합니다. 이로 인해 Windows에서 파일 잠금이 발생합니다. DefaultServlet에 useFileMappedBuffer를 false로 설정해보십시오.
문제 해결 Windows의 잠긴 파일 (Jetty 위키에 있음)에 대한 지침이 있습니다.
-
==============================
2.위의 대답 중 하나가 xml으로 jetty를 구성하는 것이 옳은 반면 임베디드 서버의 경우 코드에서이 옵션을 구성하려면 해당 페이지에서 답변이 다르거 나 찾을 수 없습니다.
위의 대답 중 하나가 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();
-
==============================
3.이것은 오래된 문제이지만이 게시물은 매우 유용하다는 것을 알았습니다.
이것은 오래된 문제이지만이 게시물은 매우 유용하다는 것을 알았습니다.
<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>
이렇게하면 Jetty에서 NIO 지원을 사용할 수 없게됩니다 (단, 간단한 경우 debug puropse에 문제가 있어서는 안됩니다).
-
==============================
4.Jetty 9.2 문서는 Servty 대신 ResourceHandler를 사용하여 정적 파일을 제공하는 Jetty Embedded 예제를 제공합니다.
Jetty 9.2 문서는 Servty 대신 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 운영 체제에서 파일을 잠급니다. 이는 알려진 문제점이며 서블릿에 대한 많은 해결 방법을 찾을 수 있습니다.
그러나이 예제는 서블릿에 의존하지 않으므로 웹 응용 프로그램 매개 변수 (useFileMapped Buffer, max CachedFiles)를 기반으로하는 관련 답변이 작동하지 않습니다.
메모리 내 파일 매핑을 방지하려면 다음 구성 줄을 추가해야합니다.
resource_handler.setMinMemoryMappedContentLength(-1);
주 : Javadoc (및 nimrodm에 의해 주목됩니다)에 기술되고있는 것처럼, 메모리 맵 버퍼를 사용해 처리되는 파일 자원의 최소 바이트 (바이트 단위). 그러나 나는 Integer.MAX_VALUE 값으로 같은 동작을 얻는다.
이 매개 변수가 설정되면 Jetty는 Windows에서 정적 파일을 제공 할 수 있으며 편집 할 수 있습니다.
-
==============================
5.webdefault.xml에서 useFileMappedBuffer를 false로 설정하면 나를 위해 작동하지 않습니다 (Jetty 8.1.10.v20130312). 다행스럽게도 maxCachedFiles를 0으로 설정하면 (webdefault.xml에서도) 트릭을 수행했습니다.
webdefault.xml에서 useFileMappedBuffer를 false로 설정하면 나를 위해 작동하지 않습니다 (Jetty 8.1.10.v20130312). 다행스럽게도 maxCachedFiles를 0으로 설정하면 (webdefault.xml에서도) 트릭을 수행했습니다.
-
==============================
6.@kybernetikos와 비슷하지만 DefaultServlet을 재 작성할 필요가 없습니다.
@kybernetikos와 비슷하지만 DefaultServlet을 재 작성할 필요가 없습니다.
// 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의 깊숙한 곳에 설정되어있는 것으로 보입니다. 그러나 위와 같이 속성 이름 앞에 접두어를 붙이면이 값을 사용하는 것이 좋습니다.
-
==============================
7.나는 또한이 문제가 있었다.
나는 또한이 문제가 있었다.
그리고 나는 추가적인 클래스를 만들고 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>
이 솔루션은 서블릿 컨텍스트에 정적 리소스 잠금을 비활성화하는 특성을 추가합니다.
즐거웠 어 :)
-
==============================
8.내장 된 Jetty 8.1.10을 사용하면 'useFileMappedBuffer = false'설정이 어떤 모드에서도 작동하지 않습니다. DefaultServlet 코드를 읽고 속성을 읽었지만 아무것도 사용하지 않았습니다.
내장 된 Jetty 8.1.10을 사용하면 'useFileMappedBuffer = false'설정이 어떤 모드에서도 작동하지 않습니다. DefaultServlet 코드를 읽고 속성을 읽었지만 아무것도 사용하지 않았습니다.
대신 버퍼 작성이 구성된 위치를 살펴본 후 SelectChannelConnector를 하위 클래스로 지정하여 Continuation의 이점을 얻지 만 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.ResourceHandler와 함께 IntelliJ와 Jetty 9를 사용할 때 소스 파일 대신 대상 디렉토리의 정적 컨텐츠를 편집하는 것이 솔루션 중 하나입니다.
ResourceHandler와 함께 IntelliJ와 Jetty 9를 사용할 때 소스 파일 대신 대상 디렉토리의 정적 컨텐츠를 편집하는 것이 솔루션 중 하나입니다.
-
==============================
10.그것은 아마도 그것을 잡고 브라우저입니다.
그것은 아마도 그것을 잡고 브라우저입니다.
내부 I.E : 도구 | 인터넷 옵션 | Temporary Internet Files> Settings에서 "Every page to visit"라디오 버튼을 클릭하십시오. 확인을 누릅니다.
그렇게하기 전에 모든 임시 인터넷 파일을 삭제하십시오.
from https://stackoverflow.com/questions/184312/how-to-make-jetty-dynamically-load-static-pages by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @Autowired 주석은 속성 또는 메소드로 이동해야합니다. (0) | 2018.12.23 |
---|---|
[SPRING] 타사 프레임 워크에서 log4j 메시지 필터링 (0) | 2018.12.23 |
[SPRING] 스프링 보안에서 새로운 PasswordEncoder를 사용하는 방법 (0) | 2018.12.23 |
[SPRING] Spring WebSockets의 경로 변수 @SendTo 매핑 (0) | 2018.12.23 |
[SPRING] java.lang.NoSuchMethodError : Parsistence.spi.PersistenceUnitInfo.getValidationMode () Ljavax / persistence / ValidationMode; (0) | 2018.12.23 |