Parmi les trois serveurs Web embarqués Java, Tomcat, Jetty et Undertow, lequel fonctionnait sur GraalVM?

Connaissez-vous GraalVM? C'est un outil qui compile nativement Java et, dans certains cas, réduit la consommation de mémoire à 1/16 (https://qiita.com/ukiuni@github/items/2999acf26fdc0c3f8353). Cependant, il existe des restrictions sur les applications que GraalVM peut compiler, et toutes les applications Java ne peuvent pas être compilées nativement.

Cette fois, afin de créer une application Web native, j'ai essayé de vérifier si une application Java avec un serveur Web intégré peut être compilée et exécutée avec GraalVM.

Mise en vigueur

Créez Fat Jar à l'aide de gradle shadow et compilez-le en spécifiant Fat Jar avec l'option -jar dans la commande native-image de GraalVM.

environnement

$ 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) Ce n'était pas bon.

La source

Extrait de la source


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();
}

La compilation a échoué.

$ 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
...(réduction)

Pardon.

Jetty(jetty-server v9.4.15.v20190215) J'ai pu y aller!

Extrait de la source


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();
}

Compiler et exécuter

$ 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

Démarrez en toute sécurité! J'ai pu y accéder avec un navigateur! génial.

Undertow(undertow-core v2.0.19.Final) Ce n'était pas bon. .. ..

Extrait de la source


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();
}

compiler.

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

Après cela, j'ai ajouté l'option --allow-incompl-classpath ou quelque chose, mais je n'ai pas pu la compiler. Pardon.

Donc la bonne réponse était Jetty.

Il y avait un résultat que même un pourrait être compilé. La lumière du fonctionnement des applications Web avec 1/16 de ressources mémoire est apparue! Après cela, si JPA fonctionne, il semble que vous puissiez créer une application Web simple. JPA semble fonctionner sur Quarkus, j'espère donc qu'il pourra être compilé.

Recommended Posts

Parmi les trois serveurs Web embarqués Java, Tomcat, Jetty et Undertow, lequel fonctionnait sur GraalVM?
Représentez graphiquement les informations du capteur de Raspberry Pi en Java et vérifiez-les avec un navigateur Web
Comparaison du développement d'applications WEB avec Rails et Java Servlet + JSP
[Probablement le plus simple] Développement d'applications WEB avec Apache Tomcat + Java Servlet
Installez Java et Tomcat avec Ansible
[Mise à jour décembre 2018] Astuces pour le serveur Web intégré et le serverlet créés avec Jetty9
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
Créez un environnement Apache et Tomcat avec Docker. À propos, coopération Maven & Java
Hello World avec Java Servlet et JSP (démarrage facile du serveur Web avec Maven + Jetty)