Schutz für gewöhnliche Java-Anwendungen

javaapp wird für gewöhnliche Java-Anwendungen mit Hauptklasse verwendet. Es erzeugt einen geschützten Archiv, das VLX JRE für die Zielplattform sowie Startskripte.

1. GUI-Bearbeitung

  1. Wählen Sie auf der Anwendungsart-Seite Java Application aus.

    Java-Anwendung auswählen

  2. Wählen Sie das Eingabes Jar, Die mitgelieferte Java-Version und die Zielplattform aus und entscheiden Sie sich zwischen Einfachmodus oder Fortgeschrittenem Modus.

    Wählen Sie Eingabe, Java-Version, Zielplattform und Modus aus

  3. Im Fortgeschrittenen Modus füllen Sie Main class nach Bedarf aus und konfigurieren Sie JVM-Parameter, JavaFX sowie Ausschlussregeln; im Einfachmodus kann diese Seite übersprungen werden. Die Bedeutung der einzelnen Optionen finden Sie in Einstellungen für den Fortgeschrittenen-Modus von Protector4J.

    Einstellen von fortgeschrittenen Parametern für eine herkömmliche Java-Anwendung

  4. Wählen Sie den Ausgabekatalog aus, überprüfen Sie den Parameterzusammenfassung und klicken Sie anschließend auf Run protection.

    Wählen Sie den Ausgabekatalog aus und führen Sie den Schutz durch

2. CLI-Beispiele

Wenn das Manifest bereits den richtigen Main-Class enthält:

p4j javaapp app.jar dist

Wenn das Manifest keinen Main-Class enthält oder ein anderer Startklasse verwendet werden muss, wird dies über --main angegeben:

p4j javaapp app.jar dist --main com.example.Main

Gleichzeitige Angabe von Startklasse und JVM-Parametern:

p4j javaapp app.jar dist \
  --main com.example.Main \
  --jvm-option -Xms512m \
  --jvm-option -Xmx2g

Selektiver Schutz:

p4j javaapp app.jar dist \
  --protect 'com.example.core.**' \
  --exclude 'com.example.core.dto.**'

Kompatibilitätsprüfung sowie automatische Anwendungsempfehlungen:

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

Diese beiden Optionen können nicht gleichzeitig verwendet werden; der Unterschied zwischen ihnen ist:

OptionenVerhaltenWann es verwendet wird
--compat-scanScannt nur die Eingabesdatei JAR, gibt Risiken und Konfigurationsempfehlungen aus und beendet sich anschließend; es kodiert nicht und erzeugt auch keine dist, weshalb kein Ausgabeverzeichnis erforderlich ist.Wird verwendet, um nach dem ersten Schutz einer Anwendung, bei der Aktualisierung von Abhängigkeiten oder Anpassungen des Schutzumfangs sowie zur Behebung von Kompatibilitätsproblemen zunächst einen Bericht anzuzeigen.
--compat-applyFügt nach dem Scannen automatisch konservative Empfehlungen hinzu, setzt anschließend die Kodierung fort und erzeugt die Ausgabe, weshalb unbedingt ein Ausgabeverzeichnis angegeben werden muss.Wird verwendet, um das Paketieren abzuschließen, nachdem die Scanergebnisse geprüft und die automatischen Empfehlungen angenommen wurden; es kann auch bei wiederholten Builds mit bereits überprüften Regeln oder in CI-Prozessen eingesetzt werden.

Für javaapp und --compat-apply können auf Basis der Scanergebnisse zusätzliche Ausnahmeklassen hinzugefügt sowie Optionen wie ZIP overlay, JavaFX und Archivendung angepasst werden. Bei den letzten drei Optionen haben die explizit in der Befehlszeile angegebenen Werte Vorrang; die empfohlenen Ausnahmeklassen werden standardmäßig mit den explizit angegebenen --exclude-Werten zusammengeführt. Falls keine automatische Hinzufügung von Ausnahmeklassen gewünscht ist, kann gleichzeitig --no-compat-excludes übergeben werden. Der Scanner führt nur eine statische heuristische Analyse durch; Probleme, die eine Codeänderung erfordern, werden nicht automatisch von --compat-apply behoben, und es müssen nach der Erstellung erneut Regressionstests auf der Zielplattform durchgeführt werden.

