• Wir präsentieren Dir heute ein Stellenangebot für einen Java Entwickler - m/w/d in Augsburg, München, Stuttgart oder Bamberg. Hier geht es zur Jobanzeige

Jar startet jedoch ohne Hintergrundfunktion

izoards

izoards

Aktives Mitglied
Ich kämpfe gerade mit dem bilden eines JAR's, da es mein erstes Maven Projekt ist, vermute ich ein Problem mit dem Manifest File, oder dem pom.xml

In der Entwicklungsumgebung IntelliJ funktioniert mein Programm. Es öffnet ein GUI, welches im Hintergrund Ordner überwacht und sobald ein *doc dort eingeht, wird dieses in ein PDF umgewandelt.

Mein JAR jedoch lässt sich starten, das GUI öffnet sich, jedoch ohne Hintergrundfunktion.

Wenn ich das JAR über CMD starte, also mit java -jar C:\doctopdf\doctopdf.jar
kommt die Fehlermeldung: Hauptklasse meinPackage.Mail konnte nicht gefunden oder geladen werden.

Das Manifest File sieht so aus und liegt unter resources/META-INF

Java:
Manifest-Version: 1.0
Main-Class: myPackage.Main


Im pom.xml habe ich folgendes hinzugefügt:


Java:
     <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version> 2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>myPackage.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>


Was könnte hier das Problem sein? Und wieso startet das Programm gar nicht aus der CMD, jedoch das GUI schon per Doppelklich auf das JAR.
Ich wollte eben in der CMD schauen, wo das Problem liegt, dass mein Hintergrund Service nicht anläuft....

Danke für die Hilfe...
 
Oneixee5

Oneixee5

Bekanntes Mitglied
Du kannst dein erstelltes Jar-File mit einem ZIP-Programm (oder in *.zip umbenennen und mit Windows-Boardmitteln) öffnen. So kannst du untersuchen ob alles so vorhanden ist, wie du es erwartest.
Falls du externe Libs einsetzt, musst du darauf achten, dass der Classpath beim Start richtig gesetzt wird.
Wenn du dein Jar per Doppelklick startest passiert vermutlich der gleiche Fehler. Du kannst die Meldung nur nicht sehen.
 
izoards

izoards

Aktives Mitglied
Ich habe jetzt ein neues Maven Projekt erstellt und die .java files neu reinkopiert.
Jetzt lässt sich das jar wenigstens mal von der CMD aus starten, jedoch läuft der Hintergrund Task nicht....
Es kommt auch keine Fehlermeldung in der CMD...

Da ich glaube ich ein bisschen ein durcheinander mit meinen Libs habe, könnte das gut der Grund sein.
Dies wird doch im pom.xml unter dependency geregelt, oder nicht?
 
kneitzel

kneitzel

Top Contributor
Ja, dependency-Einträge geben in Maven die Abhängigkeiten an. Aber die kommen erst einmal nicht automatisch in das jar File. Dazu bräuchtest Du dann entsprechende plugins in maven, die dann ein "fat jar" bauen.

Generell würde ich Dich bitten, doch einfach einmal das ganze pom.xml zu zeigen und nicht nur so kleine Ausschnitte. Und ein jar File, das per doppelklick gestartet werden kann, sollte auch ebenso gestartet werden per java -jar. Hintergrund ist, dass der Doppelklick da auch nichts anderes macht.
 
izoards

izoards

Aktives Mitglied
Hallo Kenitzel,

Hier ist mein pom.xml - file...

Da habe ich gewisse Einträge selbst gemacht, da ich über Moudule -> Dependencies -> Maven Suche, nicht erfolgreich war....

Java:
<?xml version="1.0" encoding="UTF-8"?>
<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>org.FlowSys</groupId>
    <artifactId>DocToPDF</artifactId>
    <version>0.9</version>
    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version> 2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

    </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.eclipse.platform</groupId>
            <artifactId>org.eclipse.swt.win32.win32.x86_64</artifactId>
            <version>3.116.0</version>
        </dependency>


    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics</artifactId>
        <version>11.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>11.0.1</version>
    </dependency>

    </dependencies>







    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>


Danke für deine HIlfe...
 
izoards

izoards

Aktives Mitglied
...und ich dachte mit Maven ist das einfacher...

Könnte es sein, dass meine JDK in IntelliJ gewisse libs schon drin hat und die JRE ohne IntelliJ eben nicht?

Würde man das dann über das pom.xml file "steuern"?
 
izoards

izoards

Aktives Mitglied
bei mir werden die eben in der "External Libraries" angezeigt:

Wobei in Maven, die Dependencies drin sind. Auch habe ich Plugins, z.B. verwende ich install um das Jar file zu generieren...

1620145699532.png
 

Anhänge

  • 1620145319377.png
    1620145319377.png
    38,4 KB · Aufrufe: 4
Zuletzt bearbeitet:
izoards

izoards

Aktives Mitglied
Habe jetzt noch herausgefunden, wo das Programm ausserhalb IntellJ hängen bleibt.

HIer mein Code.



