2

I generated my classes using http://swagger.io/ and I got zip files which contains classes and models.

When I compile a jar file and then add it to my project as a jar lib it gives me this error:

05-09 17:22:37.894 4589-4589/? E/ReportHandler: FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/Consts;
 at io.swagger.client.ApiInvoker.<clinit>(ApiInvoker.java:66)
 at io.swagger.client.api.UserAuthenticationApi.<init>(UserAuthenticationApi.java:22)
 at com.selfdrvn.Selfdrvn.activities.LoginActivity$1.onClick(LoginActivity.java:99)
 at android.view.View.performClick(View.java:4780)
 at android.view.View$PerformClick.run(View.java:19866)
 at android.os.Handler.handleCallback(Handler.java:739)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:135)
 at android.app.ActivityThread.main(ActivityThread.java:5254)
 at java.lang.reflect.Method.invoke(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:372)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.Consts" on path: DexPathL,nativeLibraryDirectories=[/vendor/lib, /system/lib]]
 at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
 at io.swagger.client.ApiInvoker.<clinit>(ApiInvoker.java:66) 
 at io.swagger.client.api.UserAuthenticationApi.<init>(UserAuthenticationApi.java:22) 
 at com.selfdrvn.Selfdrvn.activities.LoginActivity$1.onClick(LoginActivity.java:99) 
 at android.view.View.performClick(View.java:4780) 
 at android.view.View$PerformClick.run(View.java:19866) 
 at android.os.Handler.handleCallback(Handler.java:739) 
 at android.os.Handler.dispatchMessage(Handler.java:95) 
 at android.os.Looper.loop(Looper.java:135) 
 at android.app.ActivityThread.main(ActivityThread.java:5254) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at java.lang.reflect.Method.invoke(Method.java:372) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
 Suppressed: java.lang.ClassNotFoundException: org.apache.http.Consts
 at java.lang.Class.classForName(Native Method)
 at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
 at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
         ... 14 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

This is the build.gradle file for the swagger generated library:

    group = 'io.swagger'
project.version = '1.0.0'

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.+'

        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'

    }
}

allprojects {
    repositories {
        jcenter()
    }
}


apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'

android {
    compileSdkVersion 22
    buildToolsVersion '23.0.2'
//    useLibrary  'org.apache.http.legacy'
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 23
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    // Rename the aar correctly
    libraryVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.aar')) {
                def fileName = "${project.name}-${variant.baseName}-${version}.aar"
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }
}


ext {
    swagger_annotations_version = "1.5.0"
    gson_version = "2.3.1"
    httpclient_version = "4.5.2"
    httpcore_version = "4.4.4"
    junit_version = "4.12"
}

dependencies {
    compile "io.swagger:swagger-annotations:$swagger_annotations_version"
    compile "com.google.code.gson:gson:$gson_version"
    compile "org.apache.httpcomponents:httpcore:$httpcore_version"
    compile "org.apache.httpcomponents:httpclient:$httpclient_version"
    compile ("org.apache.httpcomponents:httpcore:$httpcore_version") {
        exclude(group: 'org.apache.httpcomponents', module: 'httpclient')
    }
    compile ("org.apache.httpcomponents:httpmime:$httpclient_version") {
        exclude(group: 'org.apache.httpcomponents', module: 'httpclient')
    }
    testCompile "junit:junit:$junit_version"
}

afterEvaluate {
    android.libraryVariants.all { variant ->
        def task = project.tasks.create "jar${variant.name.capitalize()}", Jar
        task.description = "Create jar artifact for ${variant.name}"
        task.dependsOn variant.javaCompile
        task.from variant.javaCompile.destinationDir
        task.destinationDir = project.file("${project.buildDir}/outputs/jar")
        task.archiveName = "${project.name}-${variant.baseName}-${version}.jar"
        artifacts.add('archives', task);
    }
}

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

artifacts {
    archives sourcesJar
}

Can anybody help?

Sampada
  • 2,931
  • 7
  • 27
  • 39
  • apache http & android have a [long](http://stackoverflow.com/questions/3577035/apache-httpclient-4-1-on-android) & [complicated](http://stackoverflow.com/questions/31653002/how-to-use-the-legacy-apache-http-client-on-android-marshmallow) history.. Maybe you can generate your classes with a different http library as base? – zapl May 09 '16 at 09:53

1 Answers1

3

if you try to generate the default template from Swagger-Editor you get the apache http version.

Clone Swagger-Codegen project from github, follow the instructions and make the client using volley, okhttp-gson, retrofit, etc..

UPDATE

To generate Android Volley Client:

java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate -i <your_path_to_swagger.json> -l android --library=volley -o <output_path>

To generate Java okhttp-gson:

java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate -i <your_path_to_swagger.json> -l java --library=okhttp-gson -o <output_path>

In both case after you have generated the project navigate to the project folder and then use

mvn package

And you will fild the library jar on \target

LightySnake
  • 78
  • 2
  • 11
  • Can you help me on how to do it I am new to this I ran "java -jar C:\swagger-codegen-cli-2.1.6.jar generate -i -l android -o samples/client/sd/android" and it passed me the apache http version but I don't know how to generate the Volley version. Thanks :) – Ali Shah lakhani Jun 04 '16 at 09:22
  • I've updated the answer, if you check you will find other info on swagger-codegen github page. – LightySnake Jun 06 '16 at 07:10