# Bekomme keine lauffähige jar (netbeans/gradle)



## Joob (25. Okt 2019)

Ich versuche eine lauffähige jar zu erzeugen.
In der Gradlestruktur wird auch eine Jar erzeugt und enthält alles inkl. der Resources, es fehlen aber die Abhänigkeiten.
Daneben werden im Verzeichnis Distributions zwei kompremierte Dateien erzeugt, die die jar und alle abhängigen jars enthalten.
Leider läuft da gar nichts.


Ich möchte eigentlich keine fatjar erzeugen, sondern die Jar und dann dann die Abhängigkeiten in einem Verzeichnis, ich fand das 
so wie ANT es automatisch gemacht hat ganz übersichtlich.

Ich muss wohl in meinem build.gradle noch Eintragungen in dem Bereich JAR machen,
allerdings sind Lösungsvorschläge für mich sehr verwirrend und ich möchte es vermeiden weiter Abhängigkeiten zu verwenden.

Hier ist mein build.gradle und meine Projektstruktur, kann mir jemand einen Tipp geben, was ich tun muss ?

Ich habe meine Versuche mit jar{} rausgenommen, weil ich nicht so ganz verstehe was da passiert.
Außerdem fehlt meinem Projekt wohl auch eine Manifest Datei in der nochmals die Main angegeben wird. (Muss ich die anlegen, steht doch schon im build.gradle)


```
plugins {
  id 'java'
  id 'application'
  id 'jacoco'
  id 'org.openjfx.javafxplugin' version '0.0.8'
 
}


repositories {
    
    jcenter()

}



dependencies {

    compile group: 'org.json', name: 'json', version: '20171018'
    compile group: 'com.jcraft', name: 'jsch', version: '0.1.50'
    compile group: 'commons-net', name: 'commons-net', version: '3.6'
    compile group: 'net.lingala.zip4j', name: 'zip4j', version: '1.2.4'
    compile group: 'com.googlecode.soundlibs', name: 'jlayer', version: '1.0.1.4'
    
    // JASPER
    compile group: 'xerces', name: 'xercesImpl', version: '2.8.0'                       // wegen der Verwendung von Grammatiken durch jasper
    compile group: 'com.lowagie', name: 'itext', version: '2.1.7'                       // abhängigkeit von jasper
    compile group: 'net.sf.jasperreports', name: 'jasperreports', version: '6.10.0'     // ACHTUNG Version muss im Jasper Studio angepaßt sein, siehe Systemhandbuch : Reports   
    
    testCompile 'junit:junit:4.12'
    
    
        
}


javafx {
    
    modules = [ 'javafx.base', 'javafx.controls', 'javafx.fxml', 'javafx.graphics', 'javafx.media', 'javafx.swing', 'javafx.web' ]
    version = "13"
}




mainClassName = 'org.joobsoft.vt.MAIN.Main'
```


----------



## Joob (25. Okt 2019)

Ich habe jetzt mal versucht die Distribution auf dem Desktop zu entpacken und dann über Comand auszuführen.
Dann bekomme ich folgende Fehlermeldung.



Die Javafx Komponeten sind aber in dem Paket. Wie man sieht.


----------



## Joob (25. Okt 2019)

Habe jetzt eine neue Main geschrieben die nichts tut als die alte aufzurufen.
Dann läuft es

Aber nur wenn man die .bat aus dem Distributionenpaket aufruft.
Das ist alles Mist. Kack gradel.


----------



## mrBrown (25. Okt 2019)

Ersterer Fehler hat nichts mit gradle zu tun, sondern liegt am nicht-nutzen des Modulsystems.


Das man das über die bat startet, ist genau so gedacht. Du kannst das auch ohne bat starten, musst dann halt nur die entsprechenden Kommandozeilen-Parameter per Hand eingeben (was niemand möchte)


----------



## Joob (25. Okt 2019)

Weiß jemand wie man mit Gradel eine ausführbare jar erzeugt ?


----------



## Joob (25. Okt 2019)

@mrBrown : Das hat doch bei Ant einwandfrei geklappt,
hab ich das nicht richtig konfiguriert ?

Ich brauche eine ausführbare JAR, das muss doch auch mit Gradel konfigurierbar sein.


----------



## Joob (25. Okt 2019)

@mrBrown 
Ich probiers gleich mal so 
dann hab zwar eine fatjar, gibt es da sinnvolle Größenbeschränkungen ?
Ich will daraus hinterher eine exe machen.


```
plugins {
  id 'java'
  id 'com.github.johnrengelman.shadow' version '1.2.2'
}
...
...
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'
...
...
mainClassName = 'com.acme.myapp.MyClassMain'
...
...
...
shadowJar {
    baseName = 'myapp'
}
```


----------



## mrBrown (25. Okt 2019)

Joob hat gesagt.:


> @mrBrown : Das hat doch bei Ant einwandfrei geklappt,
> hab ich das nicht richtig konfiguriert ?
> 
> Ich brauche eine ausführbare JAR, das muss doch auch mit Gradel konfigurierbar sein.


Was kam denn mit ant am Ende raus?

Das dürftest du mit gradle alles nachbauen können. Vermutlich müsstest du nur das Manifest der Jar anpassen, und alle Deps in ein passendes Verzeichnis kopieren, das dürfte mit Gradle kein Hexenwerk sein (ich wüsste es grad nur für Maven).



Joob hat gesagt.:


> dann hab zwar eine fatjar, gibt es da sinnvolle Größenbeschränkungen ?
> Ich will daraus hinterher eine exe machen.



Keine Ahnung, bisher hab ich keine erreicht.

Für eine exe (warum denn überhaupt?) wäre uU auch jpackager interessant.


----------



## Joob (26. Okt 2019)

@mrBrown:

Ich verwende Lanch4j um aus der ja eine exe zu machen und all das Zeug wie ICON, Startbild usw. mitzugeben.
Die Exe bau ich dann in ein Setuppaket ein. (InnoSetup)

Das ist entstanden aus dem Ergebnis des Ant Builds und gefällt mir gut.
Ich würde mich natürlich über eine Vorschlag freuen der das noch erleichtert oder verbessert.

Bis dahin würde ich gerne Gradel dazu bringen 
mir eine ausführbare Jar zu erzeugen und wenn möglich
die Libs in einen separaten Verzeichnis zu speichern und in der jar den pfad zu den Abhänigkeiten mit anzulegen.

So sah das bei ANT aus

ausführbareJAR.jar

(folder) libs
(folder) webfiles

wofür der folder webfiles war hat sich mir nicht erschlossen, aber in libs lagen die nun unter dependencies eingetragenen Libaries 

wenns anders nicht möglich ist auch eine fatjar, ich mach mir nur ein wenig Sorgen wegen der Größe, die würde min. 30 MB und das müsste doch schlechten Einfluss auf die Ladezeit und Laufzeit haben oder ?


----------



## Joob (26. Okt 2019)

@mrBrown : könnntest du noch mal schauen, bin jetzt ein ganzes Stück weiter

erst einmal das aktuelle gradle.build

```
plugins {
  id 'java'
  id 'java-library-distribution'
  id 'application'
  id 'jacoco'
  id 'org.openjfx.javafxplugin' version '0.0.8'


}


repositories {
   
    jcenter()

}



dependencies {

    compile group: 'org.json', name: 'json', version: '20171018'
    compile group: 'com.jcraft', name: 'jsch', version: '0.1.50'
    compile group: 'commons-net', name: 'commons-net', version: '3.6'
    compile group: 'net.lingala.zip4j', name: 'zip4j', version: '1.2.4'
    compile group: 'com.googlecode.soundlibs', name: 'jlayer', version: '1.0.1.4'
   
    // JASPER
    compile group: 'xerces', name: 'xercesImpl', version: '2.8.0'                       // wegen der Verwendung von Grammatiken durch jasper
    compile group: 'com.lowagie', name: 'itext', version: '2.1.7'                       // abhängigkeit von jasper
    compile group: 'net.sf.jasperreports', name: 'jasperreports', version: '6.10.0'     // ACHTUNG Version muss im Jasper Studio angepaßt sein, siehe Systemhandbuch : Reports  
   
    compile group: 'org.openjfx', name: 'javafx-controls', version: '13'
   
    testCompile 'junit:junit:4.12'
   
   
       
}

javafx {
    modules = [ 'javafx.base', 'javafx.controls', 'javafx.fxml', 'javafx.graphics', 'javafx.media', 'javafx.swing', 'javafx.web' ]
    version = "13"
}



application {
    mainClassName = 'org.joobsoft.vt.MAIN.Main'
}



// zur Erstellung runable jar
jar {
       
    archiveName = 'VTD.jar'
   
    // Keep jar clean:
    exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'

    manifest {
        attributes 'Main-Class': 'org.joobsoft.vt.MAIN.Main',
                   'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
    }
    // How-to add class path:
    //     https://stackoverflow.com/questions/22659463/add-classpath-in-manifest-using-gradle
    //     https://gist.github.com/simon04/6865179
}
```

Es wird nun eine Jar erzeugt, die sollte runable sein (woran kann ich das sehen)
Allerdings werden in der distribution alle libs doppelt eingebaut, ich zeig mal einen Screenshot


Wenn ich die Batch aufrufe, dann läuft alles planmäßig, aber das ist ja nicht mein Ziel
Wenn ich die jar aufrufe bekomme ich folgenden Fehler: im cmd

C:\Users\Jupp>java -jar C:\Users\Jupp\Desktop\VTDESKTOP\lib\VTD.jar
Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:823)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:721)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:644)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at org.joobsoft.vt.MAIN.Main.main(Main.java:14)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:604)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 10 more

obwohl die Main gar kein FX enthält, das wird erst in der MainFX importiert

```
package org.joobsoft.vt.MAIN;

/**
*
* @author Jupp
*/
public class Main {
        public static void main(String[] args) {
        MainFX.main(args);
    }
}
```

Im Manifest stehen aber die ganzen Fx drin:
Manifest-Version: 1.0
Main-Class: org.joobsoft.vt.MAIN.Main
Class-Path: lib/json-20171018.jar lib/jsch-0.1.50.jar lib/commons-net-3.
6.jar lib/zip4j-1.2.4.jar lib/jlayer-1.0.1.4.jar lib/xercesImpl-2.8.0.j
ar lib/jasperreports-6.10.0.jar lib/itext-2.1.7.jar lib/javafx-controls
-13.jar lib/junit-3.8.2.jar lib/xml-apis-1.3.03.jar lib/bcmail-jdk14-13
8.jar lib/bcprov-jdk14-138.jar lib/commons-digester-2.1.jar lib/commons
-beanutils-1.9.3.jar lib/castor-xml-1.4.1.jar lib/castor-core-1.4.1.jar
  lib/commons-logging-1.2.jar lib/commons-collections4-4.2.jar lib/jfree
chart-1.0.19.jar lib/jcommon-1.0.23.jar lib/ecj-4.4.2.jar lib/jackson-d
atabind-2.9.9.jar lib/jackson-core-2.9.9.jar lib/jackson-annotations-2.
9.9.jar lib/javafx-graphics-13.jar lib/bctsp-jdk14-1.38.jar lib/commons
-collections-3.2.2.jar lib/commons-lang3-3.4.jar lib/javax.inject-1.jar
  lib/javafx-base-13.jar lib/bcmail-jdk14-1.38.jar lib/bcprov-jdk14-1.38
.jar

Kannst du mir die Ursachen erklären ?
Viel scheint nicht mehr zu fehlen um das zum Laufen zu bringen, oder ?
Wahrscheinlich ist die jar nicht runable, aber wie bekomme ich das dem gradle beigebracht.


----------



## Joob (26. Okt 2019)

@mrBrown 

Hab mich so auf das runable jar und meine alte ANT jar fixiert, das ich gar nicht in Erwägung gezogen habe aus der Batch ne Exe zu machen und es dann so in mein Setup zu bauen.

Probier ich jetzt erst mal, allerdings wundert es mich schon das in der Distribution die Files doppelt sind.
Habe jetzt auch mal das Build.gradel auf ein Minimum reduziert


----------



## Joob (26. Okt 2019)

Ich hab mir mal jpackager angesehen, würde der nicht an der Struktur von gradle scheitern ?

myinput/
      myapp.jar
      lib/
        lib1.jar
        lib2.jar

*gradle*

myinput/
bin/ 
batchfile
lib/
Klassen


----------



## Joob (26. Okt 2019)

@mrBrown

läuft jetzt, die doppelten Einträge wurden durch
  id 'java-library-distribution'
  id 'application'

erzeugt,
id 'application'
reicht.

Habe jetzt einige Wochen darauf verwendet die IDE umzustellen alle Libs upzudaten und als Build Tool Gradel einzusetzen,
ich wollte endlich die Probleme die nichts mit der eigentlichen Programmierung zu tun haben erledigt habe,
aber bei jedem Schritt kam eins dazu. Das ist so unübersichtlich und man weiß einfach nicht wie man das anfassen soll und
das frustriert.

Bin aber so zufrieden und denke das nun alles für mich nachvollziehbar ist.

Schönen Dank für deine Hilfe.


----------