Java:
 public void start(MainWindowController controller, String directory) throws Exception {

        System.out.println("Started");
        setStatus(controller, "started");

        WatchService watchService = FileSystems.getDefault().newWatchService();
        Path path = Paths.get(directory);
        setStatus(controller, "step1");

        docConverter converter = new docConverter("C:\\doctopdf\\OfficeToPDF.exe");
        setStatus(controller, "step2");
        createMail mail = new createMail();
        setStatus(controller, "step3");

        path.register(
                watchService,
                StandardWatchEventKinds.ENTRY_CREATE);

        setStatus(controller, "step4");
        FileHandler fileHandler = new FileHandler();
        setStatus(controller, "step5");
        String pathToJAR = "";
        WatchKey key;
        String fileNameWord = "";
        String fileNamePDF = "";
        setStatus(controller, "beforWhile");
        while ((key = watchService.take()) != null) {
            for (WatchEvent<?> event : key.pollEvents()) {
                setStatus(controller, "insideWatchService");
                startProgress(controller);
                fileNameWord = event.context().toString();
                System.out.println(
                        "Event kind:" + event.kind()
                                + ". File affected: " + fileNameWord + ".");

                fileNamePDF = fileNameWord.substring(0, fileNameWord.indexOf('.'));
                fileNamePDF = fileNamePDF + ".pdf";
                System.out.println("PDF Filename: " + fileNamePDF);

                pathToJAR = fileHandler.getJarLocation();

                //          System.out.println("inputDirectory: "+"C:\\DocToPDF\\Input\\" + fileNameWord + " output directory: "+ pathToJAR + "/tmp" + fileNameWord);



                TimeUnit.MILLISECONDS.sleep(100);
                fileHandler.moveFile("C:\\DocToPDF\\Input\\" + fileNameWord, pathToJAR + "/" + fileNameWord);

                converter.convert(pathToJAR + "/" + fileNameWord, "C:\\DocToPDF\\Output\\" + fileNamePDF);

                mail.sendEMail("C:\\DocToPDF\\Output\\" + fileNamePDF);

                fileHandler.deleteFile("C:\\DocToPDF\\Output\\" + fileNamePDF);
                fileHandler.deleteFile(pathToJAR + "/" + fileNameWord);
                stopProgress(controller);
            }
            key.reset();
        }
    }

Bei "Step2" bleibt das ding hängen...

Die Klasse "createMail" sieht so aus:

Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.ole.win32.*;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;



import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

public class createMail {


    private String pathToAttachment = "";

    public createMail() {



    }


       public void sendEMail(String pathToAttachment) {
            this.pathToAttachment = pathToAttachment;
            Display display = new Display();
            Shell shell = new Shell(display);
            OleFrame frame = new OleFrame(shell, SWT.NONE);




            // This should start outlook if it is not running yet
  //          OleClientSite site = new OleClientSite(frame, SWT.NONE, "OVCtl.OVCtl");
  //          site.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);

            // Now get the outlook application
            OleClientSite site2 = new OleClientSite(frame, SWT.NONE, "Outlook.Application");
            OleAutomation outlook = new OleAutomation(site2);

            OleAutomation mail = invoke(outlook, "CreateItem", 0 /* Mail item */).getAutomation();

            setProperty(mail, "BodyFormat", 2 /* HTML */);
            setProperty(mail, "Subject", "My test subject");
//      setProperty(mail, "From", "my@sender.org");
            setProperty(mail, "To", "<John Doe> my@recipient.org");
            setProperty(mail, "HtmlBody", "<html><body>This is an <b>HTML</b> test body.</body></html>");

      if (null != pathToAttachment) {
         // for (String pathToAttachment : pathToAttachment) {
              File file = new File(pathToAttachment);
              if (file.exists()) {
                  OleAutomation attachments = getProperty(mail, "Attachments");
                  invoke(attachments, "Add", pathToAttachment);
              }
          }


            invoke(mail, "Display" /* or "Send" */);
            display.close();

        }

        private static OleAutomation getProperty(OleAutomation auto, String name) {
            Variant varResult = auto.getProperty(property(auto, name));
            if (varResult != null && varResult.getType() != OLE.VT_EMPTY) {
                OleAutomation result = varResult.getAutomation();
                varResult.dispose();
                return result;
            }
            return null;
        }

        private static Variant invoke(OleAutomation auto, String command,
                                      String value) {
            return auto.invoke(property(auto, command),
                    new Variant[] { new Variant(value) });
        }

        private static Variant invoke(OleAutomation auto, String command) {
            return auto.invoke(property(auto, command));
        }

        private static Variant invoke(OleAutomation auto, String command, int value) {
            return auto.invoke(property(auto, command),
                    new Variant[] { new Variant(value) });
        }

        private static boolean setProperty(OleAutomation auto, String name,
                                           String value) {
            return auto.setProperty(property(auto, name), new Variant(value));
        }

        private static boolean setProperty(OleAutomation auto, String name,
                                           int value) {
            return auto.setProperty(property(auto, name), new Variant(value));
        }

        private static int property(OleAutomation auto, String name) {
            return auto.getIDsOfNames(new String[] { name })[0];
        }
    }


Gibt es einen Grund, wieso das in intellj funktioniert und als JAR nicht mehr?


Und noch eine Frage, wieso sehe ich die "System.out.println("Test") nachrichten nicht auf der CMD, wenn ich das Jar ab der CMD laufen lasse?
 
izoards

izoards