Weitere CLI-Befehle, alle Optionen, Umgebungsvariablen und Automatisierungsbeispiele finden Sie in Referenz für CLI-Parameter.

3. Ausgabestruktur

dist/
├── app.p4jx              # oder --archive-suffix jar erzeugen app.jar
├── vlxjre/               # Laufzeitumgebung, die mit der Archivierungs- und Zielplattform übereinstimmt
├── lib/                  # Abhängigkeiten von Manifest Class-Path, optional
├── run.sh
├── run.command
├── run.bat
└── README.md

Nicht-klassbasierte Ressourcen werden im öffentlichen Ressourcenansichtsfenster von P4JX gespeichert. Geschützte klassbasierte Ressourcen zeigen dem Scanner nur Metadaten-Informationen; die eigentlichen Methodeninhalte können nur von der VLX-Laufzeitumgebung geladen werden.

4. Starten

./run.sh [Anwendungsparameter...]

Windows:

run.bat [Anwendungsparameter...]

Ersetzen Sie den vlxjre im Ausgabeverzeichnis nicht durch das System-JRE. Falls ein manueller Start notwendig ist, behalten Sie bitte Klassenpfad, VM-Parameter sowie JavaFX-Modulparameter unter Verwendung des generierten Skripts bei.

JVM-Startparameter

Beim Paketieren kann man in der GUI unter JVM startup options einen Parameter pro Zeile eingeben oder in der CLI wieder verwenden:

--jvm-option -Xms512m --jvm-option -Xmx2g

Dauerhafte Änderungen im aktuellen Verzeichnis nach der Bereitstellung:

  • macOS/Linux: Bearbeiten Sie run.sh und fügen Sie vor der Prüfung in APP_JAVA_OPTS JVM_OPTS+=("-Xms512m" "-Xmx2g") ein; run.command ruft dann dieselbe Datei run.sh auf.
  • Windows: Bearbeiten Sie run.bat und fügen Sie vor der Prüfung in APP_JAVA_OPTS set "JVM_OPTS=%JVM_OPTS% -Xms512m -Xmx2g" ein.

Temporäre Parameter können über APP_JAVA_OPTS eingefügt werden. Vollständige Beispiele und Hinweise finden Sie unter Konfiguration der JVM-Startparameter. Manuelle Anpassungen an Skripten werden bei der erneuten Paketierung überschrieben.

5. Empfohlener Schutzumfang

Standardklasse für den Schutz der Anwendung. Für Produktprojekte wird dringend empfohlen, eigene Business-Pakete explizit zu definieren:

--protect 'com.mycompany.product.**'

In der Regel sollten folgende Elemente ausgeschlossen werden:

  • DTOs und Records, die direkt von Jackson serialisiert/serialisiert werden;
  • Klassen, deren Felder oder Methoden über JNI aufgerufen werden;
  • Klassen, die in ORM-, Dependency-Injection- oder Proxy-Frameworks angepasst werden müssen;
  • Drittanbieter-Bibliotheken und Open-Source-Frameworks;
  • Klassen, die von einem benutzerdefinierten ClassLoader aus einem Byte-Array neu definiert werden müssen.

6. Suffixe .p4jx und .jar

p4j javaapp app.jar dist --archive-suffix jar

Diese Option ändert lediglich den Dateinamen, der Inhalt der Archivdatei bleibt weiterhin P4JX. Sie sollte nur verwendet werden, wenn Drittanbieter-Komponenten den URL oder Dateinamen hardcodiert mit .jar versehen haben; dadurch wird die Archivdatei nicht zu einem gewöhnlichen ZIP/JAR.