0

I've been looking for a solution for this for 4 days now with no success,

first doing the normal Gradle build task produced a tiny 7kB jar files which obviously didn't work, then i added the jar configuration for the main class:

jar {
    manifest {
        attributes 'Main-Class': 'Main'
    }
}

It's 2MB now!

Still not good enough, then i found the fatJar/uberJar/shadow tasks, said to be synonymous to the same thing so i tried clean then fatJar tasks on another small RMI app that will run on the server and it worked great, copied it to the main app, it produces and 60MB jar file which looks good but it won't work for some reason,

The app runs perfectly from my IDE (IntelliJIDEA) but the jar produced just does nothing.

So my last option is to consult experts so here we go:

This's the result of the clean task:

6:11:10 PM: Executing external task 'clean'...

:clean

BUILD SUCCESSFUL

Total time: 0.774 secs

6:11:11 PM: External task execution finished 'clean'.

This's the result of the fatJar task:

6:13:13 PM: Executing external task 'fatJar'...

Note: Some input files use unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

:compileJava

:processResources

:classes

:fatJar

BUILD SUCCESSFUL

Total time: 24.831 secs

6:13:37 PM: External task execution finished 'fatJar'.

This's my build.gradle file

group 'Yasmeena'
version '1.0-SNAPSHOT'

apply plugin: 'java'

compileJava.options.encoding = 'UTF-8'

sourceCompatibility = 1.8

jar {
    manifest {
        attributes 'Main-Class': 'Main'
    }
}

task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar',
                'Implementation-Version': version,
                'Main-Class': 'Main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

allprojects {
    repositories {
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}

dependencies {

    compile 'com.mchange:c3p0:0.9.5.2'
    compile 'commons-beanutils:commons-beanutils:1.9.3'
//    compile 'org.apache.commons:commons-collections3:2.2-SNAPSHOT'
    compile 'commons-digester:commons-digester:2.1'
    compile 'commons-logging:commons-logging:1.2'
    compile 'commons-validator:commons-validator:1.6'
    compile 'org.controlsfx:controlsfx:8.40.13'
    compile 'com.jfoenix:jfoenix:1.7.0'
    compile 'com.mchange:mchange-commons-java:0.2.11'
    compile 'com.github.PlusHaze:TrayNotification:-SNAPSHOT'
    compile 'com.google.firebase:firebase-admin:5.3.0'

    compile 'org.jetbrains:annotations:15.0'
    compile 'org.slf4j:slf4j-simple:1.7.25'

    compile group: 'org.postgresql', name: 'postgresql', version: '42.1.4'
    compile group: 'com.impossibl.pgjdbc-ng', name: 'pgjdbc-ng', version: '0.6'
    compile group: 'org.eclipse.jdt.core.compiler', name: 'ecj', version: '4.6.1'
    compile group: 'de.jensd', name: 'fontawesomefx', version: '8.9'
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2.2'
    compile group: 'com.lowagie', name: 'itext', version: '2.1.7'
    compile group: 'org.olap4j', name: 'olap4j', version: '1.2.0'

    compile fileTree(dir: 'lib', include: 'ReportUtilities.jar')

    compile('net.sf.jasperreports:jasperreports:6.4.1') {
        exclude group: 'com.itextpdf'
    }
    runtime 'com.itextpdf:itextpdf:5.5.0'
    runtime 'com.itextpdf:itext-pdfa:5.5.0'

    testCompile group: 'junit', name: 'junit', version: '4.12'
}

my Main.java class which holds my main method exists directly in the main -> java directory

This's my settings.gradle file:

rootProject.name = 'Yasmeena'

My main method is a simple method that launches the JavaFX application:

public static void main(String[] args) {
        launch(args);
}

This's my project structure

UPDATE:

Current state of build.gradle file:

group 'Yasmeena'
version '1.0-SNAPSHOT'

apply plugin: 'java'

compileJava.options.encoding = 'UTF-8'

sourceCompatibility = 1.8

jar {
    manifest {
        attributes 'Main-Class': 'activities.Main'
    }
}

allprojects {
    repositories {
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}

dependencies {

    compile 'com.mchange:c3p0:0.9.5.2'
    compile 'commons-beanutils:commons-beanutils:1.9.3'
    compile 'commons-digester:commons-digester:2.1'
    compile 'commons-logging:commons-logging:1.2'
    compile 'commons-validator:commons-validator:1.6'
    compile 'org.controlsfx:controlsfx:8.40.13'
    compile 'com.jfoenix:jfoenix:1.7.0'
    compile 'com.mchange:mchange-commons-java:0.2.11'
    compile 'com.github.PlusHaze:TrayNotification:-SNAPSHOT'
    compile 'com.google.firebase:firebase-admin:5.3.0'

    compile 'org.jetbrains:annotations:15.0'
    compile 'org.slf4j:slf4j-simple:1.7.25'

    compile group: 'org.postgresql', name: 'postgresql', version: '42.1.4'
    compile group: 'com.impossibl.pgjdbc-ng', name: 'pgjdbc-ng', version: '0.6'
    compile group: 'org.eclipse.jdt.core.compiler', name: 'ecj', version: '4.6.1'
    compile group: 'de.jensd', name: 'fontawesomefx', version: '8.9'
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2.2'
    compile group: 'com.lowagie', name: 'itext', version: '2.1.7'
    compile group: 'org.olap4j', name: 'olap4j', version: '1.2.0'

    compile fileTree(dir: 'lib', include: 'ReportUtilities.jar')

    compile('net.sf.jasperreports:jasperreports:6.4.1') {
        exclude group: 'com.itextpdf'
    }
    runtime 'com.itextpdf:itextpdf:5.5.0'
    runtime 'com.itextpdf:itext-pdfa:5.5.0'

    testCompile group: 'junit', name: 'junit', version: '4.12'
}

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'eu.appsatori:gradle-fatjar-plugin:0.3'
    }
}

