简体   繁体   中英

Java - Gradle jar created by FatJar task won't work

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM