Spring-Boot-Anwendungen schützen

springboot schützt Spring-Boot-Anwendungen und verarbeitet dabei BOOT-INF/classes, BOOT-INF/lib, den Spring Boot Loader und den Framework-Scan.

1. Vorgehen in der GUI

  1. Wählen Sie auf der Seite „Anwendungstyp“ die Option Spring Boot.

    Spring Boot wählen

  2. Wählen Sie die zu schützende Spring-Boot-Anwendung, die mitgelieferte Java-Version und die Zielplattformen und entscheiden Sie sich für den einfachen oder den erweiterten Modus.

    Eingabe, Java-Version, Zielplattform und Modus wählen

  3. Im erweiterten Modus wählen Sie Ausgabelayout, zu schützende Abhängigkeits-JARs, JavaFX-Einstellungen, JVM-Startoptionen und Ausschlussregeln. Der einfache Modus leitet Layout und Ausschlüsse aus dem Kompatibilitätsscan ab. Was die einzelnen Optionen bewirken, steht unter Protector4J Erweiterte Moduseinstellungen.

    Erweiterte Spring-Boot-Optionen konfigurieren

  4. Wählen Sie das Ausgabeverzeichnis, prüfen Sie die Zusammenfassung und klicken Sie auf Schutz ausführen.

    Ausgabeverzeichnis wählen und Schutz ausführen

2. CLI-Beispiele

Die kürzeste Form:

p4j springboot app.jar dist

Standardmäßig kommt das Layout p4jx-fat zum Einsatz. Um ausdrücklich ein anderes zu wählen:

p4j springboot app.jar dist --layout fat
p4j springboot app.jar dist --layout separate

Nur einen Teil der Anwendung schützen:

p4j springboot app.jar dist \
  --protect 'com.example.service.impl.**' \
  --exclude 'com.example.dto.**,com.example.config.**'

3. Ausgabestruktur und Layouts

p4jx-fat: Standard, ein einzelnes geschütztes Archiv

dist/
├── app.p4jx              # mit dem Archivsuffix jar wird daraus app.jar
├── vlxjre/
├── run.sh
├── run.command
└── run.bat

Merkmale:

  • Die gesamte Anwendung wird als ein P4JX-Archiv ausgeliefert.
  • Die physische Datei ist standardmäßig kein ZIP.
  • Spring-Boot-Ressourcen, verschachtelte Abhängigkeiten und Metadaten werden über eine virtuelle JAR-Sicht bereitgestellt.
  • Der Schutzumfang ist am größten; geeignet für Anwendungen, die nicht auf Klassenpfad-Scanner Dritter angewiesen sind.

fat: Spring-Boot-Kompatibilitätslayout

dist/
├── app.jar
├── app.p4jx              # mit dem Suffix jar wird daraus app-protected.jar
├── vlxjre/
└── run.*

Merkmale:

  • app.jar behält die standardmäßige physische BOOT-INF-Struktur.
  • Die echten Implementierungen der geschützten Klassen liegen im P4JX-Archiv daneben.
  • Geeignet für Anwendungen, die die physische Spring-Boot-JAR-Struktur durchsuchen müssen, etwa mit ClassGraph oder Reflections.
  • Die beiden Dateien hängen voneinander ab und müssen gemeinsam aktualisiert und ausgeliefert werden.

separate: aufgeteiltes Kompatibilitätslayout

dist/
├── plain-launcher.jar
├── app.p4jx
├── lib/
├── vlxjre/
└── run.*

