This doesn’t seem like something that should be the job of jpackage. The jpackage tool is currently used for producing platform-specific packages or installers targeted at end-users that include native launchers and a JRE. Web-based applications are an entirely different beast. This seems like more of a job for a Maven or Gradle plugin.
Regards, Scott > On Apr 24, 2021, at 5:59 PM, Andrew Oliver <93q...@gmail.com> wrote: > > Below is a Java Enhancement Proposal for your consideration to add > JavaScript to jpackage as a new target platform. I would appreciate > feedback on the proposal contents. I am also interested in learning about > the process, specifically what approvals are required prior to start of > implementation, should sufficient consensus be reached. > > ( To view this proposal as a web page, please visit: > https://frequal.com/TeaVM/openjdk/jdk-list-draft1.html ) > > Thank you! > > -Andrew Oliver > > Title: Add JavaScript platform to jpackage > Author: Andrew Oliver > Created: 2021/04/24 > Type: Feature > State: Draft > Exposure: Open > Component: tools/jpackage > Scope: JDK > Discussion: core-libs-dev@openjdk.java.net > Template: 1.0 > > Summary > ------- > > jpackage already allows packaging Java applications for several platforms. > This proposal adds a new platform: JavaScript. > > This effort will enable jpackage to 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 > ----- > > * Enabling JVM languages to build client-side web applications > * Allow easy generation of JavaScript from JVM bytecode > * Allow easy deployment and execution of generated JavaScript in web > browsers > * Allow easy deployment of the generated JavaScript in all web server > environments > * Java web application container (like Tomcat) > * Static file web servers > * Static file web hosting services > > Non-Goals > --------- > > * Allowing execution of JavaScript server-side. (Java already has > numerous options for executing bytecode server-side.) > > 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](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](https://teavm.org) has demonstrated that this is feasible and has > numerous benefits: > > * Provides a strongly-typed language for client-side web development > * Provides a wealth of IDEs, build tools, and testing tools for > client-side web development > * Allows teams with Java experience to produce apps with familiar > technology > * Allows sharing of POJO and business logic classes, simplifying > development > * Allows options for porting applet- and JNLP-based systems to > present-day browsers > > 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 > > * HelloApp.war > * index.html (Main application page, loads classes.js and invokes > main()) > * teavm > * classes.js (Class files, templates, and resources compiled to > JavaScript) > * css > * (CSS files from application) > * META-INF > * MANIFEST.MF > * WEB-INF > * web.xml > > ### ZIP Layout > > * HelloApp.zip > * index.html (Main application page, loads classes.js and invokes > main()) > * teavm > * classes.js (Class files, templates, and resources compiled to > JavaScript) > * css > * (CSS files from application) > > Basic usage: Non-modular applications > ------------------------------------- > > Command-line usage is similar to jpackage today, except you use the `--type > js`. For example, if you have your application JARs in a folder called > `lib` and the JAR with the declared `main()` method is `main.jar`, you > could use this command: > > ``` > $ jpackage --type js --name myapp --input lib --main-jar main.jar > ``` > > This will produce `myapp.war` in the current directory. This is a standard > WAR file ready for deployment in any web application container (like > Tomcat). When myapp/index.html is opened in a browser, the code in main() > will be executed, in-browser. A typical Hello World main() method like > > ``` > public static void main(String args\[\]) { > System.out.println("Hello, Browser!"); > } > ``` > > will print the message on the browser developer console. > > Processing > ---------- > > Conversion of the input JAR files to the classes.js file will be done by > TeaVM. It will > > * Convert provided class files to JavaScript > * Expose the specified main method as main() > * Provide implementation of selected core Java classes that function in a > browser environment > * Bundle resources into the generated JavaScript > * Include images, css, and web.xml in the generated package, if provided > * Provide default index.html if omitted > * Provide default web.xml if omitted and WAR format specified > * Optionally minify the generated JavaScript > > ### 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. > * simple: Perform only basic optimizations > * advanced: Perform more optimizations. Recommended for production. > * full: Perform aggressive optimizations. Increases compilation time. > 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. Format: comma-separated list of locale IDs like "en\_US, > ru\_RU" > > ### Unsupported options for the JavaScript type > > These options are unsupported for `--type js` > > * `--file-associations`: Not yet meaningful for a web-based app, though > it may be in the future once PWAs support file types: [ > https://github.com/WICG/file-handling](https://github.com/WICG/file-handling) > * `--app-version, --copyright, --description, --license-file, --vendor`: > jpackage will only support --name initially. Users can customize index.html > (and the rest of the application) to show branding and metadata as desired. > * `--java-options`: Not yet supported, use `--arguments` instead. > > Caveats > ------- > > Certain Java classes are not feasible to implement in a browser setting. > Socket, for example, is not useful in a browser since JavaScript cannot > open arbitrary socket connections. Code using unavailable classes will fail > during packaging time with warnings about the missing classes. > > Testing > ------- > > Since TeaVM is Java-based, tests will be able to run on any platform. > > Testing will focus on the new jpackage code and added functionality. Tests > will confirm that when valid parameters are provided, that output is > generated with the right name and in the right folder. Contents of the > generated ZIP and WAR files will be checked for the presence of expected > files. Testing generated files in a browser will be done manually. > > A thorough test of TeaVM itself is out of scope for the jpackage testing. > This is in line with jpackage testing for other platforms, in which the > external packaging tool (like Wix on Windows) isn't exhaustively tested. > > Dependencies > ------------ > > The jpackage `js` type will require TeaVM binaries to be present. > > Implementation options: > > * Download TeaVM on-demand and cache it. (This is the likely option.) > * Look for TeaVM in local repositories for popular build tools like > Maven and Gradle > * If not found locally, download TeaVM binaries from the read-only > central repository and store in the cache folder > * Invoke TeaVM from the local repository or cache > * Require that TeaVM binaries be installed locally > * Provide the path to TeaVM binaries on the command line > * Bundle TeaVM > * Challenging due to incompatible licenses (Apache v2 vs. GPL v2 with > CPE) > * Probably unnecessary given the options above. Other jpackage > options require pre-installed tools, this will be no different. > > High-Level Design > ----------------- > > A new bundler will be added to the jpackage Java source code. > > It will first ensure that TeaVM binaries (JAR files) are available locally, > as described in the section above. > > The new bundler will use TeaVM's TeaVMRunner ([ > https://github.com/konsoletyper/teavm/blob/master/tools/cli/src/main/java/org/teavm/cli/TeaVMRunner.java](https://github.com/konsoletyper/teavm/blob/master/tools/cli/src/main/java/org/teavm/cli/TeaVMRunner.java)), > which conveniently accepts options similar to jpackage itself. TeaVMRunner > will do the heavy lifting of converting the application JAR files and > resources into `classes.js`. > > The bundler will provide additional files required to make a web > application, including an `index.html` to launch the `main()` method. The > bundler will create the final archive (ZIP or WAR) using Java's > ZipOutputStream. For the WAR format, the bundler will also add `web.xml` > and `MANIFEST.MF` if not present to create a deployable, standard WAR file.