JMount: A Lightweight Java Mounting Library for Modular Apps
What JMount does
JMount provides a small, focused API to register, mount, and manage pluggable modules and virtual resources inside Java applications. It treats each module as a mountable unit exposing routes, resources, or services, and keeps the core runtime minimal so it can be embedded in microservices, desktop apps, or server-side frameworks without heavy dependencies.
Key features
- Minimal footprint: Small JAR, few dependencies (core Java + optional adapters).
- Pluggable mounts: Modules implement a simple Mount interface to expose lifecycle hooks and resources.
- Dynamic registration: Mounts can be registered, hot-swapped, or removed at runtime.
- Scoped contexts: Each mount gets its own isolated context (config, logger, resource resolver).
- Composable routing: Mounts can declare routes or resource trees that the host composes into a single namespace.
- Adapter-friendly: Built to integrate with servlet containers, Netty, or CLI environments via adapter modules.
Core concepts
- Mount: The unit that implements lifecycle methods (init, start, stop) and exposes resources.
- MountPoint: A named path or namespace where a Mount attaches (e.g., /auth, /payments).
- Context: Per-mount environment with configuration and dependency lookups.
- Registry: Central index that tracks active mounts and resolves conflicts.
- Adapter: Integration layer translating mount resources to the host’s runtime (HTTP, filesystem, CLI).
Basic usage (example)
java
// Define a mount public class HelloMount implements Mount { @Override public void init(Context ctx) { /* read config / } @Override public void start(Context ctx) { ctx.routes().get(”/hello”, req -> “Hello from HelloMount”); } @Override public void stop(Context ctx) { / cleanup */ } } // Register and mount JMountCore core = JMountCore.create(); core.registerMount(”/hello”, new HelloMount()); core.start();
Integration patterns
- Embedding in microservices: Add the core JMount JAR, register mounts during application bootstrap, and expose composed routes through the existing HTTP server adapter.
- Desktop plugins: Use the registry to discover module JARs on disk and mount them into isolated contexts, enabling safe plugin unloading.
- Serverless functions: Package a mount as the handler adapter to keep the function handler minimal and modular.
Best practices
- Keep mounts focused: One responsibility per mount (routing, auth, data access).
- Use scoped configuration: Avoid global mutable state; read configuration from the mount’s Context.
- Graceful lifecycle: Implement stop() to release threads, close DB connections, and unregister listeners.
- Namespace carefully: Choose mount points to avoid route collisions; use subpaths for larger modules.
When to use JMount
- You want modularity without a heavy OSGi-like framework.
- Your app needs hot-pluggable extensions or plugins.
- You prefer a tiny, adapter-driven integration layer that composes small modules into a single runtime.
Limitations
- Not intended for complex module dependency resolution (no full DI container).
- Basic conflict resolution — for highly dynamic environments you may need extra orchestration.
- Adapters required to integrate with specific runtimes; some adapters may be community-maintained.
Conclusion
JMount aims to provide a pragmatic, low-overhead approach to modular application structure in Java. It favors simplicity, clear lifecycle boundaries, and adapter-based
Leave a Reply