Welcher der drei in Java eingebetteten Webserver Tomcat, Jetty und Undertow arbeitete an GraalVM?

Kennen Sie GraalVM? Es ist ein Tool, das Java nativ kompiliert und in einigen Fällen den Speicherverbrauch auf 1/16 reduziert (https://qiita.com/ukiuni@github/items/2999acf26fdc0c3f8353). Es gibt jedoch Einschränkungen für die Anwendungen, die GraalVM kompilieren kann, und nicht alle Java-Anwendungen können nativ kompiliert werden.

Um eine native Webanwendung zu erstellen, habe ich dieses Mal versucht zu überprüfen, ob eine Java-Anwendung mit einem integrierten Webserver mit GraalVM kompiliert und ausgeführt werden kann.

Durchsetzung

Erstellen Sie Fat Jar mit Gradle Shadow und kompilieren Sie mit Fat Jar, das mit der Option -jar im Native-Image-Befehl von GraalVM angegeben ist.

Umgebung

$ native-image --version
GraalVM Version 1.0.0-rc13
$ java -version
openjdk version "1.8.0_202"
OpenJDK Runtime Environment (build 1.8.0_202-20190206132754.buildslave.jdk8u-src-tar--b08)
OpenJDK GraalVM CE 1.0.0-rc13 (build 25.202-b08-jvmci-0.55, mixed mode)

Tomcat(tomcat-embed-core v9.0.17) Es war nicht gut

Quelle

Quellenauszug


public static void main(String[] args) throws Exception {
	Tomcat tomcat = new Tomcat();
	tomcat.setPort(8080);
	tomcat.getConnector();
	File base = new File("src/main/static/");
	Context context = tomcat.addContext("/app", base.getAbsolutePath());
	Tomcat.addServlet(context, "default", new DefaultServlet()).addMapping("/");

	Tomcat.addServlet(context, "hello", new HttpServlet() {
		protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			Writer w = resp.getWriter();
			w.write("Hello, World!");
			w.flush();
		}
	}).addMapping("/hello");
	tomcat.start();
	tomcat.getServer().await();
}

Kompilierung fehlgeschlagen.

$ native-image  -jar build/libs/app-all.jar
Build on Server(pid: 2099, port: 50704)
[app-all:2099]    classlist:   1,259.46 ms
[app-all:2099]        (cap):   1,512.61 ms
[app-all:2099]        setup:   7,054.04 ms
[app-all:2099]     analysis:  10,298.20 ms
Error: unsupported features in 2 methods
Detailed message:
Error: Class initialization failed: com.sun.naming.internal.ResourceManager$AppletParameter
Original exception that caused the problem: java.lang.ExceptionInInitializerError
...(Kürzung)

Es tut uns leid.

Jetty(jetty-server v9.4.15.v20190215) Ich konnte gehen!

Quellenauszug


public static void main(String[] args) throws Exception {
	Server server = new Server(8080);

	server.setHandler(new AbstractHandler() {

		@Override
		public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
			response.setContentType("text/plain");
			response.setStatus(HttpServletResponse.SC_OK);
			PrintWriter out = response.getWriter();
			out.println("Hello World!");
			baseRequest.setHandled(true);
		}
	});

	server.start();
	server.join();
}

Kompilieren und ausführen

$ native-image -jar build/libs/app-all.jar
Build on Server(pid: 2523, port: 51183)*
[app-all:2523]    classlist:   3,325.81 ms
[app-all:2523]        (cap):   1,309.95 ms
[app-all:2523]        setup:   8,400.08 ms
2019-04-04 22:16:54.214:INFO::ForkJoinPool-2-worker-3: Logging initialized @22713ms to org.eclipse.jetty.util.log.StdErrLog
[app-all:2523]   (typeflow):  11,805.43 ms
[app-all:2523]    (objects):   9,466.98 ms
[app-all:2523]   (features):     354.09 ms
[app-all:2523]     analysis:  37,080.95 ms
[app-all:2523]     universe:     650.05 ms
[app-all:2523]      (parse):   3,276.85 ms
[app-all:2523]     (inline):   6,226.93 ms
[app-all:2523]    (compile):  31,668.53 ms
[app-all:2523]      compile:  57,307.38 ms
[app-all:2523]        image:   2,385.43 ms
[app-all:2523]        write:     859.86 ms
[app-all:2523]      [total]: 145,307.12 ms
$ ./app-all
2019-04-04 22:19:55.501:INFO:oejs.Server:main: jetty-9.4.z-SNAPSHOT; built: 2019-02-15T16:53:49.381Z; git: eb70b240169fcf1abbd86af36482d1c49826fa0b; jvm 1.8.0_202
2019-04-04 22:19:55.502:INFO:oejs.AbstractConnector:main: Started ServerConnector@6b64b5db{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2019-04-04 22:19:55.502:INFO:oejs.Server:main: Started @2ms

Starten Sie sicher! Ich konnte mit einem Browser darauf zugreifen! groß.

Undertow(undertow-core v2.0.19.Final) Es war nicht gut .. ..

Quellenauszug


public static void helloWorldHandler(HttpServerExchange exchange) {
	exchange.getResponseHeaders().add(Headers.CONTENT_TYPE, "text/plain");
	exchange.getResponseSender().send("Hello World!");
}

public static void main(String[] args) {
	Undertow server = Undertow.builder().addHttpListener(8080, "0.0.0.0", App::helloWorldHandler).build();
	server.start();
}

kompilieren.

$ native-image -jar build/libs/app-all.jar
Build on Server(pid: 2523, port: 51183)
[app-all:2523]    classlist:   2,361.03 ms
[app-all:2523]        (cap):   1,720.81 ms
[app-all:2523]        setup:   7,458.13 ms
[app-all:2523]     analysis:   6,485.28 ms
Error: com.oracle.graal.pointsto.constraints.UnresolvedElementException: Discovered unresolved type during parsing: org.osgi.framework.FrameworkUtil. To diagnose the issue you can use the --allow-incomplete-classpath option. The missing type is then reported at run time when it is accessed the first time.

Danach habe ich die Option --allow-unvollständiger-Klassenpfad oder so hinzugefügt, aber ich konnte sie nicht kompilieren. Es tut uns leid.

Die richtige Antwort war also Jetty.

Es gab ein Ergebnis, dass sogar eines kompiliert werden konnte. Das Licht des Webanwendungsbetriebs mit 1/16 Speicherressourcen ist sichtbar geworden! Wenn JPA danach funktioniert, können Sie anscheinend eine einfache Webanwendung erstellen. JPA scheint auf Quarkus zu laufen, also hoffe ich, dass es kompiliert werden kann.

Recommended Posts

Welcher der drei in Java eingebetteten Webserver Tomcat, Jetty und Undertow arbeitete an GraalVM?
Stellen Sie die Sensorinformationen von Raspberry Pi in Java grafisch dar und überprüfen Sie sie mit einem Webbrowser
Vergleich der WEB-Anwendungsentwicklung mit Rails und Java Servlet + JSP
[Wahrscheinlich die einfachste] WEB-Anwendungsentwicklung mit Apache Tomcat + Java Servlet
Installieren Sie Java und Tomcat mit Ansible
[Aktualisiert Dezember 2018] Tipps für integrierte Webserver und Serverlets, die mit Jetty9 erstellt wurden
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen
Erstellen Sie mit Docker eine Apache- und Tomcat-Umgebung. Übrigens Maven & Java Kooperation
Hallo Welt mit Java Servlet und JSP (Einfacher Start des Webservers mit Maven + Jetty)