Example example_jerrymouse

Part of the full Java 9 Jigsaw modules example suite.

Authors

Migrated for Java Modules support documentation of Apache MavenTM in the course of the Maven Support & Care program by Gerd Aschemann (and other team members) as forked repository. Please add discussions, requirements, bugfixes, etc. to the fork instead of the original.

What is this example about?

Modules in this example

TODO

Example shows …​

TODO

Loading Modules in Layers

Starter implements a primitive app server that loads modular applications from the subdirectory apps/ into their own layer under the boot layer and executes them via reflection.

For requirements on modular applications and details on storage, see apps/README.txt

  • Applications are stored under apps. Each application in its own directory "x". Directory name = application folder name

  • Configuration of the application via x/app.json

  • The application’s modules are located under x/mods/

e.g.

apps/example_requires_exports
> app.json
apps/example_requires_exports/mods
> modb.jar
> modc.jar
> modmain.jar
apps/example_hiddenmain
> app.json
apps/example_hiddenmain/mods
> ...
  • app.json defines the root module as well as the main class and method to be started, e.g.:

{
  "rootModule": "modmain",
  "bootClass": "pkgmain.Main",
  "bootMethod": "main"
}

Note: "bootMethod" must be static and have String[] as parameter!

END TODO

Output

This example uses golden master testing to ensure output consistency. The expected output is compared with actual output using verify.sh.

Expected Output

[JerryMouse] Scanning for apps in apps
--------------------------------------------------------------------------------------------------------------------
[JerryMouse|example_derived_private-package-protected] Initiating layer for application: example_derived_private-package-protected
[JerryMouse|example_derived_private-package-protected] Loading modules from apps/example_derived_private-package-protected
[JerryMouse|example_derived_private-package-protected] Loading app description from apps/example_derived_private-package-protected/app.json
[JerryMouse|example_derived_private-package-protected] Root module: modmain
[JerryMouse|example_derived_private-package-protected] Boot class: pkgmain.Main
[JerryMouse|example_derived_private-package-protected] Boot method: main
[JerryMouse|example_derived_private-package-protected] Created layer containing the following modules:
         modb
         modmain
[JerryMouse|example_derived_private-package-protected] Calling boot method (modmain/pkgmain.Main.main) in foreground
--------------------------------------------------------------------------------------------------------------------
[JerryMouse|example_requires_exports] Initiating layer for application: example_requires_exports
[JerryMouse|example_requires_exports] Loading modules from apps/example_requires_exports
[JerryMouse|example_requires_exports] Loading app description from apps/example_requires_exports/app.json
[JerryMouse|example_requires_exports] Root module: modmain
[JerryMouse|example_requires_exports] Boot class: pkgmain.Main
[JerryMouse|example_requires_exports] Boot method: main
[JerryMouse|example_requires_exports] Created layer containing the following modules:
         modb
         modc
         modmain
[JerryMouse|example_requires_exports] Calling boot method (modmain/pkgmain.Main.main) in foreground
--------------------------------------------------------------------------------------------------------------------
[JerryMouse|example_requires_exports-to] Initiating layer for application: example_requires_exports-to
[JerryMouse|example_requires_exports-to] Loading modules from apps/example_requires_exports-to
[JerryMouse|example_requires_exports-to] Loading app description from apps/example_requires_exports-to/app.json
[JerryMouse|example_requires_exports-to] Root module: modmain
[JerryMouse|example_requires_exports-to] Boot class: pkgmain.Main
[JerryMouse|example_requires_exports-to] Boot method: main
[JerryMouse|example_requires_exports-to] Created layer containing the following modules:
         modb1
         modb2
         modc
         modmain
[JerryMouse|example_requires_exports-to] Calling boot method (modmain/pkgmain.Main.main) in foreground
--------------------------------------------------------------------------------------------------------------------
[JerryMouse] All apps completed. Shutting down.

Actual Output

[JerryMouse] Scanning for apps in apps
--------------------------------------------------------------------------------------------------------------------
[JerryMouse|example_derived_private-package-protected] Initiating layer for application: example_derived_private-package-protected
[JerryMouse|example_derived_private-package-protected] Loading modules from apps/example_derived_private-package-protected
[JerryMouse|example_derived_private-package-protected] Loading app description from apps/example_derived_private-package-protected/app.json
[JerryMouse|example_derived_private-package-protected] Root module: modmain
[JerryMouse|example_derived_private-package-protected] Boot class: pkgmain.Main
[JerryMouse|example_derived_private-package-protected] Boot method: main
[JerryMouse|example_derived_private-package-protected] Created layer containing the following modules:
         modb
         modmain
[JerryMouse|example_derived_private-package-protected] Calling boot method (modmain/pkgmain.Main.main) in foreground
--------------------------------------------------------------------------------------------------------------------
[JerryMouse|example_requires_exports] Initiating layer for application: example_requires_exports
[JerryMouse|example_requires_exports] Loading modules from apps/example_requires_exports
[JerryMouse|example_requires_exports] Loading app description from apps/example_requires_exports/app.json
[JerryMouse|example_requires_exports] Root module: modmain
[JerryMouse|example_requires_exports] Boot class: pkgmain.Main
[JerryMouse|example_requires_exports] Boot method: main
[JerryMouse|example_requires_exports] Created layer containing the following modules:
         modb
         modc
         modmain