Aktives Mitglied
Wenn ich das mit dem ganzen Mail weglasse, funktioniert der Rest....
Dann müsste wohl die dependency bzw. diese imports:

Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.ole.win32.*;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

nicht funktionieren...

Kann mir jemand auf die Sprünge helfen, wie ich diese richtig importiere?
 
izoards

izoards

Aktives Mitglied
Java:
The POM for org.eclipse.platform:org.eclipse.swt:jar:3.116.0 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details

Da kommt noch eine Fehlermeldung beim compilieren... weiss nicht was ich damit anfangen soll....
 
kneitzel

kneitzel

Top Contributor
Ich hatte bisher keine Zeit, mir das im Detail anzusehen. Mich wundern nur eben ein paar Dinge:
Source/Target ist 8,
11er Openjfx in Dependencies

Ich habe beim Überfliegen der POM auf dem Handy jetzt nur das jar plugin gesehen aber kein shade Plugin oder so. Die Dependencies sollten somit nicht im Jar Enthalten sein ...

Beim Doppelklick soll das jar aber angeblich laufen ... da müssen die Dependencies aber irgendwoher kommen ... hast du die noch irgendwo hinterlegt? JDK mit JavaFX drin im Einsatz?
Hier fehlt mir gerade eine mögliche Erklärung ...

Die Meldung bezüglich der POM: neben dem jar File ist im Repository auch die POM hinterlegt mit weiteren Abhängigkeiten. Die werden dann (transitiv) ebenfalls geladen. Klar: Abhängigkeit braucht etwas anderes, also kommt das mit, damit es funktioniert.
Die Datei scheint es nicht zu geben oder sie scheint defekt zu sein. Daher die Meldung, denn ggf. notwendige weitere Abhängigkeiten sind nicht da ...

Was den Hänger angeht habe ich gerade keine Idee. Was für eine Eingabeaufforderung hast du genutzt? OLE dürfte Probleme machen im Admin Kontext. 32/64 Bit sind auch leicht mal ein Problem, aber da sollte es nicht hängen sondern einen Fehler bringen ...

Das wäre so jetzt von mir ein erstes Ferdback.
 
izoards

izoards

Aktives Mitglied
Hallo kneitzel, danke für deine Rückmeldung :)

Source/Target ist 8,
11er Openjfx in Dependencies

Also ich arbeite mit Java Version 8.
Ich dachte, die 11er Openjfx ist einfach die Version des JFX und muss nicht gleich sein wie die Java Version...

Ich kenne mich leider mit Maven noch zuwenig aus, da es das erste Projekt mit Maven ist. Wie kann ich das in IntelliJ einbinden?

JDK mit JavaFX drin im Einsatz?
Das könnte sein, also dass das sich automatisch dort drin verpackt hat... Wie könnte ich das prüfen?

Was für eine Eingabeaufforderung hast du genutzt? OLE dürfte Probleme machen im Admin Kontext. 32/64 Bit sind auch leicht mal ein Problem, aber da sollte es nicht hängen sondern einen Fehler bringen ...
Die ganz normale CMD von einem Windows 10, 64-Bit rechner... (Ohne Admin)

Der Hänger scheint meiner Einschätzung nach mit den org.eclipse.swt.SWT; abhängigkeiten zu Tun haben...(?)
 
kneitzel

kneitzel

Top Contributor
Wenn Du ein Oracle JDK 8 installiert hast, dann ist da wohl auch JavaFX mit enthalten. Das könntest Du ausprobieren indem Du einfach einmal die Abhängigkeiten diesbezüglich raus nimmst. Und dann einfach in Intellij das Goal package oder install laufen lassen. Oder Du schaust, ob Du bei der JDK / JRE Installation im ext Ordner ein jfxrt.jar findest (Ich hoffe, das hatte ich jetzt richtig in Erinnerung ... nicht, dass ich mich da vertan habe mit dem Ort oder dem Dateinamen).

Generell hast Du ja ein Maven Projekt, d.h. IntelliJ nutzt auch Maven und hat nur noch etwas Kram drumherum, der aber für das Projekt keine Rolle spielt bzw. nicht spielen sollte (Also .idea und *.iml sind auch nicht eingecheckt bei mir!)
Daher ist das shade Plugin eine reine Maven Einstellung innerhalb von build plugins:
Java:
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>${maven.jar.plugin.version}</version>
                    <executions>
                        <!-- Run shade goal on package phase -->
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

Die Version kannst Du direkt setzen - ich habe das in den Properties:
Java:
<maven.shade.plugin.version>3.2.4</maven.shade.plugin.version>

