Home / TeaVM Patterns and Pitfalls     frequal.com

TeaVM for OpenJDK: JEP Draft 2

jpackage allows packaging Java applications for several platforms. This proposal adds a new platform: JavaScript.

Summary

Add a JavaScript type option to jpackage. This will convert bytecode from the provided classes into JavaScript, and generate the required HTML to invoke the specified main method when opened in a web browser. These files will be bundled into a WAR file for easy deployment.

Goals

Non-Goals

Motivation

Java was once used to create client-side web applications via applets that could be launched by visiting a web page. Applets could draw on an area of the screen (like HTML5 Canvas) or manipulate the page DOM to create dynamic front-end applications (like JS single-page apps).

However, as evident in JEP 398 (https://openjdk.java.net/jeps/398), applets are no longer feasible due to the actions of browser vendors. While browsers have lost the ability to execute Java bytecode or invoke methods from the Java class libraries, they do have mature engines for executing a different sort of code (JavaScript) and an extensive list of useful APIs. By converting class files to JavaScript, and providing mechanisms to invoke browser APIs, Java can again be used to create in-browser applications. TeaVM has demonstrated that this is feasible and has numerous benefits:

Details

An additional jpackage option for type will be added: js

jpackage will use a JavaScript AOT compiler (TeaVM) to convert the Java code to JavaScript, with the main class compiled to a JavaScript method called 'main()'.

jpackage bundles application code, runtime, and resources into a platform-specific format. For this new JavaScript type, the layout will be either a ZIP file or a standard WAR file. The ZIP format will contain the files ready to be extracted to a static file webserver or HTML hosting service. Generated WARs will have the required structure to be deployable in a Java web application container.

WAR layout

ZIP Layout

Processing

Conversion of the input JAR files to the classes.js file will be done by TeaVM. It will

js-specific options

  1. --minify: Perform a minification pass after generating JavaScript, renaming classes and methods to short, generated names to reduce download sizes and provide some obfuscation.
  2. --debug: Enable generation of source maps.
  3. --debug-full: Enable generation of source maps and bundled source files.
  4. --optimization: Choose simple, advanced, or full. (TBD: provide descriptions from TeaVM)
  5. --timezone-support: Enables timezone support, at the cost of increased application size
  6. --locale-list: Add extra locales via a list, at the cost of increased application size. (TBD: Specify locale list format)

Caveats

Certain Java classes are not feasible to implement in a browser setting. Socket, for example, is not useful in a browser setting since JavaScript cannot open arbitrary socket connections. Code using unavailable classes will fail during packaging time with warnings about the missing classes.

Testing

Many tests can build on existing TeaVM test suites. (TBD: Is a browser used in current JDK testing? Will that be a new requirement?)

More TBD

Dependencies

The jpackage js type will require TeaVM binaries to be present.

Implementation options:


Last modified on 31 Mar 2021 by AO

Copyright © 2024 Andrew Oliver