task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar',
                'Implementation-Version': version,
                'Main-Class': 'activities.Main',
                'Class-Path': ". ${configurations.compile.collect { it.getName() }.join(' ')}"
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

Current state of project structure

Inside the jar file there's an activities folder which contains a Main.class file

UPDATE:

jar file -> META-INF -> MANIFEST.MF

Manifest-Version: 1.0
Implementation-Title: Gradle Jar
Implementation-Version: 1.0-SNAPSHOT
Class-Path: . ReportUtilities.jar c3p0-0.9.5.2.jar commons-beanutils-1
 .9.3.jar commons-digester-2.1.jar commons-logging-1.2.jar commons-val
 idator-1.6.jar controlsfx-8.40.13.jar jfoenix-1.7.0.jar mchange-commo
 ns-java-0.2.11.jar TrayNotification--SNAPSHOT.jar firebase-admin-5.3.
 0.jar annotations-15.0.jar slf4j-simple-1.7.25.jar postgresql-42.1.4.
 jar pgjdbc-ng-0.6.jar ecj-4.6.1.jar fontawesomefx-8.9.jar commons-col
 lections-3.2.2.jar itext-2.1.7.jar olap4j-1.2.0.jar jasperreports-6.4
 .1.jar google-api-client-1.22.0.jar google-api-client-gson-1.22.0.jar
  google-http-client-1.22.0.jar json-20160810.jar guava-20.0.jar googl
 e-cloud-storage-1.2.1.jar slf4j-api-1.7.25.jar netty-all-4.0.32.Final
 .jar bcmail-jdk14-138.jar bcprov-jdk14-138.jar xercesImpl-2.11.0.jar 
 jcommon-1.0.23.jar jfreechart-1.0.19.jar castor-xml-1.3.3.jar jackson
 -core-2.1.4.jar jackson-databind-2.1.4.jar jackson-annotations-2.1.4.
 jar lucene-core-4.5.1.jar lucene-analyzers-common-4.5.1.jar lucene-qu
 eryparser-4.5.1.jar core-3.2.1.jar icu4j-57.1.jar google-oauth-client
 -1.22.0.jar google-http-client-jackson2-1.22.0.jar google-http-client
 -gson-1.22.0.jar httpclient-4.0.1.jar google-cloud-core-1.2.1.jar goo
 gle-cloud-core-http-1.2.1.jar google-api-services-storage-v1-rev100-1
 .22.0.jar castor-core-1.3.3.jar commons-lang-2.6.jar javax.inject-1.j
 ar stax-1.2.0.jar stax-api-1.0-2.jar lucene-queries-4.5.1.jar lucene-
 sandbox-4.5.1.jar guava-jdk5-17.0.jar httpcore-4.0.1.jar commons-code
 c-1.3.jar joda-time-2.9.2.jar api-common-1.1.0.jar gax-1.4.1.jar prot
 obuf-java-util-3.3.0.jar proto-google-common-protos-0.1.12.jar proto-
 google-iam-v1-0.1.12.jar google-auth-library-credentials-0.7.0.jar go
 ogle-auth-library-oauth2-http-0.7.0.jar google-http-client-appengine-
 1.21.0.jar google-http-client-jackson-1.21.0.jar stax-api-1.0.1.jar j
 akarta-regexp-1.4.jar auto-value-1.2.jar threetenbp-1.3.3.jar protobu
 f-java-3.3.0.jar jackson-core-asl-1.9.11.jar bctsp-jdk14-1.38.jar bcp
 rov-jdk14-1.38.jar bcmail-jdk14-1.38.jar xml-apis-1.4.01.jar jsr305-3
 .0.0.jar gson-2.7.jar