Dieses Shade Plugin schaut nach den Abhängigkeiten und packt diese mit in das jar File. Man kann da noch einiges an Configuration setzen, aber das Gute ist hier (wie so oft), dass die Standards viel abdecken. Daher könnte das schon ausreichend sein, um deine SWT Abhängigkeit mit ins jar File zu bekommen. Wenn es aber per Doppelklick läuft, dürfte das jar auch irgendwie anders eingebunden sein (CLASSPATH Variable oder im lib Ordner des JDK oder oder oder ...) Daher wirkt das alles noch etwas "dubios" auf mich (Aber das liegt einfach daran, dass ich dein Setup noch nicht überblicke und dass ich es etwas anders gewohnt bin. Aber das bedeutet nicht, dass der Weg nicht valide ist und Du diesen Weg nicht gehen kannst oder sollst.

Generell bin ich kein Freund davon, irgendwas auf dem Rechner voraus zu setzen. Aber wenn Du über ein jar File gehen willst (Bei Java 8 ist dies Standard!), dann geht es nicht anders.
 
izoards

izoards

Aktives Mitglied
Ich werde mich dann mal in einem nächsten Schritt mit dem JPackage auseinandersetzten. Das meinst du glaube ich mit:
Generell bin ich kein Freund davon, irgendwas auf dem Rechner voraus zu setzen. Aber wenn Du über ein jar File gehen willst (Bei Java 8 ist dies Standard!), dann geht es nicht anders.

Sehe ich das richtig, dass ich nach dem das Shade Plugin eingefügt wurde, ich das Jar auch wieder über "install" erstelle?

Wenn ich das mache, kommt folgender Fehler 🙆‍♂️

Java:
Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:3.2.4:shade (default) on project DocToPDF: Error creating shaded jar: Problem shading JAR C:\IntelliJ\FlowSys\target\DocToPDF-1.0-SNAPSHOT.jar entry META-INF/MANIFEST.MF: java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

Java:
C:\>java -jar C:\IntelliJ\FlowSys\target\DocToPDF-1.0-SNAPSHOT.jar
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
        at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:330)
        at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:263)
        at java.util.jar.JarVerifier.processEntry(JarVerifier.java:318)
        at java.util.jar.JarVerifier.update(JarVerifier.java:230)
        at java.util.jar.JarFile.initializeVerifier(JarFile.java:383)
        at java.util.jar.JarFile.ensureInitialization(JarFile.java:617)
        at java.util.jar.JavaUtilJarAccessImpl.ensureInitialization(JavaUtilJarAccessImpl.java:69)
        at sun.misc.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:991)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:451)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)

Das "original" jar lässt sich starten, jedoch mit dem Hänger...

Was ich einfach nicht verstehe ist, dass das Programm in IntelliJ läuft...
 
Zuletzt bearbeitet:
kneitzel

kneitzel

Top Contributor
Ok, das Problem mit dem Shade Plugin ist jetzt, dass die eine Abhängigkeit signiert ist. Die Signatur wird nun 1:1 übernommen und das sorgt dann für den Fehler.

Das behebt man am einfachsten, indem man die Signatur-Dateien nicht mit übernimmt. Dazu könnte man dem Plugin die folgende Config mitgeben:
XML:
        <configuration>
          <filters>
            <filter>
              <artifact>*:*</artifact>
              <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
              </excludes>
            </filter>
          </filters>
        </configuration>

Ach, in IntelliJ läuft es ... hatte Dich irgendwie vorher so verstanden, dass das erzeugte jar File per Doppelklick laufen würde ...

Das kann mehrere Gründe haben:
- Evtl. anderes JDK für das Projekt benutzt als das JDK, welches im Path ist.
- Evtl. zusätzliche Konfiguration in IntelliJ durchgeführt.

Sehe ich das richtig, dass ich nach dem das Shade Plugin eingefügt wurde, ich das Jar auch wieder über "install" erstelle?
Das ist eine Möglichkeit. Ich nutze in der Regel einfach das package. Dabei sollte alles aufgerufen werden, was Du brauchst.
Aber install geht auch - das macht das package und noch etwas mehr (das Du aber nicht brauchst meine ich).

Ich werde mich dann mal in einem nächsten Schritt mit dem JPackage auseinandersetzten.
Ja, das wäre dann aber einiges, was da dann kommen dürfte:
- Java 16 nutzen (dann hast Du auch jpackage und so) - OpenJDK wäre d meine Empfehlung z.B. von AdoptOpenJDK
- Modul-Informationen hinzufügen.
- moditect oder openjfx Plugin (Falls diese SWT Abhängigkeit keine module-info hat, dann vergiss openjfx Plugin und nimm moditect)

Bis vor kurzem war ich davon recht überzeugt - bis ich durch die "Automodule-Hölle" gehen durfte. Da wird dann die tolle javafx/openjfx Plugin Lösung relativ unbrauchbar und man muss zu moditect greifen was gut funktioniert aber ein kleines bisschen mehr Config benötigt.

Das mit dem Moditect will ich bei Gelegenheit auch mal etwas mehr dokumentieren, aber bisher habe ich da noch keine Zeit zu gefunden.
 
izoards

izoards

Aktives Mitglied
Du bist mein Held!
Ich glaube es nicht, es läuft. Ich habe die Config von dir genommen und nun funktionierts :)

Ist das ein Vorgehen, dass ich für alle Projekte so nehmen kann? Also die POM - Plugins, für weitere Projekte so übernehmen kann, damit diese Abhängigkeiten dann richtig gesetzt werden?

Wow, ich danke Dir vielmals!

a, das wäre dann aber einiges, was da dann kommen dürfte:
- Java 16 nutzen (dann hast Du auch jpackage und so) - OpenJDK wäre d meine Empfehlung z.B. von AdoptOpenJDK
- Modul-Informationen hinzufügen.
- moditect oder openjfx Plugin (Falls diese SWT Abhängigkeit keine module-info hat, dann vergiss openjfx Plugin und nimm moditect)
Uff, dann lasse ich das glaube ich...
Also gibt es keine Möglichkeit, dass ich das jetzige Jar, mit der notwendigen JRE in ein installer o.ä. packen könnte?
So dass es unabhängig von der installierten JRE vom System läuft?

