3

I want to generate a single Jar with multiple modules and dependencies. I installed FatJar Plugin but I got the below error:

enter image description here

My Code:

enter image description here

Trying shadowJar

Error:(61, 0) Could not find method shadowJar() for arguments [build_eqgfg4x39smehqcteaccdy4k6$_run_closure4@780b32c6] on project ':SDKFramework' of type org.gradle.api.Project. Open File

My build.gradle (module)

apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'com.android.library'
apply plugin: 'groovyx.grooid.groovy-android'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
        versionCode 1
        versionName "0.1.1"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        abortOnError false
    }
}

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'org.codehaus.groovy:gradle-groovy-android-plugin:0.3.10'
        classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3'
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile project(':framework2')
    compile 'com.google.code.gson:gson:2.6.1'
    compile 'junit:junit:4.12'
}

shadowJar {

}
Matthias Braun
  • 32,039
  • 22
  • 142
  • 171
Patrick
  • 1,629
  • 5
  • 23
  • 44

3 Answers3

2

Very simple solution is to use the shadow plugin.
Using the plugin is very straightforward:

  1. Declare the plugin as the first statement in your build.grade:

plugins {
id "com.github.johnrengelman.shadow" version "1.2.3"
}

  1. Apply either java or groovy plugin.

apply plugin: 'java'

or

apply plugin: 'groovy'

  1. Refresh the project and run the newly 'shadowJar' task.

This plugin also enable you to exclude dependencies, redirect (rename) packages' names and much more.

yonisha
  • 2,956
  • 2
  • 25
  • 32
0

You should add the following line to your build.gradle:

apply plugin: 'java'

Because, gradle don't have "Jar" task by default. You can read about that, here https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html

If you using android, then add here:

apply plugin: 'android'

or

apply plugin: 'com.android.library'
MartyIX
  • 27,828
  • 29
  • 136
  • 207
Ivan
  • 992
  • 1
  • 10
  • 22
  • I tried. The 'java' plugin has been applied, but is not compatible with de android plugins – Patrick Jun 14 '16 at 10:08
  • just add clear android plugin: apply plugin: 'com.android.library' – Ivan Jun 14 '16 at 10:24
  • apply plugin: 'android' is deprecated and you cannot combine apply plugin: 'com.android.library' with apply plugin: 'java' – Patrick Jun 14 '16 at 10:39
  • Of cause, use just apply plugin: 'com.android.library'. Okay, look at http://stackoverflow.com/questions/19307341/android-library-gradle-release-jar – Ivan Jun 14 '16 at 12:01
0

Well, I found solution:

task createJar(type: Jar) {
    from {
        List<File> allFiles = new ArrayList<>();
        configurations.compile.collect {
            for (File f : zipTree(it).getFiles()) {
                if (f.getName().equals("classes.jar")) {
                    allFiles.addAll(zipTree(f).getAt("asFileTrees").get(0).getDir())
                }
            }
        }
        allFiles.add(new File('build/intermediates/classes/release'))
        allFiles // To return the result inside a lambda
    }
    archiveName('MySDK.jar')
}

This code generate a single jar with all classes.

Patrick
  • 1,629
  • 5
  • 23
  • 44