无法使用 Swagger-UI 的 jar 文件调用 API
Cannot call the API using Swagger-UI's jar file
我使用 http://swagger.io/ 生成了我的 类,我得到了包含 类 和模型的 zip 文件。
当我编译一个 jar 文件然后将它作为 jar 库添加到我的项目时,它给我这个错误:
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.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.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
这是 swagger 生成库的 build.gradle
文件:
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
}
有人可以帮忙吗?
如果您尝试从 Swagger-Editor 生成默认模板,您将获得 apache http 版本。
克隆 Swagger-Codegen project from github,按照说明使用 volley、okhttp-gson、retrofit 等制作客户端。
更新
要生成 Android Volley 客户端:
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>
生成Javaokhttp-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>
在这两种情况下,在生成项目后导航到项目文件夹,然后使用
mvn package
并且您将在 \target
上填充库 jar
我使用 http://swagger.io/ 生成了我的 类,我得到了包含 类 和模型的 zip 文件。
当我编译一个 jar 文件然后将它作为 jar 库添加到我的项目时,它给我这个错误:
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.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.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
这是 swagger 生成库的 build.gradle
文件:
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
}
有人可以帮忙吗?
如果您尝试从 Swagger-Editor 生成默认模板,您将获得 apache http 版本。
克隆 Swagger-Codegen project from github,按照说明使用 volley、okhttp-gson、retrofit 等制作客户端。
更新
要生成 Android Volley 客户端:
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>
生成Javaokhttp-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>
在这两种情况下,在生成项目后导航到项目文件夹,然后使用
mvn package
并且您将在 \target
上填充库 jar