Search code examples
jarbuildgradleintellij-13uberjar

How To Specify main class when using fatjar plugin in gradle.build


I am interested in building a single jar containing all the module dependencies and external jars in a single executable jar file which I will be able to run with java -jar myApp.jar.

I have module A which is dependent on module B. Currently I'm using gradle, and my build.gradlescript looks like this:

    apply plugin: 'fatjar'
    description = "A_Project"
    dependencies {
      compile project(':B_Project')
      compile "com.someExternalDependency::3.0"
    }

When I build it through gradle command: clean build fatjar a fat jar 'A.jar' is created as expected. But running it with as I written above results in: no main manifest attribute, in A.jar How can I modify my build.gradle file and specify the main class, or the manifest?


Solution

  • I have figured it out myself: I've used uberjar Gradle task. now my build.gradle file looks like this:

    apply plugin: 'java'
    apply plugin: 'application'
    
    mainClassName  = 'com.organization.project.package.mainClassName'
    
    version = '1.0'
    
    task uberjar(type: Jar) {
        from files(sourceSets.main.output.classesDir)
        from {configurations.compile.collect {zipTree(it)}} {
            exclude "META-INF/*.SF"
            exclude "META-INF/*.DSA"
            exclude "META-INF/*.RSA"
    }
    
    manifest {
        attributes 'Main-Class': 'com.organization.project.package.mainClassName'
        }
    }
    
    
    dependencies {
    compile project(':B_Project')
    compile "com.someExternalDependency::3.0"
    }
    

    and now I i use it with the command:

    clean build uberjar

    and it builds one nice runnable jar :)