Merkmale:

  • Spring Boot Loader, ungeschützte Klassen und Abhängigkeiten liegen getrennt.
  • Geeignet für ältere Integrationsumgebungen, die einen flachen lib/*-Klassenpfad verlangen.
  • Der erzeugte Starter lädt die geschützten Klassen vorab.
  • Neue Projekte sollten p4jx-fat bevorzugen oder das vom Scanner empfohlene p4jx-fat bzw. fat.

Layout auswählen

SituationEmpfohlenes Layout
Ein gewöhnlicher Spring-Boot-Dienstp4jx-fat
Die Anwendung nutzt tatsächlich einen Scanner wie ClassGraph oder Reflectionsfat
Ein flaches Verzeichnis externer Abhängigkeiten oder separat verschlüsselte Abhängigkeitsdateien sind nötigseparate
UnklarZuerst --compat-scan ausführen

Das ZIP-Overlay hilft nur Werkzeugen, die das ZIP-Zentralverzeichnis direkt lesen. Es ersetzt nicht die physische Spring-Boot-Struktur, die ClassLoader und Klassenpfad-Scanner benötigen.

4. Starten

./run.sh --spring.profiles.active=prod

Windows:

run.bat --spring.profiles.active=prod

Ersetzen Sie das Verzeichnis vlxjre in der Ausgabe nicht durch eine System-JRE.

Für Windows-Ziele lässt sich zusätzlich ein nativer Starter erzeugen. Er funktioniert mit allen drei Layouts und besteht neben den Startskripten — siehe Windows-EXE-Starter erzeugen.

JVM-Startoptionen

Sie können JVM-Optionen beim Paketieren festschreiben, entweder in der GUI unter JVM-Startoptionen mit einer Option pro Zeile oder auf der Kommandozeile:

p4j springboot app.jar dist \
  --jvm-option -Xms1g \
  --jvm-option -Xmx2g

Um einem ausgelieferten Paket einmalig Optionen mitzugeben:

APP_JAVA_OPTS="-Duser.timezone=Europe/Berlin" ./run.sh

Sie können das ausgelieferte Skript auch direkt bearbeiten:

  • macOS und Linux: Ergänzen Sie in run.sh nach den erzeugten Zeilen JVM_OPTS=(...) und JVM_OPTS+=(...) die Zeile JVM_OPTS+=("-Xms1g" "-Xmx2g").
  • Windows: Ergänzen Sie in run.bat nach der erzeugten Zeile set "JVM_OPTS=..." die Zeile set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g".

Entfernen Sie nicht die Optionen, die der Packager für Spring Boot oder JavaFX erzeugt hat, etwa --add-opens und den Modulpfad. Erneutes Paketieren überschreibt alle manuellen Änderungen — Einzelheiten unter JVM-Startoptionen.

5. Schutzumfang

Standardmäßig werden die Anwendungsklassen unter BOOT-INF/classes geschützt. Diese Spring-nahen Klassen bleiben besser ungeschützt:

  • @Controller-, @RestController- und @ControllerAdvice-Klassen;
  • @Configuration-Klassen, Autokonfigurationsklassen sowie durch AOT oder CGLIB erweiterte Klassen;
  • Jackson-DTOs, JPA-Entitäten, Records und Validierungsmodelle;
  • der Einstiegspunkt der Anwendung sowie alle Klassen, die das Framework direkt erzeugt oder proxied;
  • Klassen, die zur Laufzeit eine Bytecode-Erweiterung benötigen.

Schützen Sie die Service-Implementierungen und greifen Sie über eine öffentliche Fassade oder Schnittstelle darauf zu. Regeln akzeptieren exakte Klassennamen sowie pkg.* und pkg.**.

6. Abhängigkeits-JARs schützen

--protect-lib schützt die passenden Abhängigkeiten in BOOT-INF/lib und funktioniert mit allen drei Layouts.

p4j springboot app.jar dist \
  --protect-lib 'company-core-*.jar,pricing-*.jar'

Schützen Sie ausschließlich Ihre eigenen Closed-Source-Abhängigkeiten. Verschlüsseln Sie keine Framework-Pakete von Dritten wie Spring, Tomcat, Logging-Bibliotheken oder Datenbanktreiber, nur um „mehr zu schützen“.

7. Kompatibilitätsscan

p4j springboot app.jar --compat-scan
p4j springboot app.jar dist --compat-apply

Die beiden Optionen lassen sich nicht gemeinsam verwenden. Sie unterscheiden sich so:

OptionWirkungWann sinnvoll
--compat-scanUntersucht das Eingabe-JAR, gibt Risiken und Konfigurationsempfehlungen aus und endet. Es wird nichts encodiert und kein dist erzeugt, daher ist kein Ausgabeverzeichnis nötig.Lesen Sie den Bericht zuerst beim erstmaligen Schutz, nach einem Update von Spring Boot oder anderen Abhängigkeiten, nach Änderungen an Schutzumfang oder Layout und bei der Suche nach Kompatibilitätsproblemen.
--compat-applyScannt, übernimmt die konservativen Empfehlungen und encodiert anschließend die Ausgabe. Daher ist ein Ausgabeverzeichnis erforderlich.Zum Abschließen der Paketierung, wenn Sie das Scanergebnis gelesen und die Empfehlungen akzeptiert haben. Eignet sich auch für wiederholte Builds und CI-Pipelines mit bereits geprüften Regeln.

Bei springboot kann --compat-apply das Layout wählen, Ausschlussregeln ergänzen und ZIP-Overlay, JavaFX sowie Archivsuffix anpassen. Für alles außer den Ausschlüssen hat ein auf der Kommandozeile ausdrücklich gesetzter Wert Vorrang. Empfohlene Ausschlüsse werden standardmäßig mit Ihren eigenen --exclude-Mustern zusammengeführt; geben Sie zusätzlich --no-compat-excludes an, wenn Sie das nicht möchten. Der Scanner führt nur eine statische heuristische Analyse durch. Probleme, die eine Quelltextänderung erfordern, behebt --compat-apply nicht, und die paketierte Anwendung braucht weiterhin Regressionstests auf der Zielplattform.

Die übrigen CLI-Befehle, alle Optionen, Umgebungsvariablen und Automatisierungsbeispiele finden Sie in der CLI-Referenz.