Besten Dank nochmals, auch wenn ich es leider nicht ganz verstehe, bin ich sehr happy, dass das Phänomen mal gelöst ist 😄
 
kneitzel

kneitzel

Top Contributor
Erst einmal freut es mich, dass ich Dir helfen konnte.

Also gibt es keine Möglichkeit, dass ich das jetzige Jar, mit der notwendigen JRE in ein installer o.ä. packen könnte?
Doch, da gibt es natürlich auch diverse Möglichkeiten. Zu Java 8 Zeiten hatte ich das Tool jar2exe im Einsatz, welches aber etwas Geld gekostet hat. Aber es gibt hier auch einige freie Tools, die verwendet werden können. launch4j würde mir da direkt einfallen:
Davon habe ich damals Gutes gehört, aber ich habe es selbst nie eingesetzt.

Und es gibt da sogar ein Maven Plugin:
(Aber am Anfang würde ich auf jeden Fall erst einmal mit dem Tool als solches spielen!)

Dann würde ich auch immer eine JRE mitgeben. Oracle JRE wäre ich aber beim Weitergeben vorsichtig - Oracle hat das JRE halt unter einer Lizenz, die man bezüglich Weitergabe prüfen müsste (Ich habe es nie geprüft, evtl. ist es auch problemlos möglich, da das JRE in einem Bundle weiter zu geben). Bellsoft bietet aber auch JDK und JRE incl. JavaFX an. Dazu einfach mal auf
schauen und beim Download darauf achten, dass ein Full JDK / Full JRE herunter geladen wird.

Dann solltest Du etwas zusammen stellen können, das Du einfach weiter geben kannst und das alles beinhaltet. Dann ist auch egal, ob und welche Version von Java evtl. bereits installiert ist und so ....
 
izoards

izoards

Aktives Mitglied
Hallo Kneitzel
Erst einmal freut es mich, dass ich Dir helfen konnte.
Ohne dich hätte ich das nie hingekriegt! Ganz Vielen Dank für deine unermüdliche Hilfe hier in diesem Forum...
So macht es unheimlich Spass.

launch4j ist top und einfach :)
Habe soeben mein erstes exe mit integrierter jre generiert und werde es morgen mal auf einem rechner ohne jre testen..

Noch eine Frage zum „Umstieg“ auf eine neuere java version.....

Wenn ich mein Programm in IntelliJ laufen lasse, kommt jedesmal folgende Meldung:

Java:
Mai 05, 2021 9:36:21 PM javafx.fxml.FXMLLoader$ValueElement processValue
WARNING: Loading FXML document with JavaFX API of version 15.0.1 by JavaFX runtime of version 8.0.281

Ich habe im Scene Builder auch mal mit verschiedenen Preview Ansichten gespielt. Z.B. "Gluon Mobile Light" macht das GUI doch ziemlich moderner....

Nun Frage ich mich, wie ich so ein Gluon GUI erstellen kann.
Ist der Grund meine alte Java Version 8?

Gäbe es nicht eine einfache Lösung mein Code mit einer neueren JRE laufen zu lassen? Damit primär das GUI moderner aussieht?
 
kneitzel

kneitzel

Top Contributor
Dann drücke ich Dir die Daumen, dass die Tests morgen erfolgreich sind.

Wenn du den SceneBuilder innerhalb von IntelliJ nutzt, dann nutzt du die aktuelle Version. Daher kann es Probleme geben, wenn du auf Dinge zugreifst, die unterschiedlich sind zwischen 8 und 15.

Bei Gluon bekommt man auch die alte 8er Version von SceneBuilder meine ich. Die kannst du (außerhalb von IntelliJ) nutzen.

Ansonsten ist es relativ unkompliziert, auf Maven oder Gradle zu gehen mit Java 16. openjfx.io hat eine super Getting Started Dokumentation.

Ich muss mir Deine SWT Dependency einmal ansehen - evtl. schicke ich Dich gerade in eine Richtung, die zum Scheitern verurteilt ist :)

@mrBrown @dzim: wie seht ihr das eigentlich? Auf Grund der ‚Automodule Problematik‘ könnte es Sinn machen, generell auf openjfx.io mit deren Plugin zu verzichten und generell einfach ein Moditect Ansatz zu verfolgen.
 
izoards

izoards

Aktives Mitglied
Dann drücke ich Dir die Daumen, dass die Tests morgen erfolgreich sind.
Danke 🙏

Ansonsten ist es relativ unkompliziert, auf Maven oder Gradle zu gehen mit Java 16. openjfx.io hat eine super Getting Started Dokumentation.

also könnte ich, wenn ich mein code mit java 11 zum laufen bringe, ein moderneres gluon Gui machen? (Sowie wenn ich im scene builder das preview umschalte)
Also liegt es an der java version? So muss ich fragen...
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
@mrBrown @dzim: wie seht ihr das eigentlich? Auf Grund der ‚Automodule Problematik‘ könnte es Sinn machen, generell auf openjfx.io mit deren Plugin zu verzichten und generell einfach ein Moditect Ansatz zu verfolgen.
Da ich quasi nichts mit JavaFX mache und auch deren Plugin noch nie benutzt hab, kann ich da kaum was zu sagen 😅
Bis Genügend Projekte modularisiert sind (ich hoffe, Java 17 bringt da noch mal etwas Schwung rein), halte ich Moditect aber für das praktischste dabei.
 