Main-Class: activities.Main
Ahmed Mourad
  • 193
  • 1
  • 2
  • 18
  • I would recommend looking into https://github.com/johnrengelman/shadow – Novaterata Sep 13 '17 at 17:20
  • @Novaterata neither including the fatJar plugin nor using the shadowJar plugin worked, just in some cases the produced jar size went down from 58MB to 57MB and that's it! – Ahmed Mourad Sep 13 '17 at 17:59
  • I believe those plugins are meant to replace your fatJar task, you would need to configure them. I don't know how to specifically fix your problem, but it still looks like not everything is in the CLASSPATH. You can write some logging code to get the CLASSPATH while running under IntelliJ and while running as a jar and see what is missing. The classpath is very important for java, especially in a jar. – Novaterata Sep 13 '17 at 18:22
  • If you could clarify what you mean by "didn't work" as well. What happened when you tried to run the jar? What error message did you get. – Novaterata Sep 13 '17 at 18:30
  • @Novaterata one of my libraries is a local jar used for jasper report if that could make any problem, what i mean is that by double clicking it over and over again, nothing happens, no error, nothing, can't even find it in the task manager – Ahmed Mourad Sep 13 '17 at 18:39
  • Try launching from the command line to get error messages – Novaterata Sep 13 '17 at 20:21
  • Also, your Main is in the default package, putting anything in the default package is bad practice https://stackoverflow.com/questions/7849421/is-the-use-of-javas-default-package-a-bad-practice – Novaterata Sep 13 '17 at 20:30
  • @Novaterata Actually this's seems to cause the problem, calling java -jar Yasmeena-all-1.0-SNAPSHOT.jar in the cmd gives me this error: Error: Could not find or load main class Main – Ahmed Mourad Sep 13 '17 at 20:38
  • @Novaterata After moving the Main class to the package activities it still says could not find or load main class activities.Main – Ahmed Mourad Sep 13 '17 at 20:46
  • And you updated to `attributes 'Main-Class': 'activities.Main'`? What does the inside of your jar look like? I don't understand why you are doing that zipTree code, you might be zipping your packages. I mean like there are literal zip files inside your jar instead of directories – Novaterata Sep 13 '17 at 20:55
  • @Novaterata Updated the question with those details – Ahmed Mourad Sep 13 '17 at 21:14
  • So you still get class not found, after updating build so it points to the new main class? – jrtapsell Sep 13 '17 at 21:23
  • @jrtapsell Yes, lol – Ahmed Mourad Sep 13 '17 at 21:28
  • Can you look in the jar at the manifest, and check a class with the path of main exists in the jar too – jrtapsell Sep 13 '17 at 21:29
  • @jrtapsell It does, updated the question with all it contains – Ahmed Mourad Sep 13 '17 at 21:36
  • 1
    Can you include the tree of the jar entries please – jrtapsell Sep 14 '17 at 09:12
  • In case it's not clear what @jrtapsell is asking, the jar is like a zip file, please list the contents of the zip file. That's not the same as the manifest classpath. https://docs.oracle.com/javase/tutorial/deployment/jar/view.html `jar tf foo.jar` – Novaterata Sep 14 '17 at 13:52
  • @Novaterata Well, this's embarrassing but i'v found the problem, i was unaware that JavaFX apps need a special plugin for Gradle, Using the [FiberFox Plugin](https://github.com/FibreFoX/javafx-gradle-plugin) solved my issue, Thanks for your efforts and may you post answers so that i could upvote you if you like – Ahmed Mourad Sep 14 '17 at 15:49
  • @jrtapsell Well, this's embarrassing but i'v found the problem, i was unaware that JavaFX apps need a special plugin for Gradle, Using the [FiberFox Plugin](https://github.com/FibreFoX/javafx-gradle-plugin) solved my issue, Thanks for your efforts and may you post answers so that i could upvote you if you like – Ahmed Mourad Sep 14 '17 at 15:49
  • You can mark comments "helpful", I don't really care about the points, it had just looked like familiar to something I went through before, but turned out to be something else. I can sympathize with the frustration. Getting lombok, dagger2, and ANTLR4 working with gradle, eclipse, and IntelliJ nicely took forever to figure out – Novaterata Sep 14 '17 at 17:04
  • @Novaterata I can't see any option to make them helpful, probably due to the low points i have, Thank you for your interest and help, and i couldn't agree more with that, glad i'm not the only one with that impression LOL! – Ahmed Mourad Sep 14 '17 at 17:53

1 Answers1

0

As per the comments here is what was tried.

  • Making sure a main class is set
  • Making sure the main class has the same full class name as the one defined
  • Checking the manifest is valid
  • Checking the class exists
  • JavaFX may need a plugin

In the end the last one fixed the issue this was the plugin that fixed the issue.

This was the last comment in the chain:

@jrtapsell Well, this's embarrassing but i'v found the problem, i was unaware that JavaFX apps need a special plugin for Gradle, Using the FiberFox Plugin solved my issue, Thanks for your efforts and may you post answers so that i could upvote you if you like

jrtapsell
  • 6,719
  • 1
  • 26
  • 49