The main goal of this patch is to move java related artifacts and build logic 
from main makefile and
folder ./java to relevant existing or new modules. Other goals are following:

- minimize modules and corresponding artifacts that are part of default java 
image
- modularize runjava to accomodate either isolated or non-isolated mode jars 
(non-isolated jar is 400K smaller now)
- provide managable way to build images to run java apps in isolated and 
non-isolated mode without 
  proliferation of new modules
- remove mgmt-related artifacts from default java image and park it in new 
module/java-mgtm
- make jolokia related artifacts be added to the image only if httpserver 
module is included 
- make all the changes backwards compatible so that the scripts that build 
capstan images and other 
  standard ones do not need to change

Here is a list of existing or new java related modules and apps (new marked 
with *):
- modules/java-base (*)       - contains common C/C++ code and runjava code 
- modules/java-isolated (*)   - requires(java-base), provides(java-cmd); builds 
isolated mode specific java.so and runjava jar  
- modules/java-non-isolated   - requires(java-base), provides(java-cmd); builds 
non-isolated mode specific java.so and runjava jar
- modules/java-cmd (*)        - requires(java-isolated); acts to provides 
necessary default for the module java    
- modules/java                - requires(java-isolated, openjdk7)
- modules/java-tests          - requires(java-base)
- modules/java-mgmt (*)       - "parking place" for cloudius jar and jni so 
used by obsolete mgmt app   
- modules/openjdk7 (*)        - requires(java-cmd), provides(java)
- modules/httpserver          - 
requires(josvsym,httpserver-jolokia-plugin,httpserver-jvm-plugin) if java 
module included
- apps/openjdk8-fedora        - requires(java-cmd), provides(java)
- apps/openjdk8-zulu-compactN - requires(java-non-isolated), provides(java); 
implictly builds in non-isolated mode
- apps/openjdk9-ea-java-base  - requires(java-non-isolated), provides(java)
- apps/openjdk8-zulu-compact3-with-java-beans - requires(java-cmd), 
provides(java); new module that allows building minimal java image (only 2MB 
bigger than compact3) to run most java apps

Examples to build example java app:

scripts/build image=java-example # builds with JRE 7 in isolated mode
scripts/build image=java-non-isolated,openjdk7,java-example # builds with JRE 7 
in non-isolated mode
scripts/build image=java-non-isolated,openjdk8-fedora,java-example # builds 
with JRE 8 in non-isolated mode
scripts/build image=openjdk8-zulu-compact1,java-example # builds with JRE 8 
compact 1 in non-isolated mode because compact 'java' require java-non-isolated

Signed-off-by: Waldemar Kozaczuk <[email protected]>