izoards

izoards

Aktives Mitglied
dzim

dzim

Top Contributor
@mrBrown @dzim: wie seht ihr das eigentlich? Auf Grund der ‚Automodule Problematik‘ könnte es Sinn machen, generell auf openjfx.io mit deren Plugin zu verzichten und generell einfach ein Moditect Ansatz zu verfolgen.
I'm late to the show. Sorry! 😱

Also wir haben für unser Tool den Ansatz tatsächlich auch an jeglichen "offiziellen" Plugins vorbei gewählt. Hintergrund ist, dass unser Tool zwar mit Java 11 und auswärts kompatibel ist, aber nicht modularisiert, da wir eine uralt-Abhängigkeit drin haben, die nicht modularisierbar ist (und nein, wir hatten weder Zeit noch Geld es selbst modularisierbar zu machen). Also haben wir uns von Dirk Lemmermann und Michael Pausch inspirieren lassen. Die Beiden haben beim Ersten mal ein Demo-GitHub-Projekt gemacht:

Hauptaugenmerk hier waren Windows und Mac, aber es war relativ easy noch Linux hinzuzufügen.
Das "Problem" (wenn man es so bezeichnen möchte) and dem Ansatz ist halt, wie bereits erwähnt, dass man zwar mit jlink sich ein massgeschneidertes JRE erschafft und dann mit jpackage auch ein fertig geschnürtes Packet bekommt, aber man verliert auf die Art sämtliche Modularität verzichtet.
Und um ehrlich zu sein, finde ich es noch immer zäh, ein bestehendes nicht-modulares Projekt mit Modulinformationen anzureichern. Ich hab dann gerne mal Probleme mit Resourcen etc. Und dann am Ende ist es mir das nicht mehr wert. Dann lieber gleich für GraalVM parat machen.

Hat jemand Erfahrung mit launch4J?
Mein Kollege hat für unser Tool für Windows tatsächlich launch4j genommen, weil jpackage (oder war es WiX oder oder das andere Windows-Installer-Toolset?) wohl einen Bug hat, dass die Installation in User-Verzeichnissen (<User>/AppData/Local/...), wenn der User Sonderzeichen im Namen hat (hallo Umlaute, und viele andere Zeichen aus anderen Sprachen, ausser English).
Aber wie es konkret funktioniert, weiss ich nicht. Ich müsste mir das Build-Script, dass wir aus Maven heraus anstossen, da erst mal genauer anschauen. Aber ich bin halt der Linux-Guy, Windows interessiert mich da halt nicht so. 😉
 
izoards

izoards

Aktives Mitglied
Wenn du den SceneBuilder innerhalb von IntelliJ nutzt, dann nutzt du die aktuelle Version. Daher kann es Probleme geben, wenn du auf Dinge zugreifst, die unterschiedlich sind zwischen 8 und 15.

Bei Gluon bekommt man auch die alte 8er Version von SceneBuilder meine ich. Die kannst du (außerhalb von IntelliJ) nutzen.

Ansonsten ist es relativ unkompliziert, auf Maven oder Gradle zu gehen mit Java 16. openjfx.io hat eine super Getting Started Dokumentation.

Ich wollte nun mal versuchen ein Gluon GUI in SceneBuilder zu erstellen. Ich habe dazu das HelloFX von openjfx.io verwendet.
Dieses läuft soweit. Wenn ich nun in Scene Builder ein Gluon element einfüge, kommt jedoch ein Fehler:

Java:
C:\Users\fabxxxx\.jdks\adopt-openjdk-11.0.11\bin\java.exe --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2.3\lib\idea_rt.jar=56922:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2.3\bin" -Dfile.encoding=UTF-8 -p C:\Users\fabzue01\.m2\repository\org\openjfx\javafx-base\15.0.1\javafx-base-15.0.1-win.jar;C:\Users\fabzue01\.m2\repository\org\openjfx\javafx-graphics\15.0.1\javafx-graphics-15.0.1-win.jar;C:\IntelliJ\FlowSys\hellofx\target\classes;C:\Users\fabzue01\.m2\repository\org\openjfx\javafx-controls\15.0.1\javafx-controls-15.0.1.jar;C:\Users\fabzue01\.m2\repository\org\openjfx\javafx-controls\15.0.1\javafx-controls-15.0.1-win.jar;C:\Users\fabzue01\.m2\repository\org\openjfx\javafx-graphics\15.0.1\javafx-graphics-15.0.1.jar;C:\Users\fabzue01\.m2\repository\org\openjfx\javafx-base\15.0.1\javafx-base-15.0.1.jar;C:\Users\fabzue01\.m2\repository\org\openjfx\javafx-fxml\15.0.1\javafx-fxml-15.0.1.jar;C:\Users\fabzue01\.m2\repository\org\openjfx\javafx-fxml\15.0.1\javafx-fxml-15.0.1-win.jar;C:\Users\fabzue01\.m2\repository\com\gluonhq\charm-glisten\6.0.6\charm-glisten-6.0.6.jar -m org.openjfx/org.openjfx.App
Error occurred during initialization of boot layer
java.lang.module.FindException: Module com.gluonhq.attach.util not found, required by com.gluonhq.charm.glisten

