Ich habe aktuell ein Problem beim Anpassen des Splashscreen in einer Anwendung die über eine mit winrun4j erstellten exe Datei gestartet wird.
Aktuell gehe ich folgendermaßen vor:
1. Erstellen einer jar Datei mit Manifest per maven-shade-plugin
2. Erstellen einer exe Datei mit winrun4j, die das erstellte jar verwendet
Das Problem:
Wenn ich die Anwendung über die jar-Datei starte erscheint der SplashScreen und der Aufruf der Methode SplashScreen.getSplashScreen() liefert eine SplashScreen Instanz.
Starte ich die Anwendung über die exe-Datei, erscheint der SplashScreen ebenfalls. Allerdings gibt hier SplashScreen.getSplashScreen() immer null zurück.
Ich habe schon versucht den Splashscreen an allen mir bekannten Stellen zu setzten:
1. in der Manifest-Datei
2. in der ini-Datei als Key
3. in der ini-Datei als vmarg
4. setzten per rcedit mit winrun4j
Ich habe eine kleines Testprogramm zum Reproduzieren des Problems geschrieben. Die einzige Java-Klasse:
Die pom.xml
Die ini-Datei:
Das Erstellen und Ausführen der exe mit winrunj4:
Die Pfade müssten passen, da beim Ausführen über die jar-Datei ja alles ok ist. Sicherheitshalber habe ich trotzdem die jpg auch noch zusätzlich zum jar mit passender Verzeichnisstruktur neben die exe gelegt. Ich habe auch schon versucht ob es mit anderen Bilddateien geht (gif). Es hat leider nichts geholfen. Hat irgendjemand eine Idee was ich falsch mache?
Aktuell gehe ich folgendermaßen vor:
1. Erstellen einer jar Datei mit Manifest per maven-shade-plugin
2. Erstellen einer exe Datei mit winrun4j, die das erstellte jar verwendet
Das Problem:
Wenn ich die Anwendung über die jar-Datei starte erscheint der SplashScreen und der Aufruf der Methode SplashScreen.getSplashScreen() liefert eine SplashScreen Instanz.
Starte ich die Anwendung über die exe-Datei, erscheint der SplashScreen ebenfalls. Allerdings gibt hier SplashScreen.getSplashScreen() immer null zurück.
Ich habe schon versucht den Splashscreen an allen mir bekannten Stellen zu setzten:
1. in der Manifest-Datei
2. in der ini-Datei als Key
3. in der ini-Datei als vmarg
4. setzten per rcedit mit winrun4j
Ich habe eine kleines Testprogramm zum Reproduzieren des Problems geschrieben. Die einzige Java-Klasse:
Java:
package main;
import java.awt.SplashScreen;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Main
{
public static void main(String[] args)
{
final JLabel label = new JLabel();
try
{
final SplashScreen splashScreen = SplashScreen.getSplashScreen();
if (splashScreen == null)
{
label.setText("Splashscreen ist null");
}
else
{
label.setText("Splashscreen OK");
}
Thread.sleep(2000);
}
catch (Exception e)
{
e.printStackTrace();
label.setText("Fehler: " + e.getMessage());
}
final JFrame frame = new JFrame("Splash-Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(label);
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Die pom.xml
Code:
<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>
<groupId>splash</groupId>
<artifactId>splash</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>splash-shade</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>main.Main</Main-Class>
<Permissions>all-permissions</Permissions>
<Codebase>*</Codebase>
<Application-Name>Splash Test</Application-Name>
<SplashScreen-Image>images/splash.jpg</SplashScreen-Image>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Die ini-Datei:
Code:
main.class=main.Main
working.directory=.
classpath.1=splash.jar
splash.image=images/splash.jpg
vmarg.1=-splash:images/splash.jpg
Das Erstellen und Ausführen der exe mit winrunj4:
Code:
C:\SplashTest>RCEDIT /N splash.exe splash.ini
[info] OK
C:\SplashTest>RCEDIT /S splash.exe images\splash.jpg
[info] OK
C:\SplashTest>splash
C:\SplashTest>[info] Module Name: C:\SplashTest\splash.exe
[info] Module INI: C:\SplashTest\splash.ini
[info] Module Dir: C:\SplashTest\
[info] INI Dir: C:\SplashTest\
[info] Working directory set to: C:\SplashTest
[info] Displaying splash: images/splash.jpg
[info] Configured vm.location: (null)
[info] Found VM: C:\Program Files (x86)\Java\jre1.8.0_102\bin\client\jvm.dll
[info] Expanding Classpath: splash.jar
[info] Generated Classpath: C:\SplashTest\splash.jar
[info] VM Args:
[info] vmarg.0=-Dfile.encoding=UTF-8
[info] vmarg.1=-splash:images/splash.jpg
[info] vmarg.2=-Djava.class.path=C:\SplashTest\splash.jar
[info] Registering natives for Native class
[warn] Could not find Native class
Die Pfade müssten passen, da beim Ausführen über die jar-Datei ja alles ok ist. Sicherheitshalber habe ich trotzdem die jpg auch noch zusätzlich zum jar mit passender Verzeichnisstruktur neben die exe gelegt. Ich habe auch schon versucht ob es mit anderen Bilddateien geht (gif). Es hat leider nichts geholfen. Hat irgendjemand eine Idee was ich falsch mache?