GraalVM 20.0: Run Tomcat as Native Image on Windows

栏目: IT技术 · 发布时间: 4年前

内容简介:GraalVM’s native image generation utility has also been updated to provide extended support on Windows. A native image is an ahead-of-time compiled Java bytecode packaged as a standalone executable. The native image typically achievesIn a related news, Apa

GraalVM , a polyglot virtual machine that provides a shared runtime to execute applications written in multiple languages like Java, Python, and JavaScript, has released major version 20.0 with full support on Windows Platform. GraalVM 20.0 Windows distribution now includes the JavaScript engine, the GraalVM updater utility gu , and the JDK with the GraalVM compiler enabled. Note that unlike the Linux and MacOS distributions, Node.js support is not yet available on Windows.

GraalVM’s native image generation utility has also been updated to provide extended support on Windows. A native image is an ahead-of-time compiled Java bytecode packaged as a standalone executable. The native image typically achieves faster startup time and smaller footprint . The native image utility should be installed using GraalVM updater utility gu . gu is a package manager that downloads and installs packages not included in the core distribution of GraalVM.

In a related news, Apache Tomcat 9 has announced full support for GraalVM native image generation that includes the container. However, care must be taken while building Tomcat based native images since other third party libraries used by Tomcat web apps might not fully support native images. For example, if a library depends on dynamic classloading or reflection, GraalVM substrate VM must first be run using the tracing agent in order to auto generate configuration files used by the native image. These files can be placed under META-INF/native-image of the web app or jar to support features like reflection inside the native image.

The following code example showcases a simple Java 11 class that runs an embedded Tomcat server:

public class TED {

  public static void main(String... args)
      throws Exception {
    File baseFolder = new File(System.getProperty("user.dir"));
    File appsFolder = new File(baseFolder, "web-apps");

    var tomcat = new Tomcat();
    tomcat.setBaseDir(baseFolder.getAbsolutePath());
    tomcat.setPort(8080);
    tomcat.getHost().setAppBase(appsFolder.getAbsolutePath());

    // Call the connector to create the default connector.
    tomcat.getConnector();

    tomcat.addWebapp("", appsFolder.getAbsolutePath());
    var wrapper = tomcat.addServlet("", "hello", new HelloServlet());
    wrapper.setLoadOnStartup(1);
    wrapper.addMapping("/*");

    tomcat.start();
    tomcat.getServer().await();
  }

  private static class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {
      resp.setStatus(200);

      var writer = resp.getWriter();
      writer.write("Hello from Tomcat native image!");
      writer.flush();
      writer.close();
    }
  }
}

Use the Maven Shade plugin or the  Gradle Shadow Plugin to compile and build the class into a uber JAR as the native-image utility is easier to use with single JARs. Once the uber JAR is created, run the GraalVM tracing agent to generate configuration files for the native image. The following snippet shows how to run GraalVM tracing agent to generate configuration files for reflection, Java Native Interface (JNI), classpath resources, and dynamic proxies:

java \
  -agentlib:native-image-agent=config-merge-dir=graal-conf \
  -cp build/libs/ted-1.0-all.jar my.example.TED

The tracing agent creates the various configuration files in JSON that can be passed to the native-image utility:

native-image --no-server \
  -cp build/libs/ted-0.0.1-SNAPSHOT-all.jar \
  --allow-incomplete-classpath \
  -H:+JNI -H:+ReportUnsupportedElementsAtRuntime \
  -H:+ReportExceptionStackTraces -H:EnableURLProtocols=http,jar,jrt \
  -H:ConfigurationFileDirectories=graal-conf/ \
  -H:ReflectionConfigurationFiles=graal-conf/reflect-config.json \
  -H:ResourceConfigurationFiles=graal-conf/resource-config.json \
  -H:JNIConfigurationFiles=graal-conf/jni-config.json \
  my.example.TED ted

In the example above, the utility creates a native binary ted with a file size of around 40MB. It can be run without a full JDK or JRE:

./ted

Navigate to http://localhost:8006 and you will be greeted with a hello message as defined in the example Java class:

GraalVM 20.0: Run Tomcat as Native Image on Windows

Note that several Tomcat features like Java serialization, JMX, JULI , and static linking of tomcat-native are not yet supported inside GraalVM native image.

In addition to native image improvements and Windows support, GraalVM’s implementation of the WebAssembly language , GraalWasm, is now available as an experimental feature. Using the polyglot API , webassembly binaries can be embedded and run from Java applications.

Another noteworthy change to Java in GraalVM is that the default setting for ThreadPriorityPolicy is set to 1. This means that thread priorities set in Java are reflected by native OS thread priorities. Care must be taken while migrating performance sensitive applications as the default ThreadPriorityPolicy may affect application performance.

This release of GraalVM fixed several JNI and JDK 11 issues related to native image generation. A new JDK Flight Recorder Data Viewer has been added to GraalVM VisualVM , an enhanced version of VisualVM. Runtimes of NodeJS, Ruby, and LLVM have also been upgraded. A technology preview of the Language Server Protocol implementation for GraalVM languages is available in GraalVM VSCode Extensions .

Both JDK 8 and JDK 11 based GraalVM distributions are available for download from GitHub.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Growth Hacker Marketing

Growth Hacker Marketing

Ryan Holiday / Portfolio / 2013-9-3 / USD 10.31

Dropbox, Facebook, AirBnb, Twitter. A new generation of multibillion dollar brands built without spending a dime on “traditional marketing.” No press releases, no PR firms, and no billboards in Times ......一起来看看 《Growth Hacker Marketing》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具