Process finished with exit code 1


Mein pom.xml habe ich mit der "charm glisten" dependency ergänzt:

Java:
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.openjfx</groupId>
    <artifactId>HelloFx</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>15.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>15.0.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.gluonhq/charm-glisten -->
        <dependency>
            <groupId>com.gluonhq</groupId>
            <artifactId>charm-glisten</artifactId>
            <version>6.0.6</version>
        </dependency>

    </dependencies>
    <repositories>
        <repository>
            <id>charm-glisten</id>
            <name>charm-glisten Repository</name>
            <url>https://nexus.gluonhq.com/nexus/content/repositories/releases/</url>
            <layout>default</layout>
        </repository>
    </repositories>



    <build>
        <plugins>


            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.4</version>
                <configuration>
                    <mainClass>org.openjfx.App</mainClass>
                    <executable>C:\Users\zusel\.jdks\adopt-openjdk-11.0.11\bin\java</executable>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Die module-info datei sieht wie folgt aus:

Java:
module org.openjfx {
    requires javafx.controls;
    requires javafx.fxml;
    requires com.gluonhq.charm.glisten;

    opens org.openjfx to javafx.fxml;
    exports org.openjfx;
}

Fehlt da noch etwas? Oder wieso erhalte ich diese Fehlermeldung?
Danke für die Hilfe :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
W Swing GUI startet nicht AWT, Swing, JavaFX & SWT 3
P Swing Warum startet das Programm nicht? AWT, Swing, JavaFX & SWT 3
N Applikation startet nicht AWT, Swing, JavaFX & SWT 2
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
G .jar startet nicht nach Exportierung AWT, Swing, JavaFX & SWT 7
V JavaFX SceneBuilder startet nicht AWT, Swing, JavaFX & SWT 18
A Applet Applet startet nicht AWT, Swing, JavaFX & SWT 2
S JDialog startet immer wieder neu AWT, Swing, JavaFX & SWT 2
T Wer startet den EDT? AWT, Swing, JavaFX & SWT 4
T [Applet] startet in Eclipse aber nicht im Browser AWT, Swing, JavaFX & SWT 2
I Wann genau startet der AWT-Thread? AWT, Swing, JavaFX & SWT 3
G Wie startet man ein Applet ? AWT, Swing, JavaFX & SWT 4
A Progress Bar startet zu "spät" AWT, Swing, JavaFX & SWT 7
H Animation startet nicht/ Thread AWT, Swing, JavaFX & SWT 6
N Swing startet nicht - java.lang.NoSuchMethodError: main AWT, Swing, JavaFX & SWT 8
frau-u JFileChooser startet nicht AWT, Swing, JavaFX & SWT 2
S0PEX JavaFX Java 8 auf 15 migrieren OpenJFX mit Gradle eingebunden, jedoch nicht gefunden !? AWT, Swing, JavaFX & SWT 4
J JavaFX eine Art Tabelle, jedoch mit mehreren Zeilen AWT, Swing, JavaFX & SWT 2
W fehler jedoch ka wo AWT, Swing, JavaFX & SWT 14
L FX-Projekt: fast leere Fensterausgabe ohne Fehlermeldung AWT, Swing, JavaFX & SWT 6
H Timer ohne alles lahmzulegen? AWT, Swing, JavaFX & SWT 2
Z Random Butten erstellen ohne Container AWT, Swing, JavaFX & SWT 15
VPChief Ein JFrame ohne setUndecorated(true); nicht verschiebbar machen. AWT, Swing, JavaFX & SWT 6
Fiedlerdan Vergleich vieler Strings ohne ellenlange Argumentierten AWT, Swing, JavaFX & SWT 7
L Daten bearbeiten ohne GUI zu blockieren - daten haltung/zurück geben AWT, Swing, JavaFX & SWT 15
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
N Aktualisierung des Fensters AWT Java ohne Ruckeln AWT, Swing, JavaFX & SWT 3
T JavaFX Dialog schließt ohne dass es schließen soll AWT, Swing, JavaFX & SWT 1
K JFreeChart nicht ohne BarChartDemo startklar? AWT, Swing, JavaFX & SWT 5
GenerationLost JavaFX FileChooser speichern ohne Zieldatei? AWT, Swing, JavaFX & SWT 12
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
M Menü ohne Menübar umsetzen[SWT] AWT, Swing, JavaFX & SWT 8
kilopack15 Buttons ohne Funktion AWT, Swing, JavaFX & SWT 2
S 2D-Grafik User-BufferedImage rotieren im Zentrum und ohne "anpassung" AWT, Swing, JavaFX & SWT 2
Ghostman1711 Java JFormattedTextfield MaskFormatter ohne Leerzeichen AWT, Swing, JavaFX & SWT 3
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
C Jframe ohne Rahmen AWT, Swing, JavaFX & SWT 3
R JavaFX Wert einer ChoiceBox bekommen ohne Lambdas AWT, Swing, JavaFX & SWT 11
Fishmeaker Shortcuts ohne ALT zuweisen AWT, Swing, JavaFX & SWT 1
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
M JavaFX Ein Bild ohne Rahmen fällt runter? AWT, Swing, JavaFX & SWT 2
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
F Swing JPanels übereinander ohne Mananger AWT, Swing, JavaFX & SWT 1
N GUI Design ohne GUIDesigner AWT, Swing, JavaFX & SWT 10
X Swing Ein neues Fenster öffen aber ohne ein extra Prozess zu starten AWT, Swing, JavaFX & SWT 1
C JTextfield ohne Enter feuern AWT, Swing, JavaFX & SWT 8
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
A Textfeld.append/.setText ohne Funktion AWT, Swing, JavaFX & SWT 2
T JAXB funktioniert ohne IDE nicht verlässlich AWT, Swing, JavaFX & SWT 12
H org.eclipse.swt.Slider ohne Buttons AWT, Swing, JavaFX & SWT 1
M Benutzer-Dialog ohne System.in/out AWT, Swing, JavaFX & SWT 2
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
T Swing HTML Text aus JLabel ohne "HTML-Tags" in String einlesen AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Simple Grafikanzeige ohne Desktopumgebung? AWT, Swing, JavaFX & SWT 2
F Swing Datenmodell in Tree spiegeln ohne Adapterklassen AWT, Swing, JavaFX & SWT 5
I JTable Inhalte löschen ohne den JTable zu verändern! AWT, Swing, JavaFX & SWT 5
T Bild drehen ohne Resize AWT, Swing, JavaFX & SWT 3
J Einträge aus Table löschen ohne Exception AWT, Swing, JavaFX & SWT 6
C Swing Fortschrittsanzeige im Dialog ohne Fortschrittsbalken und Abbruchoption AWT, Swing, JavaFX & SWT 7
M JSlider-Wert ändern, ohne ein ChangeEvent auszulösen AWT, Swing, JavaFX & SWT 4
J SWING - Programm ohne Eclipse etc. starten AWT, Swing, JavaFX & SWT 7
V Swing JButton ohne Border bei Anklicken AWT, Swing, JavaFX & SWT 3
M SWING Listener ohne Wirkung AWT, Swing, JavaFX & SWT 2
J Swing Farbe wählen ohne JColorChooser 2 AWT, Swing, JavaFX & SWT 23
Oliver530 JButton setEnabled(false) ohne Farbverlust AWT, Swing, JavaFX & SWT 3
B Swing JEditorPane ohne Zeilenumbruch nach InputStream AWT, Swing, JavaFX & SWT 2
D Swing JComponent zeichnen ohne sie zur Oberfläche hinzuzufügen AWT, Swing, JavaFX & SWT 2
GUI-Programmer Swing JWindow - Programm wird ohne Grund beendet AWT, Swing, JavaFX & SWT 3
N Swing JSpinner mit Datum aber ohne Uhrzeit AWT, Swing, JavaFX & SWT 2
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
S Java GUI Anwendung ohne Konsole starten AWT, Swing, JavaFX & SWT 6
J Swing JTable: Komplette Zeile aber ohne Spalten markieren AWT, Swing, JavaFX & SWT 11
C JFrame ohne Titelleiste, aber mit Borders AWT, Swing, JavaFX & SWT 2
D 3D-Grafik Java 3D ohne Plugin AWT, Swing, JavaFX & SWT 4
S Swing Zelle einer JTable hervorheben (ohne CellRenderer) AWT, Swing, JavaFX & SWT 3
R Swing Variable Panelbreite ohne Layoutmanager AWT, Swing, JavaFX & SWT 6
M Zugriff auf Variablen eines Objektes ohne sie auf static zu setzen AWT, Swing, JavaFX & SWT 9
H Anwendung schließen ohne System.exit AWT, Swing, JavaFX & SWT 5
T GUI ohne Rahmen auf Desktop AWT, Swing, JavaFX & SWT 3
S Bilddatei kopieren, aber ohne verluste und ohne zu großen Speicherverbrauch AWT, Swing, JavaFX & SWT 17
T jPanels im jFrame bewegen - Auch ohne Textfield? AWT, Swing, JavaFX & SWT 4
R Anwendung ohne Symbol in der Taskleiste AWT, Swing, JavaFX & SWT 3
G JSpinner ohne Tausendertrennzeichen AWT, Swing, JavaFX & SWT 5
D Aufruf neuer Klasse ohne Erzeugung eines neuen Fensters AWT, Swing, JavaFX & SWT 3
U JDialog ohne Taskleiste AWT, Swing, JavaFX & SWT 7
R Swing jbutton.setEnabled(false) ohne Ausgrauung des Buttons? AWT, Swing, JavaFX & SWT 6
Spin JTable Header wird nicht angezeigt ohne ScrollPane AWT, Swing, JavaFX & SWT 3
W AWT Drucken ohne Druckdialog AWT, Swing, JavaFX & SWT 2
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
C JTextPane / JEditorPane ohne Keywords farbig machen AWT, Swing, JavaFX & SWT 4
S TextArea ausgabe ohne JFrame zu implementieren AWT, Swing, JavaFX & SWT 2
M 3D-Grafik Bewegung mit der Maus ohne Klicken AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Anzeige

Neue Themen


Oben