[JerryMouse|example_requires_exports] Calling boot method (modmain/pkgmain.Main.main) in foreground
--------------------------------------------------------------------------------------------------------------------
[JerryMouse|example_requires_exports-to] Initiating layer for application: example_requires_exports-to
[JerryMouse|example_requires_exports-to] Loading modules from apps/example_requires_exports-to
[JerryMouse|example_requires_exports-to] Loading app description from apps/example_requires_exports-to/app.json
[JerryMouse|example_requires_exports-to] Root module: modmain
[JerryMouse|example_requires_exports-to] Boot class: pkgmain.Main
[JerryMouse|example_requires_exports-to] Boot method: main
[JerryMouse|example_requires_exports-to] Created layer containing the following modules:
         modb1
         modb2
         modc
         modmain
[JerryMouse|example_requires_exports-to] Calling boot method (modmain/pkgmain.Main.main) in foreground
--------------------------------------------------------------------------------------------------------------------
[JerryMouse] All apps completed. Shutting down.

Maven 4 Output

[JerryMouse] Scanning for apps in apps
--------------------------------------------------------------------------------------------------------------------
[JerryMouse|example_derived_private-package-protected] Initiating layer for application: example_derived_private-package-protected
[JerryMouse|example_derived_private-package-protected] Loading modules from apps/example_derived_private-package-protected
[JerryMouse|example_derived_private-package-protected] Loading app description from apps/example_derived_private-package-protected/app.json
[JerryMouse|example_derived_private-package-protected] Root module: modmain
[JerryMouse|example_derived_private-package-protected] Boot class: pkgmain.Main
[JerryMouse|example_derived_private-package-protected] Boot method: main
[JerryMouse|example_derived_private-package-protected] Created layer containing the following modules:
         modb
         modmain
[JerryMouse|example_derived_private-package-protected] Calling boot method (modmain/pkgmain.Main.main) in foreground
--------------------------------------------------------------------------------------------------------------------
[JerryMouse|example_requires_exports] Initiating layer for application: example_requires_exports
[JerryMouse|example_requires_exports] Loading modules from apps/example_requires_exports
[JerryMouse|example_requires_exports] Loading app description from apps/example_requires_exports/app.json
[JerryMouse|example_requires_exports] Root module: modmain
[JerryMouse|example_requires_exports] Boot class: pkgmain.Main
[JerryMouse|example_requires_exports] Boot method: main
[JerryMouse|example_requires_exports] Created layer containing the following modules:
         modb
         modc
         modmain
[JerryMouse|example_requires_exports] Calling boot method (modmain/pkgmain.Main.main) in foreground
--------------------------------------------------------------------------------------------------------------------
[JerryMouse|example_requires_exports-to] Initiating layer for application: example_requires_exports-to
[JerryMouse|example_requires_exports-to] Loading modules from apps/example_requires_exports-to
[JerryMouse|example_requires_exports-to] Loading app description from apps/example_requires_exports-to/app.json
[JerryMouse|example_requires_exports-to] Root module: modmain
[JerryMouse|example_requires_exports-to] Boot class: pkgmain.Main
[JerryMouse|example_requires_exports-to] Boot method: main
[JerryMouse|example_requires_exports-to] Created layer containing the following modules:
         modb1
         modb2
         modc
         modmain
[JerryMouse|example_requires_exports-to] Calling boot method (modmain/pkgmain.Main.main) in foreground
--------------------------------------------------------------------------------------------------------------------
[JerryMouse] All apps completed. Shutting down.

Maven 4 Migration

The example_jerrymouse has been migrated to Maven 4 with the following approach.

Key Changes

Dependency Management

The javax.json automatic module dependency is managed via Maven.

  • Added org.glassfish:javax.json:1.0.4 as Maven dependency

  • Configured maven-dependency-plugin to copy the JAR to amlib/ directory

  • Configured maven-compiler-plugin to include amlib/ on the module-path during compilation

Source Code Sharing

Uses symbolic links to share source code with the original example.

  • m4/src/modstarter/main/java../../../../src/modstarter

Application Loading

Created m4/apps_copyallexamples2appdir.sh script.

  • Copies Maven 4 versions of example applications from whitelisted examples

  • Builds M4 versions of dependencies if they don’t exist yet

  • Sources from ../example_*/m4/target/ (JARs created by maven-jar-plugin)

  • Creates app.json descriptors for each application

Runtime Configuration

The m4/run.sh script runs the JerryMouse app server.

  • Calls apps_copyallexamples2appdir.sh to prepare application JARs

  • Runs with correct module-path including amlib/

  • Dynamically loads and executes applications in separate module layers

Applications Loaded

The JerryMouse server loads and runs these Maven 4 migrated examples:

  • example_requires_exports

  • example_requires_exports-to

  • example_derived_private-package-protected

Each application runs in its own module layer with proper isolation.