Clean Architecture hexagonal (ports & adapters), manual constructor injection.
Quick start:
- Code: Select all
Option 1 : Native binary (GraalVM, recommended)
# Build native image (requires GraalVM 25+ with native-image)
mvn -Pnative package -DskipTests
# Run
./target/jadchub config/application.yml
The native binary starts in ~5 ms and uses ~20 MB of RAM.
- Code: Select all
Option 2 : Uber JAR
# Build fat JAR
mvn package -DskipTests
# Run
java --enable-preview -jar target/jadchub.jar config/application.yml
Connect
Connect with any ADC client (AirDC++, DC++, etc.) to adc://localhost:1511.
Default admin account: admin / changeme (change immediately in config/users.yml).
Bind address (IPv4 / IPv6 / dual-stack)
By default, the hub binds on :: (dual-stack), accepting both IPv4 and IPv6
connections on the same port. Set server.bind-address in application.yml
to control which interfaces and protocols the hub listens on:
server:
# bind-address: "::" # dual-stack (default, accepts IPv4 + IPv6)
# bind-address: "0.0.0.0" # IPv4 only (all interfaces)
# bind-address: "192.168.1.10" # IPv4, single interface
# bind-address: "2001:db8::1" # IPv6, single interface
port: 1511
Note: The JVM flags -Djava.net.preferIPv4Stack=true and
-Djava.net.preferIPv6Addresses=true also work when running the uber JAR,
but are not available in native image mode (GraalVM). Use
server.bind-address for both modes.
Configuration
All settings are in config/application.yml:
TLS
To enable TLS, generate a self-signed certificate and configure application.yml:
tls:
enabled: true
certificate: "config/cert.pem"
private-key: "config/key.pem"
Additional TLS settings:
require: true — reject non-TLS connections entirely
min-version: "TLSv1.2" — minimum TLS version
ciphers — allowed cipher suites[/quote]