---
 .gitignore                                         | 18 ++++-
 Makefile                                           | 16 +----
 java/jolokia-agent/pom.xml                         | 64 ------------------
 modules/httpserver-jolokia-plugin/Makefile         |  3 +
 .../jolokia-agent/pom.xml                          | 78 ++++++++++++++++++++++
 .../src/main/java/io/osv/jolokia/Dispatcher.java   |  0
 .../java/io/osv/jolokia/RequestAndResponse.java    |  0
 modules/httpserver-jolokia-plugin/module.py        |  2 +-
 modules/httpserver/module.py                       |  5 ++
 modules/java-base/Makefile                         | 19 ++++++
 modules/java-base/common.gmk                       | 46 +++++++++++++
 {java/jvm => modules/java-base}/java.cc            |  9 +--
 {java => modules/java-base}/jni/monitor.cc         |  0
 {java => modules/java-base}/jni/monitor.hh         |  0
 modules/java-base/module.py                        |  5 ++
 modules/java-base/pom.xml                          | 44 ++++++++++++
 .../java-base/runjava-common}/pom.xml              |  6 +-
 .../AppThreadTerminatedWithUncaughtException.java  |  0
 .../src/main/java/io/osv/GCInfo.java               |  0
 .../src/main/java/io/osv/JavaInfo.java             |  0
 .../runjava-common}/src/main/java/io/osv/Jvm.java  |  0
 .../java/io/osv/MainClassNotFoundException.java    |  0
 .../src/main/java/io/osv/OSvGCMonitor.java         |  0
 .../src/main/java/io/osv/RunJvmAppHelper.java      |  0
 .../main/java/io/osv/util/ClassDiagnostics.java    |  0
 .../main/java/io/osv/util/json/ArrayBuilder.java   |  0
 .../main/java/io/osv/util/json/JsonGenerator.java  |  0
 .../java-base/runjava-isolated}/pom.xml            |  9 ++-
 .../src/main/java/io/osv/isolated/Context.java     |  0
 .../io/osv/isolated/ContextFailedException.java    |  0
 .../src/main/java/io/osv/isolated/IsolatedJvm.java |  2 +-
 .../isolated/IsolatingOsvSystemClassLoader.java    |  0
 .../main/java/io/osv/isolated/MultiJarLoader.java  |  0
 .../java/io/osv/isolated/RunIsolatedJvmApp.java    |  0
 .../main/java/io/osv/jul/DefaultLogManager.java    |  0
 .../main/java/io/osv/jul/IsolatingLogManager.java  |  0
 .../main/java/io/osv/jul/LogManagerWrapper.java    |  0
 .../java/io/osv/util/InitializationException.java  |  0
 .../main/java/io/osv/util/LazilyInitialized.java   |  0
 .../java-base/runjava-non-isolated}/pom.xml        | 16 ++---
 .../java/io/osv/nonisolated/NonIsolatedJvm.java    |  0
 .../NonIsolatingOsvSystemClassLoader.java          |  0
 .../io/osv/nonisolated/RunNonIsolatedJvmApp.java   |  0
 modules/{java-tests => java-base}/usr.manifest     |  5 +-
 modules/java-cmd/module.py                         |  3 +
 modules/{java => java-isolated}/.java.policy       |  2 +-
 modules/java-isolated/Makefile                     | 24 +++++++
 modules/java-isolated/module.py                    |  4 ++
 modules/{java-tests => java-isolated}/usr.manifest |  4 +-
 modules/java-mgmt/Makefile                         | 23 +++++++
 modules/java-mgmt/cloudius/pom.xml                 | 30 +++++++++
 .../src/main/java/com/cloudius/Config.java         |  0
 .../main/java/com/cloudius/balloon/Balloon.java    |  0
 .../cloudius/cli/tests/TCPConcurrentDownloads.java |  0
 .../com/cloudius/cli/tests/TCPDownloadFile.java    |  0
 .../com/cloudius/cli/tests/TCPEchoServerTest.java  |  0
 .../cli/tests/TCPExternalCommunication.java        |  0
 .../src/main/java/com/cloudius/cli/tests/Test.java |  0
 .../main/java/com/cloudius/cli/tests/TestELF.java  |  0
 .../java/com/cloudius/cli/tests/TestRunner.java    |  0
 .../main/java/com/cloudius/cli/util/ELFLoader.java |  0
 .../java/com/cloudius/cli/util/Networking.java     |  0
 .../src/main/java/com/cloudius/cli/util/Shrew.java |  0
 .../src/main/java/com/cloudius/net/Arp.java        |  0
 .../src/main/java/com/cloudius/net/DHCP.java       |  0
 .../src/main/java/com/cloudius/net/IFConfig.java   |  0
 .../src/main/java/com/cloudius/net/Route.java      |  0
 .../main/java/com/cloudius/trace/Callstack.java    |  0
 .../src/main/java/com/cloudius/trace/Counter.java  |  0
 .../main/java/com/cloudius/trace/Tracepoint.java   |  0
 .../src/main/java/com/cloudius/util/Exec.java      |  0
 .../src/main/java/com/cloudius/util/IStty.java     |  0
 .../src/main/java/com/cloudius/util/MD5.java       |  0
 .../src/main/java/com/cloudius/util/Power.java     |  0
 .../java/com/cloudius/util/PrintClassPath.java     |  0
 .../src/main/java/com/cloudius/util/Stty.java      |  0
 {java => modules/java-mgmt}/jni/balloon.c          |  0
 {java => modules/java-mgmt}/jni/elf-loader.cc      |  0
 {java => modules/java-mgmt}/jni/networking.cc      |  0
 {java => modules/java-mgmt}/jni/power.cc           |  0
 {java => modules/java-mgmt}/jni/stty.c             |  0
 {java => modules/java-mgmt}/jni/tracepoint.cc      |  0
 {java => modules/java-mgmt}/jni/tracepoint.hh      |  0
 modules/java-mgmt/usr.manifest                     |  8 +++
 modules/java-non-isolated/.java.policy             |  2 +-
 modules/java-non-isolated/Makefile                 | 26 ++++++--
 modules/java-non-isolated/module.py                | 29 +-------
 modules/java-non-isolated/usr.manifest             | 17 +----
 modules/java-tests/.java.policy                    |  6 ++
 modules/java-tests/Makefile                        | 26 ++++++++
 modules/java-tests/module.py                       | 28 +++++---
 {java => modules/java-tests}/pom.xml               |  8 +--
 .../java-tests}/tests-isolates/pom.xml             | 11 ++-
 .../src/main/java/tests/ClassFinder.java           |  0
 .../java/tests/ClassPresentInBothContexts.java     |  0
 .../src/main/java/tests/FieldTester.java           |  0
 .../src/main/java/tests/LoggingProcess.java        |  0
 .../main/java/tests/NonIsolatedLoggingProcess.java |  0
 .../src/main/java/tests/PropertyReader.java        |  0
 .../src/main/java/tests/PropertySetter.java        |  0
 .../src/main/java/tests/StaticFieldSetter.java     |  0
 .../java-tests}/tests-jre-extension/pom.xml        |  2 +-
 .../src/main/java/tests/SomeExtensionClass.java    |  0
 {java => modules/java-tests}/tests/pom.xml         | 11 ++-
 .../java/io/osv/AllTestsThatTestIsolatedApp.java   |  0
 .../io/osv/AllTestsThatTestNonIsolatedApp.java     |  0
 .../main/java/io/osv/ClassLoaderIsolationTest.java |  0
 .../io/osv/ClassLoaderWithoutIsolationTest.java    |  0
 .../src/main/java/io/osv/LoggingIsolationTest.java |  0
 .../java/io/osv/LoggingWithoutIsolationTest.java   |  0
 .../tests/src/main/java/io/osv/OsvApiTest.java     |  0
 .../main/java/io/osv/PropertyIsolationTest.java    |  0
 .../main/java/io/osv/TemporarySecurityManager.java |  0
 .../main/java/io/osv/TestDomainPermissions.java    |  0
 .../tests/src/main/java/io/osv/TestLaunching.java  |  0
 .../java/tests/ClassPresentInBothContexts.java     |  0
 .../tests/ClassPresentOnlyInParentContext.java     |  0
 .../tests/src/main/java/tests/ClassPutInRoot.java  |  0
 modules/java-tests/usr.manifest                    |  6 +-
 modules/java/Makefile                              | 10 ---
 modules/java/module.py                             | 24 +------
 modules/java/usr.manifest                          | 22 ------
 modules/{java => openjdk7}/module.py               | 10 +--
 scripts/module.py                                  |  5 +-
 scripts/osv/modules/api.py                         |  1 +
 scripts/osv/modules/resolve.py                     | 27 +++++++-
 126 files changed, 480 insertions(+), 236 deletions(-)
 delete mode 100644 java/jolokia-agent/pom.xml
 create mode 100644 modules/httpserver-jolokia-plugin/jolokia-agent/pom.xml
 rename {java => 
modules/httpserver-jolokia-plugin}/jolokia-agent/src/main/java/io/osv/jolokia/Dispatcher.java
 (100%)
 rename {java => 
modules/httpserver-jolokia-plugin}/jolokia-agent/src/main/java/io/osv/jolokia/RequestAndResponse.java
 (100%)
 create mode 100644 modules/java-base/Makefile
 create mode 100644 modules/java-base/common.gmk
 rename {java/jvm => modules/java-base}/java.cc (97%)
 rename {java => modules/java-base}/jni/monitor.cc (100%)
 rename {java => modules/java-base}/jni/monitor.hh (100%)
 create mode 100644 modules/java-base/module.py
 create mode 100644 modules/java-base/pom.xml
 rename {java/cloudius => modules/java-base/runjava-common}/pom.xml (81%)
 rename {java/runjava => 
modules/java-base/runjava-common}/src/main/java/io/osv/AppThreadTerminatedWithUncaughtException.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-common}/src/main/java/io/osv/GCInfo.java (100%)
 rename {java/runjava => 
modules/java-base/runjava-common}/src/main/java/io/osv/JavaInfo.java (100%)
 rename {java/runjava => 
modules/java-base/runjava-common}/src/main/java/io/osv/Jvm.java (100%)
 rename {java/runjava => 
modules/java-base/runjava-common}/src/main/java/io/osv/MainClassNotFoundException.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-common}/src/main/java/io/osv/OSvGCMonitor.java (100%)
 rename {java/runjava => 
modules/java-base/runjava-common}/src/main/java/io/osv/RunJvmAppHelper.java 
(100%)
 rename {java/runjava => 
modules/java-base/runjava-common}/src/main/java/io/osv/util/ClassDiagnostics.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-common}/src/main/java/io/osv/util/json/ArrayBuilder.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-common}/src/main/java/io/osv/util/json/JsonGenerator.java
 (100%)
 rename {java/runjava => modules/java-base/runjava-isolated}/pom.xml (90%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/isolated/Context.java 
(100%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/isolated/ContextFailedException.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/isolated/IsolatedJvm.java
 (98%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/isolated/IsolatingOsvSystemClassLoader.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/isolated/MultiJarLoader.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/isolated/RunIsolatedJvmApp.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/jul/DefaultLogManager.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/jul/IsolatingLogManager.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/jul/LogManagerWrapper.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/util/InitializationException.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-isolated}/src/main/java/io/osv/util/LazilyInitialized.java
 (100%)
 copy {java/tests-isolates => modules/java-base/runjava-non-isolated}/pom.xml 
(77%)
 rename {java/runjava => 
modules/java-base/runjava-non-isolated}/src/main/java/io/osv/nonisolated/NonIsolatedJvm.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-non-isolated}/src/main/java/io/osv/nonisolated/NonIsolatingOsvSystemClassLoader.java
 (100%)
 rename {java/runjava => 
modules/java-base/runjava-non-isolated}/src/main/java/io/osv/nonisolated/RunNonIsolatedJvmApp.java
 (100%)
 copy modules/{java-tests => java-base}/usr.manifest (52%)
 create mode 100644 modules/java-cmd/module.py
 rename modules/{java => java-isolated}/.java.policy (50%)
 create mode 100644 modules/java-isolated/Makefile
 create mode 100644 modules/java-isolated/module.py
 copy modules/{java-tests => java-isolated}/usr.manifest (53%)
 create mode 100644 modules/java-mgmt/Makefile
 create mode 100644 modules/java-mgmt/cloudius/pom.xml
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/Config.java (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/balloon/Balloon.java 
(100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/cli/tests/TCPConcurrentDownloads.java
 (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/cli/tests/TCPDownloadFile.java
 (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/cli/tests/TCPEchoServerTest.java
 (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/cli/tests/TCPExternalCommunication.java
 (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/cli/tests/Test.java 
(100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/cli/tests/TestELF.java 
(100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/cli/tests/TestRunner.java
 (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/cli/util/ELFLoader.java 
(100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/cli/util/Networking.java 
(100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/cli/util/Shrew.java 
(100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/net/Arp.java (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/net/DHCP.java (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/net/IFConfig.java (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/net/Route.java (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/trace/Callstack.java 
(100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/trace/Counter.java (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/trace/Tracepoint.java 
(100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/util/Exec.java (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/util/IStty.java (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/util/MD5.java (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/util/Power.java (100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/util/PrintClassPath.java 
(100%)
 rename {java => 
modules/java-mgmt}/cloudius/src/main/java/com/cloudius/util/Stty.java (100%)
 rename {java => modules/java-mgmt}/jni/balloon.c (100%)
 rename {java => modules/java-mgmt}/jni/elf-loader.cc (100%)
 rename {java => modules/java-mgmt}/jni/networking.cc (100%)
 rename {java => modules/java-mgmt}/jni/power.cc (100%)
 rename {java => modules/java-mgmt}/jni/stty.c (100%)
 rename {java => modules/java-mgmt}/jni/tracepoint.cc (100%)
 rename {java => modules/java-mgmt}/jni/tracepoint.hh (100%)
 create mode 100644 modules/java-mgmt/usr.manifest
 create mode 100644 modules/java-tests/.java.policy
 create mode 100644 modules/java-tests/Makefile
 rename {java => modules/java-tests}/pom.xml (93%)
 rename {java => modules/java-tests}/tests-isolates/pom.xml (80%)
 rename {java => 
modules/java-tests}/tests-isolates/src/main/java/tests/ClassFinder.java (100%)
 rename {java => 
modules/java-tests}/tests-isolates/src/main/java/tests/ClassPresentInBothContexts.java
 (100%)
 rename {java => 
modules/java-tests}/tests-isolates/src/main/java/tests/FieldTester.java (100%)
 rename {java => 
modules/java-tests}/tests-isolates/src/main/java/tests/LoggingProcess.java 
(100%)
 rename {java => 
modules/java-tests}/tests-isolates/src/main/java/tests/NonIsolatedLoggingProcess.java
 (100%)
 rename {java => 
modules/java-tests}/tests-isolates/src/main/java/tests/PropertyReader.java 
(100%)
 rename {java => 
modules/java-tests}/tests-isolates/src/main/java/tests/PropertySetter.java 
(100%)
 rename {java => 
modules/java-tests}/tests-isolates/src/main/java/tests/StaticFieldSetter.java 
(100%)
 rename {java => modules/java-tests}/tests-jre-extension/pom.xml (91%)
 rename {java => 
modules/java-tests}/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java
 (100%)
 rename {java => modules/java-tests}/tests/pom.xml (89%)
 rename {java => 
modules/java-tests}/tests/src/main/java/io/osv/AllTestsThatTestIsolatedApp.java 
(100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/io/osv/AllTestsThatTestNonIsolatedApp.java
 (100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java 
(100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/io/osv/ClassLoaderWithoutIsolationTest.java
 (100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/io/osv/LoggingIsolationTest.java (100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/io/osv/LoggingWithoutIsolationTest.java 
(100%)
 rename {java => modules/java-tests}/tests/src/main/java/io/osv/OsvApiTest.java 
(100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/io/osv/PropertyIsolationTest.java (100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/io/osv/TemporarySecurityManager.java 
(100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/io/osv/TestDomainPermissions.java (100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/io/osv/TestLaunching.java (100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/tests/ClassPresentInBothContexts.java 
(100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/tests/ClassPresentOnlyInParentContext.java
 (100%)
 rename {java => 
modules/java-tests}/tests/src/main/java/tests/ClassPutInRoot.java (100%)
 delete mode 100644 modules/java/Makefile
 delete mode 100644 modules/java/usr.manifest
 copy modules/{java => openjdk7}/module.py (75%)

diff --git a/.gitignore b/.gitignore
index b76d37e..7fc9553 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,8 @@
 build/
 .\#*
 \#*\#
-java/*/target
+modules/java-base/*/target
+modules/java-tests/*/target
 
 .gradle
 tags
@@ -24,11 +25,22 @@ tracefile
 
 build.out
 
-java/runjava/dependency-reduced-pom.xml
-java/jolokia-agent/dependency-reduced-pom.xml
+modules/java-base/**/dependency-reduced-pom.xml
+modules/java-base/**/*.iml
+modules/java-base/obj/
+modules/java-tests/**/*.iml
+modules/java-tests/obj/
+modules/java-isolated/obj/
+modules/java-non-isolated/obj/
+modules/java-mgmt/cloudius/target/
+modules/java-mgmt/obj/
+modules/httpserver/usr.manifest
 modules/httpserver-jolokia-plugin/autogen/
 modules/httpserver-jolokia-plugin/jolokia.so
 modules/httpserver-jolokia-plugin/obj/
+modules/httpserver-jolokia-plugin/jolokia-agent/target/
+modules/httpserver-jolokia-plugin/jolokia-agent/dependency-reduced-pom.xml
 modules/httpserver-jvm-plugin/autogen/
 modules/httpserver-jvm-plugin/jvm.so
 modules/httpserver-jvm-plugin/obj/
+.idea
diff --git a/Makefile b/Makefile
index 6265137..cf58c0a 100644
--- a/Makefile
+++ b/Makefile
@@ -131,17 +131,7 @@ endif
 quiet = $(if $V, $1, @echo " $2"; $1)
 very-quiet = $(if $V, $1, @$1)
 
-# TODO: These java-targets shouldn't be compiled here, but rather in 
modules/java/Makefile.
-# The problem is that getting the right compilation lines there is hard :-(
-ifeq ($(arch),aarch64)
-java-targets :=
-else
-java-targets := $(out)/java/jvm/java.so $(out)/java/jvm/java_non_isolated.so \
-       $(out)/java/jni/balloon.so $(out)/java/jni/elf-loader.so 
$(out)/java/jni/networking.so \
-        $(out)/java/jni/stty.so $(out)/java/jni/tracepoint.so 
$(out)/java/jni/power.so $(out)/java/jni/monitor.so
-endif
-
-all: $(out)/loader.img $(java-targets) links
+all: $(out)/loader.img links
 .PHONY: all
 
 links:
@@ -377,10 +367,6 @@ $(out)/%.o: %.c | generated-headers
        $(makedir)
        $(call quiet, $(CC) $(CFLAGS) -c -o $@ $<, CC $*.c)
 
-$(out)/java/jvm/java_non_isolated.o: java/jvm/java.cc | generated-headers
-       $(makedir)
-       $(call quiet, $(CXX) $(CXXFLAGS) -DRUN_JAVA_NON_ISOLATED -o $@ -c 
java/jvm/java.cc, CXX $<)
-
 $(out)/%.o: %.S
        $(makedir)
        $(call quiet, $(CXX) $(CXXFLAGS) $(ASFLAGS) -c -o $@ $<, AS $*.s)
diff --git a/java/jolokia-agent/pom.xml b/java/jolokia-agent/pom.xml
deleted file mode 100644
index a2b3742..0000000
--- a/java/jolokia-agent/pom.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
-       <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>io.osv</groupId>
-        <artifactId>java-parent</artifactId>
-        <version>${version}</version>
-    </parent>
-
-       <groupId>io.osv</groupId>
-       <artifactId>jolokia-agent</artifactId>
-
-
-       <dependencies>
-               <dependency>
-                       <groupId>org.jolokia</groupId>
-                       <artifactId>jolokia-core</artifactId>
-                       <version>1.2.2</version>
-               </dependency>
-       </dependencies>
-
-       <build>
-               <plugins>
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <configuration>
-                    <descriptorRefs>
-                        <descriptorRef>jar-with-dependencies</descriptorRef>
-                    </descriptorRefs>
-                    <finalName>${artifactId}</finalName>
-                    <appendAssemblyId>false</appendAssemblyId>
-                    <classifier>jar</classifier>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>make-jar-with-dependencies</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-shade-plugin</artifactId>
-                               <version>2.3</version>
-                               <executions>
-                                       <execution>
-                                               <phase>package</phase>
-                                               <goals>
-                                                       <goal>shade</goal>
-                                               </goals>
-                                               <configuration>
-                                                       
<minimizeJar>true</minimizeJar>
-                                               </configuration>
-                                       </execution>
-                               </executions>
-                       </plugin>
-               </plugins>
-       </build>
-
-</project>
\ No newline at end of file
diff --git a/modules/httpserver-jolokia-plugin/Makefile 
b/modules/httpserver-jolokia-plugin/Makefile
index 163ddbd..f89b02c 100644
--- a/modules/httpserver-jolokia-plugin/Makefile
+++ b/modules/httpserver-jolokia-plugin/Makefile
@@ -58,6 +58,7 @@ DEPS := $(OBJ_FILES:.o=.d)
 module: all
 
 all: $(TARGET).so
+       cd jolokia-agent && mvn package -DskipTests=true
 
 init:
        @echo "  MKDIRS"
@@ -90,3 +91,5 @@ clean:
        $(call very-quiet, $(RM) -f usr.manifest)
        $(call very-quiet, $(RM) -rf obj)
        $(call very-quiet, $(RM) -rf autogen)
+       cd jolokia-agent && mvn clean
+       -rm -f dependency-reduced-pom.xml
diff --git a/modules/httpserver-jolokia-plugin/jolokia-agent/pom.xml 
b/modules/httpserver-jolokia-plugin/jolokia-agent/pom.xml
new file mode 100644
index 0000000..2671abf
--- /dev/null
+++ b/modules/httpserver-jolokia-plugin/jolokia-agent/pom.xml
@@ -0,0 +1,78 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+
+    <properties>
+        <version>1.0-SNAPSHOT</version>
+    </properties>
+
+    <groupId>io.osv</groupId>
+    <artifactId>jolokia-agent</artifactId>
+    <version>${version}</version>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-dependency-plugin</artifactId>
+            <version>2.3</version>
+            <scope>provided</scope>
+        </dependency>
+       <dependency>
+           <groupId>org.jolokia</groupId>
+           <artifactId>jolokia-core</artifactId>
+           <version>1.2.2</version>
+       </dependency>
+   </dependencies>
+
+   <build>
+       <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                    <finalName>${project.artifactId}</finalName>
+                    <appendAssemblyId>false</appendAssemblyId>
+                    <classifier>jar</classifier>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-jar-with-dependencies</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+           <plugin>
+               <groupId>org.apache.maven.plugins</groupId>
+               <artifactId>maven-shade-plugin</artifactId>
+               <version>2.3</version>
+               <executions>
+                       <execution>
+                               <phase>package</phase>
+                               <goals>
+                                       <goal>shade</goal>
+                               </goals>
+                               <configuration>
+                                       <minimizeJar>true</minimizeJar>
+                               </configuration>
+                       </execution>
+               </executions>
+         </plugin>
+       </plugins>
+   </build>
+
+</project>
diff --git a/java/jolokia-agent/src/main/java/io/osv/jolokia/Dispatcher.java 
b/modules/httpserver-jolokia-plugin/jolokia-agent/src/main/java/io/osv/jolokia/Dispatcher.java
similarity index 100%
rename from java/jolokia-agent/src/main/java/io/osv/jolokia/Dispatcher.java
rename to 
modules/httpserver-jolokia-plugin/jolokia-agent/src/main/java/io/osv/jolokia/Dispatcher.java
diff --git 
a/java/jolokia-agent/src/main/java/io/osv/jolokia/RequestAndResponse.java 
b/modules/httpserver-jolokia-plugin/jolokia-agent/src/main/java/io/osv/jolokia/RequestAndResponse.java
similarity index 100%
rename from 
java/jolokia-agent/src/main/java/io/osv/jolokia/RequestAndResponse.java
rename to 
modules/httpserver-jolokia-plugin/jolokia-agent/src/main/java/io/osv/jolokia/RequestAndResponse.java
diff --git a/modules/httpserver-jolokia-plugin/module.py 
b/modules/httpserver-jolokia-plugin/module.py
index 6b858af..34f8c00 100644
--- a/modules/httpserver-jolokia-plugin/module.py
+++ b/modules/httpserver-jolokia-plugin/module.py
@@ -8,4 +8,4 @@ _module = '${OSV_BASE}/modules/httpserver-jolokia-plugin'
 usr_files = FileMap()
 usr_files.add(os.path.join(_module, 
'jolokia.so')).to('/usr/mgmt/plugins/jolokia.so')
 usr_files.add(os.path.join(_module, 
'api-doc/listings/jolokia.json')).to('/usr/mgmt/api/listings/jolokia.json')
-usr_files.add('${OSV_BASE}/java/jolokia-agent/target/jolokia-agent.jar').to('/usr/mgmt/jolokia-agent.jar')
+usr_files.add(os.path.join(_module, 
'jolokia-agent/target/jolokia-agent.jar')).to('/usr/mgmt/jolokia-agent.jar')
diff --git a/modules/httpserver/module.py b/modules/httpserver/module.py
index ae3f041..7a83a04 100644
--- a/modules/httpserver/module.py
+++ b/modules/httpserver/module.py
@@ -17,6 +17,11 @@ api.require('openssl')
 api.require('libtools')
 api.require('libyaml')
 
+# only require next 3 modules if java (jre) is included in the list of modules
+api.require_if_other_module_present('josvsym','java')
+api.require_if_other_module_present('httpserver-jolokia-plugin','java')
+api.require_if_other_module_present('httpserver-jvm-plugin','java')
+
 # httpserver will run regardless of an explicit command line
 # passed with "run.py -e".
 daemon = api.run_on_init(_exe + ' &!')
diff --git a/modules/java-base/Makefile b/modules/java-base/Makefile
new file mode 100644
index 0000000..13c1858
--- /dev/null
+++ b/modules/java-base/Makefile
@@ -0,0 +1,19 @@
+include common.gmk
+
+ifeq ($(arch),aarch64)
+java-targets :=
+else
+java-targets := obj/jni/monitor.so
+endif
+
+module: all
+
+all: $(init) $(java-targets)
+
+init:
+       @echo "  MKDIRS"
+       $(call very-quiet, mkdir -p obj/jni)
+.PHONY: init
+
+clean:
+       $(call very-quiet, $(RM) -rf obj)
diff --git a/modules/java-base/common.gmk b/modules/java-base/common.gmk
new file mode 100644
index 0000000..9331ce6
--- /dev/null
+++ b/modules/java-base/common.gmk
@@ -0,0 +1,46 @@
+
+INCLUDES = -I$(src)/arch/$(arch) -I$(src) -I$(src)/include -I$(src)/arch/common
+INCLUDES += -I$(src)/include/glibc-compat
+INCLUDES += -isystem $(src)/external/$(arch)/acpica/source/include
+INCLUDES += $(shell $(CXX) -E -xc++ - -v </dev/null 2>&1 | awk '/^End/ {exit} 
/^ .*c\+\+/ {print "-isystem" $$0}')
+INCLUDES += -isystem $(src)/include/api
+INCLUDES += -isystem $(src)/include/api/$(arch)
+INCLUDES += -I$(src)/build/$(mode)/gen/include -isystem 
$(miscbase)/usr/include 
+INCLUDES += -I$(src)/java 
+INCLUDES += -I$(jdkbase)/include -I$(jdkbase)/include/linux
+
+autodepend = -MD -MT $@ -MP
+COMMON_FLAGS  = -g -Wall -fPIC $(INCLUDES) -O2 $(autodepend) 
-DCONF_debug_memory=0 -D_KERNEL
+CXXFLAGS  = -std=c++11 $(COMMON_FLAGS)
+CFLAGS = -std=gnu99 $(COMMON_FLAGS)
+#CXXFLAGS  = -g -Wall -std=c++11 -fPIC $(INCLUDES) -O2 $(autodepend) 
$(configuration) 
+src = $(shell readlink -f ../..)
+
+RM := /bin/rm
+
+ifndef arch
+       arch = x64
+endif
+
+ifndef mode
+       mode = release
+endif
+
+miscbase = $(src)/external/$(arch)/misc.bin
+
+configuration-defines = conf-preempt conf-debug_memory conf-logger_debug
+
+configuration = $(foreach cf,$(configuration-defines), \
+                      -D$(cf:conf-%=CONF_%)=$($(cf)))
+
+quiet = $(if $V, $1, @echo " $2"; $1)
+very-quiet = $(if $V, $1, @$1)
+
+obj/%.o: %.cc | init
+       $(call quiet, $(CXX) $(CXXFLAGS) -c -MMD  -o $@ $<, CXX $@)
+
+obj/%.o: %.c | init
+       $(call quiet, $(CC) $(CFLAGS) -c -MMD  -o $@ $<, CC $@)
+
+%.so: %.o
+       $(call quiet, $(CXX) $(CXXFLAGS) -shared -o $@ $^, LINK $@)
diff --git a/java/jvm/java.cc b/modules/java-base/java.cc
similarity index 97%
rename from java/jvm/java.cc
rename to modules/java-base/java.cc
index e1b6da8..d448a3a 100644
--- a/java/jvm/java.cc
+++ b/modules/java-base/java.cc
@@ -12,11 +12,11 @@
 #include <unistd.h>
 #include <regex>
 #include <osv/debug.hh>
-#include "jvm_balloon.hh"
+#include <java/jvm/jvm_balloon.hh>
 #include <osv/mempool.hh>
-#include "java_api.hh"
+#include <java/jvm/java_api.hh>
 #include "osv/version.hh"
-#include "jni_helpers.hh"
+#include <java/jvm/jni_helpers.hh>
 #include <osv/defer.hh>
 #include <osv/app.hh>
 
@@ -30,11 +30,12 @@ extern size_t jvm_heap_size;
 // parameters.
 
 #define JVM_PATH         "/usr/lib/jvm/jre/lib/amd64/server/libjvm.so"
-#define RUNJAVA_JAR_PATH "/java/runjava.jar"
 
 #if defined(RUN_JAVA_NON_ISOLATED)
+#define RUNJAVA_JAR_PATH "/java/runjava-non-isolated.jar"
 #define RUNJAVA          "io/osv/nonisolated/RunNonIsolatedJvmApp"    // 
separated by slashes, not dots
 #else
+#define RUNJAVA_JAR_PATH "/java/runjava-isolated.jar"
 #define RUNJAVA          "io/osv/isolated/RunIsolatedJvmApp"    // separated 
by slashes, not dots
 #endif
 
diff --git a/java/jni/monitor.cc b/modules/java-base/jni/monitor.cc
similarity index 100%
rename from java/jni/monitor.cc
rename to modules/java-base/jni/monitor.cc
diff --git a/java/jni/monitor.hh b/modules/java-base/jni/monitor.hh
similarity index 100%
rename from java/jni/monitor.hh
rename to modules/java-base/jni/monitor.hh
diff --git a/modules/java-base/module.py b/modules/java-base/module.py
new file mode 100644
index 0000000..3589a53
--- /dev/null
+++ b/modules/java-base/module.py
@@ -0,0 +1,5 @@
+from osv.modules import api
+
+api.require('fonts')
+api.require('ca-certificates')
+api.require('libz')
diff --git a/modules/java-base/pom.xml b/modules/java-base/pom.xml
new file mode 100644
index 0000000..433b9fb
--- /dev/null
+++ b/modules/java-base/pom.xml
@@ -0,0 +1,44 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+
+    <properties>
+        <version>1.0-SNAPSHOT</version>
+    </properties>
+
+    <groupId>io.osv</groupId>
+    <artifactId>java-parent</artifactId>
+    <version>${version}</version>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>runjava-common</module>
+        <module>runjava-isolated</module>
+        <module>runjava-non-isolated</module>
+    </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-dependency-plugin</artifactId>
+            <version>2.3</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/java/cloudius/pom.xml b/modules/java-base/runjava-common/pom.xml
similarity index 81%
rename from java/cloudius/pom.xml
rename to modules/java-base/runjava-common/pom.xml
index 52542e8..4a22315 100644
--- a/java/cloudius/pom.xml
+++ b/modules/java-base/runjava-common/pom.xml
@@ -10,10 +10,6 @@
         <version>${version}</version>
     </parent>
 
-    <artifactId>cloudius</artifactId>
+    <artifactId>runjava-common</artifactId>
     <packaging>jar</packaging>
-
-    <build>
-        <finalName>cloudius</finalName>
-    </build>
 </project>
diff --git 
a/java/runjava/src/main/java/io/osv/AppThreadTerminatedWithUncaughtException.java
 
b/modules/java-base/runjava-common/src/main/java/io/osv/AppThreadTerminatedWithUncaughtException.java
similarity index 100%
rename from 
java/runjava/src/main/java/io/osv/AppThreadTerminatedWithUncaughtException.java
rename to 
modules/java-base/runjava-common/src/main/java/io/osv/AppThreadTerminatedWithUncaughtException.java
diff --git a/java/runjava/src/main/java/io/osv/GCInfo.java 
b/modules/java-base/runjava-common/src/main/java/io/osv/GCInfo.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/GCInfo.java
rename to modules/java-base/runjava-common/src/main/java/io/osv/GCInfo.java
diff --git a/java/runjava/src/main/java/io/osv/JavaInfo.java 
b/modules/java-base/runjava-common/src/main/java/io/osv/JavaInfo.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/JavaInfo.java
rename to modules/java-base/runjava-common/src/main/java/io/osv/JavaInfo.java
diff --git a/java/runjava/src/main/java/io/osv/Jvm.java 
b/modules/java-base/runjava-common/src/main/java/io/osv/Jvm.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/Jvm.java
rename to modules/java-base/runjava-common/src/main/java/io/osv/Jvm.java
diff --git a/java/runjava/src/main/java/io/osv/MainClassNotFoundException.java 
b/modules/java-base/runjava-common/src/main/java/io/osv/MainClassNotFoundException.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/MainClassNotFoundException.java
rename to 
modules/java-base/runjava-common/src/main/java/io/osv/MainClassNotFoundException.java
diff --git a/java/runjava/src/main/java/io/osv/OSvGCMonitor.java 
b/modules/java-base/runjava-common/src/main/java/io/osv/OSvGCMonitor.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/OSvGCMonitor.java
rename to 
modules/java-base/runjava-common/src/main/java/io/osv/OSvGCMonitor.java
diff --git a/java/runjava/src/main/java/io/osv/RunJvmAppHelper.java 
b/modules/java-base/runjava-common/src/main/java/io/osv/RunJvmAppHelper.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/RunJvmAppHelper.java
rename to 
modules/java-base/runjava-common/src/main/java/io/osv/RunJvmAppHelper.java
diff --git a/java/runjava/src/main/java/io/osv/util/ClassDiagnostics.java 
b/modules/java-base/runjava-common/src/main/java/io/osv/util/ClassDiagnostics.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/util/ClassDiagnostics.java
rename to 
modules/java-base/runjava-common/src/main/java/io/osv/util/ClassDiagnostics.java
diff --git a/java/runjava/src/main/java/io/osv/util/json/ArrayBuilder.java 
b/modules/java-base/runjava-common/src/main/java/io/osv/util/json/ArrayBuilder.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/util/json/ArrayBuilder.java
rename to 
modules/java-base/runjava-common/src/main/java/io/osv/util/json/ArrayBuilder.java
diff --git a/java/runjava/src/main/java/io/osv/util/json/JsonGenerator.java 
b/modules/java-base/runjava-common/src/main/java/io/osv/util/json/JsonGenerator.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/util/json/JsonGenerator.java
rename to 
modules/java-base/runjava-common/src/main/java/io/osv/util/json/JsonGenerator.java
diff --git a/java/runjava/pom.xml b/modules/java-base/runjava-isolated/pom.xml
similarity index 90%
rename from java/runjava/pom.xml
rename to modules/java-base/runjava-isolated/pom.xml
index feed5f1..5129011 100644
--- a/java/runjava/pom.xml
+++ b/modules/java-base/runjava-isolated/pom.xml
@@ -10,11 +10,16 @@
         <version>${version}</version>
     </parent>
 
-    <artifactId>runjava</artifactId>
+    <artifactId>runjava-isolated</artifactId>
     <packaging>jar</packaging>
 
     <dependencies>
         <dependency>
+            <groupId>io.osv</groupId>
+            <artifactId>runjava-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>cglib</groupId>
             <artifactId>cglib</artifactId>
             <version>3.1</version>
@@ -29,7 +34,7 @@
                     <descriptorRefs>
                         <descriptorRef>jar-with-dependencies</descriptorRef>
                     </descriptorRefs>
-                    <finalName>runjava</finalName>
+                    <finalName>runjava-isolated</finalName>
                     <appendAssemblyId>false</appendAssemblyId>
                     <classifier>jar</classifier>
                 </configuration>
diff --git a/java/runjava/src/main/java/io/osv/isolated/Context.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/Context.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/isolated/Context.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/Context.java
diff --git 
a/java/runjava/src/main/java/io/osv/isolated/ContextFailedException.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/ContextFailedException.java
similarity index 100%
rename from 
java/runjava/src/main/java/io/osv/isolated/ContextFailedException.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/ContextFailedException.java
diff --git a/java/runjava/src/main/java/io/osv/isolated/IsolatedJvm.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/IsolatedJvm.java
similarity index 98%
rename from java/runjava/src/main/java/io/osv/isolated/IsolatedJvm.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/IsolatedJvm.java
index 217d00a..2e820e3 100644
--- a/java/runjava/src/main/java/io/osv/isolated/IsolatedJvm.java
+++ 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/IsolatedJvm.java
@@ -188,7 +188,7 @@ public class IsolatedJvm extends Jvm<Context> {
         @Override
         protected PermissionCollection getPermissions(CodeSource codesource) {
             PermissionCollection permissions = 
super.getPermissions(codesource);
-            permissions.add(new FilePermission("/java/runjava.jar", "read"));
+            permissions.add(new FilePermission("/java/runjava-isolated.jar", 
"read"));
             permissions.add(new RuntimePermission("exitVM"));
             permissions.add(new RuntimePermission("shutdownHooks"));
             permissions.add(new RuntimePermission("setContextClassLoader"));
diff --git 
a/java/runjava/src/main/java/io/osv/isolated/IsolatingOsvSystemClassLoader.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/IsolatingOsvSystemClassLoader.java
similarity index 100%
rename from 
java/runjava/src/main/java/io/osv/isolated/IsolatingOsvSystemClassLoader.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/IsolatingOsvSystemClassLoader.java
diff --git a/java/runjava/src/main/java/io/osv/isolated/MultiJarLoader.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/MultiJarLoader.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/isolated/MultiJarLoader.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/MultiJarLoader.java
diff --git a/java/runjava/src/main/java/io/osv/isolated/RunIsolatedJvmApp.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/RunIsolatedJvmApp.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/isolated/RunIsolatedJvmApp.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/isolated/RunIsolatedJvmApp.java
diff --git a/java/runjava/src/main/java/io/osv/jul/DefaultLogManager.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/jul/DefaultLogManager.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/jul/DefaultLogManager.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/jul/DefaultLogManager.java
diff --git a/java/runjava/src/main/java/io/osv/jul/IsolatingLogManager.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/jul/IsolatingLogManager.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/jul/IsolatingLogManager.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/jul/IsolatingLogManager.java
diff --git a/java/runjava/src/main/java/io/osv/jul/LogManagerWrapper.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/jul/LogManagerWrapper.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/jul/LogManagerWrapper.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/jul/LogManagerWrapper.java
diff --git 
a/java/runjava/src/main/java/io/osv/util/InitializationException.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/util/InitializationException.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/util/InitializationException.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/util/InitializationException.java
diff --git a/java/runjava/src/main/java/io/osv/util/LazilyInitialized.java 
b/modules/java-base/runjava-isolated/src/main/java/io/osv/util/LazilyInitialized.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/util/LazilyInitialized.java
rename to 
modules/java-base/runjava-isolated/src/main/java/io/osv/util/LazilyInitialized.java
diff --git a/java/tests-isolates/pom.xml 
b/modules/java-base/runjava-non-isolated/pom.xml
similarity index 77%
copy from java/tests-isolates/pom.xml
copy to modules/java-base/runjava-non-isolated/pom.xml
index 249e091..d7f503a 100644
--- a/java/tests-isolates/pom.xml
+++ b/modules/java-base/runjava-non-isolated/pom.xml
@@ -10,23 +10,18 @@
         <version>${version}</version>
     </parent>
 
-    <artifactId>tests-isolates</artifactId>
+    <artifactId>runjava-non-isolated</artifactId>
     <packaging>jar</packaging>
 
     <dependencies>
         <dependency>
             <groupId>io.osv</groupId>
-            <artifactId>runjava</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
+            <artifactId>runjava-common</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
     <build>
-        <finalName>tests-isolates</finalName>
         <plugins>
             <plugin>
                 <artifactId>maven-assembly-plugin</artifactId>
@@ -34,11 +29,14 @@
                     <descriptorRefs>
                         <descriptorRef>jar-with-dependencies</descriptorRef>
                     </descriptorRefs>
+                    <finalName>runjava-non-isolated</finalName>
+                    <appendAssemblyId>false</appendAssemblyId>
+                    <classifier>jar</classifier>
                 </configuration>
                 <executions>
                     <execution>
                         <id>make-jar-with-dependencies</id>
-                        <phase>compile</phase>
+                        <phase>package</phase>
                         <goals>
                             <goal>single</goal>
                         </goals>
diff --git a/java/runjava/src/main/java/io/osv/nonisolated/NonIsolatedJvm.java 
b/modules/java-base/runjava-non-isolated/src/main/java/io/osv/nonisolated/NonIsolatedJvm.java
similarity index 100%
rename from java/runjava/src/main/java/io/osv/nonisolated/NonIsolatedJvm.java
rename to 
modules/java-base/runjava-non-isolated/src/main/java/io/osv/nonisolated/NonIsolatedJvm.java
diff --git 
a/java/runjava/src/main/java/io/osv/nonisolated/NonIsolatingOsvSystemClassLoader.java
 
b/modules/java-base/runjava-non-isolated/src/main/java/io/osv/nonisolated/NonIsolatingOsvSystemClassLoader.java
similarity index 100%
rename from 
java/runjava/src/main/java/io/osv/nonisolated/NonIsolatingOsvSystemClassLoader.java
rename to 
modules/java-base/runjava-non-isolated/src/main/java/io/osv/nonisolated/NonIsolatingOsvSystemClassLoader.java
diff --git 
a/java/runjava/src/main/java/io/osv/nonisolated/RunNonIsolatedJvmApp.java 
b/modules/java-base/runjava-non-isolated/src/main/java/io/osv/nonisolated/RunNonIsolatedJvmApp.java
similarity index 100%
rename from 
java/runjava/src/main/java/io/osv/nonisolated/RunNonIsolatedJvmApp.java
rename to 
modules/java-base/runjava-non-isolated/src/main/java/io/osv/nonisolated/RunNonIsolatedJvmApp.java
diff --git a/modules/java-tests/usr.manifest b/modules/java-base/usr.manifest
similarity index 52%
copy from modules/java-tests/usr.manifest
copy to modules/java-base/usr.manifest
index 0dca54e..535f0b2 100644
--- a/modules/java-tests/usr.manifest
+++ b/modules/java-base/usr.manifest
@@ -6,4 +6,7 @@
 #
 
 [manifest]
-/java_non_isolated.so: java/jvm/java_non_isolated.so
+/usr/lib/&/libexpat.so.1: %(miscbase)s/usr/lib64/&
+/usr/lib/&/libjpeg.so.62: %(miscbase)s/usr/lib64/&
+/usr/lib/jni/monitor.so: ${MODULE_DIR}/obj/jni/monitor.so
+/usr/lib/libosv.so: libosv.so
diff --git a/modules/java-cmd/module.py b/modules/java-cmd/module.py
new file mode 100644
index 0000000..2e22534
--- /dev/null
+++ b/modules/java-cmd/module.py
@@ -0,0 +1,3 @@
+from osv.modules import api
+
+api.require('java-isolated')
diff --git a/modules/java/.java.policy b/modules/java-isolated/.java.policy
similarity index 50%
rename from modules/java/.java.policy
rename to modules/java-isolated/.java.policy
index af1cdc7..fb6aae4 100644
--- a/modules/java/.java.policy
+++ b/modules/java-isolated/.java.policy
@@ -1,3 +1,3 @@
-grant codeBase "file:/java/runjava.jar" {
+grant codeBase "file:/java/runjava-isolated.jar" {
         permission java.security.AllPermission;
 };
diff --git a/modules/java-isolated/Makefile b/modules/java-isolated/Makefile
new file mode 100644
index 0000000..a3ac9f4
--- /dev/null
+++ b/modules/java-isolated/Makefile
@@ -0,0 +1,24 @@
+SRC = $(shell readlink -f ../..)
+
+include $(SRC)/modules/java-base/common.gmk
+
+ifeq ($(arch),aarch64)
+java-targets :=
+else
+java-targets := obj/java.so
+endif
+
+obj/java.o: $(SRC)/modules/java-base/java.cc | init
+       $(call quiet, $(CXX) $(CXXFLAGS) -o $@ -c 
$(SRC)/modules/java-base/java.cc -MMD, CXX $@)
+
+init:
+       @echo "  MKDIRS"
+       $(call very-quiet, mkdir -p obj)
+
+module: $(java-targets)
+       cd $(SRC)/modules/java-base && mvn --projects 
:runjava-common,:runjava-isolated  package -DskipTests=true
+
+clean:
+       cd $(SRC)/modules/java-base && mvn clean
+       -rm -f dependency-reduced-pom.xml
+       $(call very-quiet, $(RM) -rf obj)
diff --git a/modules/java-isolated/module.py b/modules/java-isolated/module.py
new file mode 100644
index 0000000..b28f242
--- /dev/null
+++ b/modules/java-isolated/module.py
@@ -0,0 +1,4 @@
+from osv.modules import api
+
+api.require('java-base')
+provides = ['java-cmd']
diff --git a/modules/java-tests/usr.manifest 
b/modules/java-isolated/usr.manifest
similarity index 53%
copy from modules/java-tests/usr.manifest
copy to modules/java-isolated/usr.manifest
index 0dca54e..c98ba62 100644
--- a/modules/java-tests/usr.manifest
+++ b/modules/java-isolated/usr.manifest
@@ -6,4 +6,6 @@
 #
 
 [manifest]
-/java_non_isolated.so: java/jvm/java_non_isolated.so
+/java.so: ${MODULE_DIR}/obj/java.so
+/java/runjava-isolated.jar: 
${OSV_BASE}/modules/java-base/runjava-isolated/target/runjava-isolated.jar
+/.java.policy: ${MODULE_DIR}/.java.policy
diff --git a/modules/java-mgmt/Makefile b/modules/java-mgmt/Makefile
new file mode 100644
index 0000000..3bee16a
--- /dev/null
+++ b/modules/java-mgmt/Makefile
@@ -0,0 +1,23 @@
+SRC = $(shell readlink -f ../..)
+
+include $(SRC)/modules/java-base/common.gmk
+
+ifeq ($(arch),aarch64)
+java-targets :=
+else
+java-targets := obj/jni/balloon.so obj/jni/elf-loader.so obj/jni/networking.so 
\
+       obj/jni/stty.so obj/jni/tracepoint.so obj/jni/power.so
+endif
+
+module: all
+
+all: $(java-targets)
+
+init:
+       @echo "  MKDIRS"
+       $(call very-quiet, mkdir -p obj)
+       $(call very-quiet, mkdir -p obj/jni)
+
+clean:
+       $(call very-quiet, $(RM) -rf obj)
+       $(call very-quiet, $(RM) -rf obj/jni)
diff --git a/modules/java-mgmt/cloudius/pom.xml 
b/modules/java-mgmt/cloudius/pom.xml
new file mode 100644
index 0000000..a82ba7b
--- /dev/null
+++ b/modules/java-mgmt/cloudius/pom.xml
@@ -0,0 +1,30 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+
+    <properties>
+        <version>1.0-SNAPSHOT</version>
+    </properties>
+
+    <groupId>io.osv</groupId>
+    <artifactId>cloudius</artifactId>
+    <version>${version}</version>
+    <packaging>jar</packaging>
+
+    <build>
+        <finalName>cloudius</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/java/cloudius/src/main/java/com/cloudius/Config.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/Config.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/Config.java
rename to modules/java-mgmt/cloudius/src/main/java/com/cloudius/Config.java
diff --git a/java/cloudius/src/main/java/com/cloudius/balloon/Balloon.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/balloon/Balloon.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/balloon/Balloon.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/balloon/Balloon.java
diff --git 
a/java/cloudius/src/main/java/com/cloudius/cli/tests/TCPConcurrentDownloads.java
 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TCPConcurrentDownloads.java
similarity index 100%
rename from 
java/cloudius/src/main/java/com/cloudius/cli/tests/TCPConcurrentDownloads.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TCPConcurrentDownloads.java
diff --git 
a/java/cloudius/src/main/java/com/cloudius/cli/tests/TCPDownloadFile.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TCPDownloadFile.java
similarity index 100%
rename from 
java/cloudius/src/main/java/com/cloudius/cli/tests/TCPDownloadFile.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TCPDownloadFile.java
diff --git 
a/java/cloudius/src/main/java/com/cloudius/cli/tests/TCPEchoServerTest.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TCPEchoServerTest.java
similarity index 100%
rename from 
java/cloudius/src/main/java/com/cloudius/cli/tests/TCPEchoServerTest.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TCPEchoServerTest.java
diff --git 
a/java/cloudius/src/main/java/com/cloudius/cli/tests/TCPExternalCommunication.java
 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TCPExternalCommunication.java
similarity index 100%
rename from 
java/cloudius/src/main/java/com/cloudius/cli/tests/TCPExternalCommunication.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TCPExternalCommunication.java
diff --git a/java/cloudius/src/main/java/com/cloudius/cli/tests/Test.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/Test.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/cli/tests/Test.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/Test.java
diff --git a/java/cloudius/src/main/java/com/cloudius/cli/tests/TestELF.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TestELF.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/cli/tests/TestELF.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TestELF.java
diff --git a/java/cloudius/src/main/java/com/cloudius/cli/tests/TestRunner.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TestRunner.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/cli/tests/TestRunner.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/tests/TestRunner.java
diff --git a/java/cloudius/src/main/java/com/cloudius/cli/util/ELFLoader.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/util/ELFLoader.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/cli/util/ELFLoader.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/util/ELFLoader.java
diff --git a/java/cloudius/src/main/java/com/cloudius/cli/util/Networking.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/util/Networking.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/cli/util/Networking.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/util/Networking.java
diff --git a/java/cloudius/src/main/java/com/cloudius/cli/util/Shrew.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/util/Shrew.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/cli/util/Shrew.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/cli/util/Shrew.java
diff --git a/java/cloudius/src/main/java/com/cloudius/net/Arp.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/net/Arp.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/net/Arp.java
rename to modules/java-mgmt/cloudius/src/main/java/com/cloudius/net/Arp.java
diff --git a/java/cloudius/src/main/java/com/cloudius/net/DHCP.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/net/DHCP.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/net/DHCP.java
rename to modules/java-mgmt/cloudius/src/main/java/com/cloudius/net/DHCP.java
diff --git a/java/cloudius/src/main/java/com/cloudius/net/IFConfig.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/net/IFConfig.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/net/IFConfig.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/net/IFConfig.java
diff --git a/java/cloudius/src/main/java/com/cloudius/net/Route.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/net/Route.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/net/Route.java
rename to modules/java-mgmt/cloudius/src/main/java/com/cloudius/net/Route.java
diff --git a/java/cloudius/src/main/java/com/cloudius/trace/Callstack.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/trace/Callstack.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/trace/Callstack.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/trace/Callstack.java
diff --git a/java/cloudius/src/main/java/com/cloudius/trace/Counter.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/trace/Counter.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/trace/Counter.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/trace/Counter.java
diff --git a/java/cloudius/src/main/java/com/cloudius/trace/Tracepoint.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/trace/Tracepoint.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/trace/Tracepoint.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/trace/Tracepoint.java
diff --git a/java/cloudius/src/main/java/com/cloudius/util/Exec.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/Exec.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/util/Exec.java
rename to modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/Exec.java
diff --git a/java/cloudius/src/main/java/com/cloudius/util/IStty.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/IStty.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/util/IStty.java
rename to modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/IStty.java
diff --git a/java/cloudius/src/main/java/com/cloudius/util/MD5.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/MD5.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/util/MD5.java
rename to modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/MD5.java
diff --git a/java/cloudius/src/main/java/com/cloudius/util/Power.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/Power.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/util/Power.java
rename to modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/Power.java
diff --git a/java/cloudius/src/main/java/com/cloudius/util/PrintClassPath.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/PrintClassPath.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/util/PrintClassPath.java
rename to 
modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/PrintClassPath.java
diff --git a/java/cloudius/src/main/java/com/cloudius/util/Stty.java 
b/modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/Stty.java
similarity index 100%
rename from java/cloudius/src/main/java/com/cloudius/util/Stty.java
rename to modules/java-mgmt/cloudius/src/main/java/com/cloudius/util/Stty.java
diff --git a/java/jni/balloon.c b/modules/java-mgmt/jni/balloon.c
similarity index 100%
rename from java/jni/balloon.c
rename to modules/java-mgmt/jni/balloon.c
diff --git a/java/jni/elf-loader.cc b/modules/java-mgmt/jni/elf-loader.cc
similarity index 100%
rename from java/jni/elf-loader.cc
rename to modules/java-mgmt/jni/elf-loader.cc
diff --git a/java/jni/networking.cc b/modules/java-mgmt/jni/networking.cc
similarity index 100%
rename from java/jni/networking.cc
rename to modules/java-mgmt/jni/networking.cc
diff --git a/java/jni/power.cc b/modules/java-mgmt/jni/power.cc
similarity index 100%
rename from java/jni/power.cc
rename to modules/java-mgmt/jni/power.cc
diff --git a/java/jni/stty.c b/modules/java-mgmt/jni/stty.c
similarity index 100%
rename from java/jni/stty.c
rename to modules/java-mgmt/jni/stty.c
diff --git a/java/jni/tracepoint.cc b/modules/java-mgmt/jni/tracepoint.cc
similarity index 100%
rename from java/jni/tracepoint.cc
rename to modules/java-mgmt/jni/tracepoint.cc
diff --git a/java/jni/tracepoint.hh b/modules/java-mgmt/jni/tracepoint.hh
similarity index 100%
rename from java/jni/tracepoint.hh
rename to modules/java-mgmt/jni/tracepoint.hh
diff --git a/modules/java-mgmt/usr.manifest b/modules/java-mgmt/usr.manifest
new file mode 100644
index 0000000..2a2544f
--- /dev/null
+++ b/modules/java-mgmt/usr.manifest
@@ -0,0 +1,8 @@
+[manifest]
+/usr/lib/jni/balloon.so: ${MODULE_DIR}/obj/jni/balloon.so
+/usr/lib/jni/elf-loader.so: ${MODULE_DIR}/obj/jni/elf-loader.so
+/usr/lib/jni/networking.so: ${MODULE_DIR}/obj/jni/networking.so
+/usr/lib/jni/stty.so: ${MODULE_DIR}/obj/jni/stty.so
+/usr/lib/jni/tracepoint.so: ${MODULE_DIR}/obj/jni/stty.so
+/usr/lib/jni/power.so: ${MODULE_DIR}/obj/jni/power.so
+/java/cloudius.jar: ${MODULE_DIR}/cloudius/target/cloudius.jar
diff --git a/modules/java-non-isolated/.java.policy 
b/modules/java-non-isolated/.java.policy
index af1cdc7..30a4cf3 100644
--- a/modules/java-non-isolated/.java.policy
+++ b/modules/java-non-isolated/.java.policy
@@ -1,3 +1,3 @@
-grant codeBase "file:/java/runjava.jar" {
+grant codeBase "file:/java/runjava-non-isolated.jar" {
         permission java.security.AllPermission;
 };
diff --git a/modules/java-non-isolated/Makefile 
b/modules/java-non-isolated/Makefile
index d5d916e..519781e 100644
--- a/modules/java-non-isolated/Makefile
+++ b/modules/java-non-isolated/Makefile
@@ -1,10 +1,24 @@
-# TODO: need to move compilation of $(java-targets) from the main makefile
-# to here. Unfortunately, compiling with OSv header files is a big mess,
-# and much easier to do it in the main OSv makefile :-(
 SRC = $(shell readlink -f ../..)
-module:
-       cd $(SRC)/java && mvn package -DskipTests=true
+
+include $(SRC)/modules/java-base/common.gmk
+
+ifeq ($(arch),aarch64)
+java-targets :=
+else
+java-targets := obj/java_non_isolated.so
+endif
+
+obj/java_non_isolated.o: $(SRC)/modules/java-base/java.cc | init
+       $(call quiet, $(CXX) $(CXXFLAGS) -DRUN_JAVA_NON_ISOLATED -o $@ -c 
$(SRC)/modules/java-base/java.cc -MMD, CXX $@)
+
+init:
+       @echo "  MKDIRS"
+       $(call very-quiet, mkdir -p obj)
+
+module: $(java-targets)
+       cd $(SRC)/modules/java-base && mvn --projects 
:runjava-common,:runjava-non-isolated package -DskipTests=true
 
 clean:
-       cd $(SRC)/java && mvn clean
+       cd $(SRC)/modules/java-base && mvn clean
        -rm -f dependency-reduced-pom.xml
+       $(call very-quiet, $(RM) -rf obj)
diff --git a/modules/java-non-isolated/module.py 
b/modules/java-non-isolated/module.py
index 1f5b401..bd2ab16 100644
--- a/modules/java-non-isolated/module.py
+++ b/modules/java-non-isolated/module.py
@@ -1,28 +1,5 @@
-from osv.modules.filemap import FileMap
 from osv.modules import api
-import os, os.path
 
-usr_files = FileMap()
-
-provides = ['java']
-
-non_isolated_jvm = True
-
-api.require('fonts')
-api.require('ca-certificates')
-api.require('libz')
-api.require('josvsym')
-api.require('httpserver-jolokia-plugin')
-api.require('httpserver-jvm-plugin')
-
-jdkdir = os.path.basename(os.path.expandvars('${jdkbase}'))
-
-usr_files.add('${jdkbase}').to('/usr/lib/jvm/java') \
-    .include('lib/**') \
-    .include('jre/**') \
-    .exclude('jre/lib/security/cacerts') \
-    .exclude('jre/lib/audio/**')
-
-usr_files.link('/usr/lib/jvm/' + jdkdir).to('java')
-usr_files.link('/usr/lib/jvm/jre').to('java/jre')
-usr_files.link('/usr/lib/jvm/java/jre/lib/security/cacerts').to('/etc/pki/java/cacerts')
+java_base = api.require('java-base')
+java_base.non_isolated_jvm = True
+provides = ['java-cmd']
diff --git a/modules/java-non-isolated/usr.manifest 
b/modules/java-non-isolated/usr.manifest
index cd02161..00eab90 100644
--- a/modules/java-non-isolated/usr.manifest
+++ b/modules/java-non-isolated/usr.manifest
@@ -6,17 +6,6 @@
 #
 
 [manifest]
-/usr/lib/&/libexpat.so.1: %(miscbase)s/usr/lib64/&
-/usr/lib/&/libjpeg.so.62: %(miscbase)s/usr/lib64/&
-/usr/lib/jni/balloon.so: java/jni/balloon.so
-/usr/lib/jni/monitor.so: java/jni/monitor.so
-/usr/lib/&/jni/elf-loader.so: java/&
-/usr/lib/&/jni/networking.so: java/&
-/usr/lib/&/jni/stty.so: java/&
-/usr/lib/&/jni/tracepoint.so: java/&
-/usr/lib/&/jni/power.so: java/&
-/java.so: java/jvm/java_non_isolated.so
-/usr/lib/libosv.so: libosv.so
-/java/runjava.jar: ${OSV_BASE}/java/runjava/target/runjava.jar
-/java/cloudius.jar: ${OSV_BASE}/java/cloudius/target/cloudius.jar
-/.java.policy: ${OSV_BASE}/modules/java/.java.policy
+/java.so: ${MODULE_DIR}/obj/java_non_isolated.so
+/java/runjava-non-isolated.jar: 
${OSV_BASE}/modules/java-base/runjava-non-isolated/target/runjava-non-isolated.jar
+/.java.policy: ${MODULE_DIR}/.java.policy
diff --git a/modules/java-tests/.java.policy b/modules/java-tests/.java.policy
new file mode 100644
index 0000000..27ae355
--- /dev/null
+++ b/modules/java-tests/.java.policy
@@ -0,0 +1,6 @@
+grant codeBase "file:/java/runjava-non-isolated.jar" {
+        permission java.security.AllPermission;
+};
+grant codeBase "file:/java/runjava-isolated.jar" {
+        permission java.security.AllPermission;
+};
\ No newline at end of file
diff --git a/modules/java-tests/Makefile b/modules/java-tests/Makefile
new file mode 100644
index 0000000..7ec7028
--- /dev/null
+++ b/modules/java-tests/Makefile
@@ -0,0 +1,26 @@
+SRC = $(shell readlink -f ../..)
+include $(SRC)/modules/java-base/common.gmk
+
+ifeq ($(arch),aarch64)
+java-targets :=
+else
+java-targets := obj/java.so obj/java_non_isolated.so
+endif
+
+obj/java.o: $(SRC)/modules/java-base/java.cc | init
+       $(call quiet, $(CXX) $(CXXFLAGS) -o $@ -c 
$(SRC)/modules/java-base/java.cc -MMD, CXX $@)
+
+obj/java_non_isolated.o: $(SRC)/modules/java-base/java.cc | init
+       $(call quiet, $(CXX) $(CXXFLAGS) -DRUN_JAVA_NON_ISOLATED -o $@ -c 
$(SRC)/modules/java-base/java.cc -MMD, CXX $@)
+
+init:
+       @echo "  MKDIRS"
+       $(call very-quiet, mkdir -p obj)
+
+module: $(java-targets)
+       cd $(SRC)/modules/java-tests && mvn package -DskipTests=true
+
+clean:
+       cd $(SRC)/modules/java-tests && mvn clean
+       -rm -f dependency-reduced-pom.xml
+       $(call very-quiet, $(RM) -rf obj)
diff --git a/modules/java-tests/module.py b/modules/java-tests/module.py
index 5ed04b4..18d64ab 100644
--- a/modules/java-tests/module.py
+++ b/modules/java-tests/module.py
@@ -1,19 +1,29 @@
 from osv.modules import api
 from osv.modules.filemap import FileMap
+import os, os.path
 
-api.require('java')
+api.require('java-base')
+
+usr_files = FileMap()
+jdkdir = os.path.basename(os.path.expandvars('${jdkbase}'))
+
+usr_files.add('${jdkbase}').to('/usr/lib/jvm/java') \
+    .include('lib/**') \
+    .include('jre/**') \
+    .exclude('jre/lib/security/cacerts') \
+    .exclude('jre/lib/audio/**')
+
+usr_files.link('/usr/lib/jvm/' + jdkdir).to('java')
+usr_files.link('/usr/lib/jvm/jre').to('java/jre')
+usr_files.link('/usr/lib/jvm/java/jre/lib/security/cacerts').to('/etc/pki/java/cacerts')
 
 _jar = '/tests/java/tests.jar'
 _isolates_jar = '/tests/java/isolates.jar'
 
-usr_files = FileMap()
-usr_files.add('${OSV_BASE}/java/tests/target/runjava-tests.jar').to(_jar)
-usr_files.add('${OSV_BASE}/java/tests-isolates/target/tests-isolates-jar-with-dependencies.jar').to(_isolates_jar)
+usr_files.add('${OSV_BASE}/modules/java-tests/tests/target/runjava-tests.jar').to(_jar)
+usr_files.add('${OSV_BASE}/modules/java-tests/tests-isolates/target/tests-isolates-jar-with-dependencies.jar').to(_isolates_jar)
 
-usr_files.add('${OSV_BASE}/java/tests/target/classes/tests/ClassPutInRoot.class').to('/tests/ClassPutInRoot.class')
+usr_files.add('${OSV_BASE}/modules/java-tests/tests/target/classes/tests/ClassPutInRoot.class').to('/tests/ClassPutInRoot.class')
 
-usr_files.add('${OSV_BASE}/java/tests-jre-extension/target/tests-jre-extension.jar')
 \
+usr_files.add('${OSV_BASE}/modules/java-tests/tests-jre-extension/target/tests-jre-extension.jar')
 \
     .to('/usr/lib/jvm/java/jre/lib/ext/tests-jre-extension.jar')
-
-default = api.run_java(classpath=[_jar, _isolates_jar],
-    args=['-Disolates.jar=' + _isolates_jar, 'org.junit.runner.JUnitCore', 
'io.osv.AllTests'])
diff --git a/java/pom.xml b/modules/java-tests/pom.xml
similarity index 93%
rename from java/pom.xml
rename to modules/java-tests/pom.xml
index 1353b4c..98a9984 100644
--- a/java/pom.xml
+++ b/modules/java-tests/pom.xml
@@ -9,17 +9,17 @@
     </properties>
 
     <groupId>io.osv</groupId>
-    <artifactId>java-parent</artifactId>
+    <artifactId>java-tests-parent</artifactId>
     <version>${version}</version>
     <packaging>pom</packaging>
 
     <modules>
-        <module>cloudius</module>
-        <module>runjava</module>
+        <module>../java-base/runjava-common</module>
+        <module>../java-base/runjava-non-isolated</module>
+        <module>../java-base/runjava-isolated</module>
         <module>tests</module>
         <module>tests-isolates</module>
         <module>tests-jre-extension</module>
-        <module>jolokia-agent</module>
     </modules>
 
     <dependencies>
diff --git a/java/tests-isolates/pom.xml 
b/modules/java-tests/tests-isolates/pom.xml
similarity index 80%
rename from java/tests-isolates/pom.xml
rename to modules/java-tests/tests-isolates/pom.xml
index 249e091..191552d 100644
--- a/java/tests-isolates/pom.xml
+++ b/modules/java-tests/tests-isolates/pom.xml
@@ -6,7 +6,7 @@
 
     <parent>
         <groupId>io.osv</groupId>
-        <artifactId>java-parent</artifactId>
+        <artifactId>java-tests-parent</artifactId>
         <version>${version}</version>
     </parent>
 
@@ -16,7 +16,14 @@
     <dependencies>
         <dependency>
             <groupId>io.osv</groupId>
-            <artifactId>runjava</artifactId>
+            <artifactId>runjava-isolated</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.osv</groupId>
+            <artifactId>runjava-non-isolated</artifactId>
+            <version>1.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/java/tests-isolates/src/main/java/tests/ClassFinder.java 
b/modules/java-tests/tests-isolates/src/main/java/tests/ClassFinder.java
similarity index 100%
rename from java/tests-isolates/src/main/java/tests/ClassFinder.java
rename to modules/java-tests/tests-isolates/src/main/java/tests/ClassFinder.java
diff --git 
a/java/tests-isolates/src/main/java/tests/ClassPresentInBothContexts.java 
b/modules/java-tests/tests-isolates/src/main/java/tests/ClassPresentInBothContexts.java
similarity index 100%
rename from 
java/tests-isolates/src/main/java/tests/ClassPresentInBothContexts.java
rename to 
modules/java-tests/tests-isolates/src/main/java/tests/ClassPresentInBothContexts.java
diff --git a/java/tests-isolates/src/main/java/tests/FieldTester.java 
b/modules/java-tests/tests-isolates/src/main/java/tests/FieldTester.java
similarity index 100%
rename from java/tests-isolates/src/main/java/tests/FieldTester.java
rename to modules/java-tests/tests-isolates/src/main/java/tests/FieldTester.java
diff --git a/java/tests-isolates/src/main/java/tests/LoggingProcess.java 
b/modules/java-tests/tests-isolates/src/main/java/tests/LoggingProcess.java
similarity index 100%
rename from java/tests-isolates/src/main/java/tests/LoggingProcess.java
rename to 
modules/java-tests/tests-isolates/src/main/java/tests/LoggingProcess.java
diff --git 
a/java/tests-isolates/src/main/java/tests/NonIsolatedLoggingProcess.java 
b/modules/java-tests/tests-isolates/src/main/java/tests/NonIsolatedLoggingProcess.java
similarity index 100%
rename from 
java/tests-isolates/src/main/java/tests/NonIsolatedLoggingProcess.java
rename to 
modules/java-tests/tests-isolates/src/main/java/tests/NonIsolatedLoggingProcess.java
diff --git a/java/tests-isolates/src/main/java/tests/PropertyReader.java 
b/modules/java-tests/tests-isolates/src/main/java/tests/PropertyReader.java
similarity index 100%
rename from java/tests-isolates/src/main/java/tests/PropertyReader.java
rename to 
modules/java-tests/tests-isolates/src/main/java/tests/PropertyReader.java
diff --git a/java/tests-isolates/src/main/java/tests/PropertySetter.java 
b/modules/java-tests/tests-isolates/src/main/java/tests/PropertySetter.java
similarity index 100%
rename from java/tests-isolates/src/main/java/tests/PropertySetter.java
rename to 
modules/java-tests/tests-isolates/src/main/java/tests/PropertySetter.java
diff --git a/java/tests-isolates/src/main/java/tests/StaticFieldSetter.java 
b/modules/java-tests/tests-isolates/src/main/java/tests/StaticFieldSetter.java
similarity index 100%
rename from java/tests-isolates/src/main/java/tests/StaticFieldSetter.java
rename to 
modules/java-tests/tests-isolates/src/main/java/tests/StaticFieldSetter.java
diff --git a/java/tests-jre-extension/pom.xml 
b/modules/java-tests/tests-jre-extension/pom.xml
similarity index 91%
rename from java/tests-jre-extension/pom.xml
rename to modules/java-tests/tests-jre-extension/pom.xml
index 84a861e..3d01deb 100644
--- a/java/tests-jre-extension/pom.xml
+++ b/modules/java-tests/tests-jre-extension/pom.xml
@@ -6,7 +6,7 @@
 
     <parent>
         <groupId>io.osv</groupId>
-        <artifactId>java-parent</artifactId>
+        <artifactId>java-tests-parent</artifactId>
         <version>${version}</version>
     </parent>
 
diff --git 
a/java/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java 
b/modules/java-tests/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java
similarity index 100%
rename from java/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java
rename to 
modules/java-tests/tests-jre-extension/src/main/java/tests/SomeExtensionClass.java
diff --git a/java/tests/pom.xml b/modules/java-tests/tests/pom.xml
similarity index 89%
rename from java/tests/pom.xml
rename to modules/java-tests/tests/pom.xml
index f359f43..e2f25d1 100644
--- a/java/tests/pom.xml
+++ b/modules/java-tests/tests/pom.xml
@@ -6,7 +6,7 @@
 
     <parent>
         <groupId>io.osv</groupId>
-        <artifactId>java-parent</artifactId>
+        <artifactId>java-tests-parent</artifactId>
         <version>${version}</version>
     </parent>
 
@@ -28,7 +28,14 @@
         </dependency>
         <dependency>
             <groupId>io.osv</groupId>
-            <artifactId>runjava</artifactId>
+            <artifactId>runjava-isolated</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.osv</groupId>
+            <artifactId>runjava-non-isolated</artifactId>
+            <version>1.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/java/tests/src/main/java/io/osv/AllTestsThatTestIsolatedApp.java 
b/modules/java-tests/tests/src/main/java/io/osv/AllTestsThatTestIsolatedApp.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/AllTestsThatTestIsolatedApp.java
rename to 
modules/java-tests/tests/src/main/java/io/osv/AllTestsThatTestIsolatedApp.java
diff --git 
a/java/tests/src/main/java/io/osv/AllTestsThatTestNonIsolatedApp.java 
b/modules/java-tests/tests/src/main/java/io/osv/AllTestsThatTestNonIsolatedApp.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/AllTestsThatTestNonIsolatedApp.java
rename to 
modules/java-tests/tests/src/main/java/io/osv/AllTestsThatTestNonIsolatedApp.java
diff --git a/java/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java 
b/modules/java-tests/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java
rename to 
modules/java-tests/tests/src/main/java/io/osv/ClassLoaderIsolationTest.java
diff --git 
a/java/tests/src/main/java/io/osv/ClassLoaderWithoutIsolationTest.java 
b/modules/java-tests/tests/src/main/java/io/osv/ClassLoaderWithoutIsolationTest.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/ClassLoaderWithoutIsolationTest.java
rename to 
modules/java-tests/tests/src/main/java/io/osv/ClassLoaderWithoutIsolationTest.java
diff --git a/java/tests/src/main/java/io/osv/LoggingIsolationTest.java 
b/modules/java-tests/tests/src/main/java/io/osv/LoggingIsolationTest.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/LoggingIsolationTest.java
rename to 
modules/java-tests/tests/src/main/java/io/osv/LoggingIsolationTest.java
diff --git a/java/tests/src/main/java/io/osv/LoggingWithoutIsolationTest.java 
b/modules/java-tests/tests/src/main/java/io/osv/LoggingWithoutIsolationTest.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/LoggingWithoutIsolationTest.java
rename to 
modules/java-tests/tests/src/main/java/io/osv/LoggingWithoutIsolationTest.java
diff --git a/java/tests/src/main/java/io/osv/OsvApiTest.java 
b/modules/java-tests/tests/src/main/java/io/osv/OsvApiTest.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/OsvApiTest.java
rename to modules/java-tests/tests/src/main/java/io/osv/OsvApiTest.java
diff --git a/java/tests/src/main/java/io/osv/PropertyIsolationTest.java 
b/modules/java-tests/tests/src/main/java/io/osv/PropertyIsolationTest.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/PropertyIsolationTest.java
rename to 
modules/java-tests/tests/src/main/java/io/osv/PropertyIsolationTest.java
diff --git a/java/tests/src/main/java/io/osv/TemporarySecurityManager.java 
b/modules/java-tests/tests/src/main/java/io/osv/TemporarySecurityManager.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/TemporarySecurityManager.java
rename to 
modules/java-tests/tests/src/main/java/io/osv/TemporarySecurityManager.java
diff --git a/java/tests/src/main/java/io/osv/TestDomainPermissions.java 
b/modules/java-tests/tests/src/main/java/io/osv/TestDomainPermissions.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/TestDomainPermissions.java
rename to 
modules/java-tests/tests/src/main/java/io/osv/TestDomainPermissions.java
diff --git a/java/tests/src/main/java/io/osv/TestLaunching.java 
b/modules/java-tests/tests/src/main/java/io/osv/TestLaunching.java
similarity index 100%
rename from java/tests/src/main/java/io/osv/TestLaunching.java
rename to modules/java-tests/tests/src/main/java/io/osv/TestLaunching.java
diff --git a/java/tests/src/main/java/tests/ClassPresentInBothContexts.java 
b/modules/java-tests/tests/src/main/java/tests/ClassPresentInBothContexts.java
similarity index 100%
rename from java/tests/src/main/java/tests/ClassPresentInBothContexts.java
rename to 
modules/java-tests/tests/src/main/java/tests/ClassPresentInBothContexts.java
diff --git 
a/java/tests/src/main/java/tests/ClassPresentOnlyInParentContext.java 
b/modules/java-tests/tests/src/main/java/tests/ClassPresentOnlyInParentContext.java
similarity index 100%
rename from java/tests/src/main/java/tests/ClassPresentOnlyInParentContext.java
rename to 
modules/java-tests/tests/src/main/java/tests/ClassPresentOnlyInParentContext.java
diff --git a/java/tests/src/main/java/tests/ClassPutInRoot.java 
b/modules/java-tests/tests/src/main/java/tests/ClassPutInRoot.java
similarity index 100%
rename from java/tests/src/main/java/tests/ClassPutInRoot.java
rename to modules/java-tests/tests/src/main/java/tests/ClassPutInRoot.java
diff --git a/modules/java-tests/usr.manifest b/modules/java-tests/usr.manifest
index 0dca54e..8145b19 100644
--- a/modules/java-tests/usr.manifest
+++ b/modules/java-tests/usr.manifest
@@ -6,4 +6,8 @@
 #
 
 [manifest]
-/java_non_isolated.so: java/jvm/java_non_isolated.so
+/java.so: ${OSV_BASE}/modules/java-tests/obj/java.so
+/java/runjava-isolated.jar: 
${OSV_BASE}/modules/java-base/runjava-isolated/target/runjava-isolated.jar
+/java_non_isolated.so: ${OSV_BASE}/modules/java-tests/obj/java_non_isolated.so
+/java/runjava-non-isolated.jar: 
${OSV_BASE}/modules/java-base/runjava-non-isolated/target/runjava-non-isolated.jar
+/.java.policy: ${OSV_BASE}/modules/java-tests/.java.policy
diff --git a/modules/java/Makefile b/modules/java/Makefile
deleted file mode 100644
index d5d916e..0000000
--- a/modules/java/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# TODO: need to move compilation of $(java-targets) from the main makefile
-# to here. Unfortunately, compiling with OSv header files is a big mess,
-# and much easier to do it in the main OSv makefile :-(
-SRC = $(shell readlink -f ../..)
-module:
-       cd $(SRC)/java && mvn package -DskipTests=true
-
-clean:
-       cd $(SRC)/java && mvn clean
-       -rm -f dependency-reduced-pom.xml
diff --git a/modules/java/module.py b/modules/java/module.py
index 20891d1..823d498 100644
--- a/modules/java/module.py
+++ b/modules/java/module.py
@@ -1,24 +1,4 @@
-from osv.modules.filemap import FileMap
 from osv.modules import api
-import os, os.path
 
-usr_files = FileMap()
-
-api.require('fonts')
-api.require('ca-certificates')
-api.require('libz')
-api.require('josvsym')
-api.require('httpserver-jolokia-plugin')
-api.require('httpserver-jvm-plugin')
-
-jdkdir = os.path.basename(os.path.expandvars('${jdkbase}'))
-
-usr_files.add('${jdkbase}').to('/usr/lib/jvm/java') \
-    .include('lib/**') \
-    .include('jre/**') \
-    .exclude('jre/lib/security/cacerts') \
-    .exclude('jre/lib/audio/**')
-
-usr_files.link('/usr/lib/jvm/' + jdkdir).to('java')
-usr_files.link('/usr/lib/jvm/jre').to('java/jre')
-usr_files.link('/usr/lib/jvm/java/jre/lib/security/cacerts').to('/etc/pki/java/cacerts')
+api.require('java-isolated')
+api.require('openjdk7')
diff --git a/modules/java/usr.manifest b/modules/java/usr.manifest
deleted file mode 100644
index d19879e..0000000
--- a/modules/java/usr.manifest
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Copyright (C) 2013-2014 Cloudius Systems, Ltd.
-#
-# This work is open source software, licensed under the terms of the
-# BSD license as described in the LICENSE file in the top-level directory.
-#
-
-[manifest]
-/usr/lib/&/libexpat.so.1: %(miscbase)s/usr/lib64/&
-/usr/lib/&/libjpeg.so.62: %(miscbase)s/usr/lib64/&
-/usr/lib/jni/balloon.so: java/jni/balloon.so
-/usr/lib/jni/monitor.so: java/jni/monitor.so
-/usr/lib/&/jni/elf-loader.so: java/&
-/usr/lib/&/jni/networking.so: java/&
-/usr/lib/&/jni/stty.so: java/&
-/usr/lib/&/jni/tracepoint.so: java/&
-/usr/lib/&/jni/power.so: java/&
-/java.so: java/jvm/java.so
-/usr/lib/libosv.so: libosv.so
-/java/runjava.jar: ${OSV_BASE}/java/runjava/target/runjava.jar
-/java/cloudius.jar: ${OSV_BASE}/java/cloudius/target/cloudius.jar
-/.java.policy: ${OSV_BASE}/modules/java/.java.policy
diff --git a/modules/java/module.py b/modules/openjdk7/module.py
similarity index 75%
copy from modules/java/module.py
copy to modules/openjdk7/module.py
index 20891d1..d675fc4 100644
--- a/modules/java/module.py
+++ b/modules/openjdk7/module.py
@@ -2,14 +2,10 @@ from osv.modules.filemap import FileMap
 from osv.modules import api
 import os, os.path
 
-usr_files = FileMap()
+api.require('java-cmd')
+provides = ['java']
 
-api.require('fonts')
-api.require('ca-certificates')
-api.require('libz')
-api.require('josvsym')
-api.require('httpserver-jolokia-plugin')
-api.require('httpserver-jvm-plugin')
+usr_files = FileMap()
 
 jdkdir = os.path.basename(os.path.expandvars('${jdkbase}'))
 
diff --git a/scripts/module.py b/scripts/module.py
index 19c39b5..ec96e89 100755
--- a/scripts/module.py
+++ b/scripts/module.py
@@ -132,7 +132,7 @@ def flatten_list(elememnts):
 
 def get_basic_apps(apps):
     basic_apps = []
-    java = resolve.require('java')
+    java = resolve.require('java-base')
     if hasattr(java,'non_isolated_jvm') and java.non_isolated_jvm:
         _jvm = non_isolated_jvm()
     else:
@@ -203,6 +203,9 @@ def build(args):
             else:
                 api.require_running(name)
 
+        # Add moduless thare are implictly required if others are present
+        resolve.resolve_required_modules_if_other_is_present()
+
     modules = resolve.get_required_modules()
     modules_to_run = resolve.get_modules_to_run()
 
diff --git a/scripts/osv/modules/api.py b/scripts/osv/modules/api.py
index 3ae3895..9a91fdf 100644
--- a/scripts/osv/modules/api.py
+++ b/scripts/osv/modules/api.py
@@ -3,6 +3,7 @@ import os
 
 require = resolve.require
 require_running = resolve.require_running
+require_if_other_module_present = resolve.require_if_other_module_present
 
 class basic_app:
     def prepare_manifest(self, build_dir, manifest_type, manifest):
diff --git a/scripts/osv/modules/resolve.py b/scripts/osv/modules/resolve.py
index 10aba90..17871d5 100644
--- a/scripts/osv/modules/resolve.py
+++ b/scripts/osv/modules/resolve.py
@@ -7,6 +7,7 @@ import collections
 _modules = collections.OrderedDict()
 _loading_modules = list()
 _modules_to_run = dict()
+_modules_to_be_added_if_other_module_present = dict()
 
 class Module(object):
     def __init__(self, name, config, properties):
@@ -117,6 +118,27 @@ def fetch_module(module_config, target_dir):
     if returncode:
         raise Exception("Command failed with exit code: %d" % returncode)
 
+def require_if_other_module_present(module_name,other_module_name):
+    list_of_modules = 
_modules_to_be_added_if_other_module_present.get(other_module_name,None)
+    if(list_of_modules):
+        list_of_modules.append(module_name)
+    else:
+        _modules_to_be_added_if_other_module_present[other_module_name] = 
[module_name]
+
+def resolve_required_modules_if_other_is_present():
+    required_module_names = set()
+    for module_name in _modules_to_be_added_if_other_module_present.keys():
+        # If module is present then add modules that should be required 
implictly
+        if( _modules.get(module_name)):
+            modules_to_be_added = 
_modules_to_be_added_if_other_module_present[module_name]
+            for required_module_name in modules_to_be_added:
+                if(not _modules.get(required_module_name)): # If required 
module is not in the list already
+                    print("Adding module '%s' because module '%s' is present" 
% (required_module_name, module_name))
+                    required_module_names.add(required_module_name)
+
+    for required_module_name in required_module_names:
+        require(required_module_name)
+
 def require(module_name):
     if module_name in _loading_modules:
         raise Exception("Recursive loading of '%s' module" % module_name)
@@ -152,7 +174,10 @@ def require(module_name):
     _modules[module_name] = module
     if hasattr(module, 'provides'):
         for name in getattr(module, 'provides'):
-            _modules[name] = module
+            if(_modules.get(name)):
+                raise Exception("There is more than one module included that 
provides: '%s'" % name )
+            else:
+                _modules[name] = module
     return module
 
 def require_running(module_name, run_config='*'):
-- 
2.7.4

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to