Java 在Android Studio中添加外部库时出现问题

Java 在Android Studio中添加外部库时出现问题,java,android,maven,android-studio,Java,Android,Maven,Android Studio,我正在使用javax.mail从我的活动中发送邮件。为了开发这个应用程序,我正在使用Android Studio 要使用此方法,需要3.jar文件(mail.jar、activation.jar和additionnal.jar)。我读到的所有信息都是将这3个文件放在libs文件夹中,添加为library,并将它们命名为gradle.build 当我意识到“添加到库”选项没有显示给我时,我的第一个问题出现了。因此,我尝试在模块设置中手动添加依赖项,并在gradle.build中添加它们,等等。。。

我正在使用javax.mail从我的活动中发送邮件。为了开发这个应用程序,我正在使用Android Studio

要使用此方法,需要3.jar文件(mail.jar、activation.jar和additionnal.jar)。我读到的所有信息都是将这3个文件放在libs文件夹中,添加为library,并将它们命名为gradle.build

当我意识到“添加到库”选项没有显示给我时,我的第一个问题出现了。因此,我尝试在模块设置中手动添加依赖项,并在gradle.build中添加它们,等等。。。但是这些方法中没有一种对我有效,我无法选择导入

但最终我找到了一种乍看起来似乎有效的方法。进入模块设置/应用程序/依赖项,我选择+按钮并选择“库依赖项”。然后我使用Maven Central Search找到了以下2个:

  • mail:mail:1.5.0-b01
  • 激活:激活:1.1.1
然后我转到顶级gradle.build并添加:

allprojects {
    repositories {
        mavenCentral()
    }
}
在此之后,在应用程序internal gradle.build中:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'javax.mail:mail:1.5.0-b01'
    compile 'javax.activation:activation:1.1.1'
}
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        mavenCentral()
    }
}
apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.irvvin.trackme"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets { main { res.srcDirs = ['src/main/res', 'src/main/res/values-v14'] } }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'javax.mail:mail:1.5.0-b01'
    compile files('libs/activation.jar')

   //Now I take "mail" from maveen and "activation" from library, but I have tried diferent
   // combiations, such as selecting all from library (the imports where not showing) and 
   // all from maveen (works but shows this error).
   //With the actual combination, also throws this same error. 
}
但即使这样,我也无法让它发挥作用。它开始运行并似乎运行良好,但当发送电子邮件时,应用程序崩溃并显示以下内容:

java.lang.NoClassDefFoundError: javax.activation.DataHandler
        at com.myapp.mail.MailSender.sendMail(MailSender.java:64)
        at com.myapp.TrackingService.sendEmail(TrackingService.java:341)
        at com.myapp.TrackingService.doLocationUpdate(TrackingService.java:281)
        at com.myapp.TrackingService.onStartCommand(TrackingService.java:82)
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2726)
        at android.app.ActivityThread.access$2100(ActivityThread.java:144)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1302)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5146)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
        at dalvik.system.NativeStart.main(Native Method)
更新-添加了gradle.build文件:

顶级gradle.build:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'javax.mail:mail:1.5.0-b01'
    compile 'javax.activation:activation:1.1.1'
}
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        mavenCentral()
    }
}
apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.irvvin.trackme"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets { main { res.srcDirs = ['src/main/res', 'src/main/res/values-v14'] } }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'javax.mail:mail:1.5.0-b01'
    compile files('libs/activation.jar')

   //Now I take "mail" from maveen and "activation" from library, but I have tried diferent
   // combiations, such as selecting all from library (the imports where not showing) and 
   // all from maveen (works but shows this error).
   //With the actual combination, also throws this same error. 
}
应用程序内部gradle.build:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'javax.mail:mail:1.5.0-b01'
    compile 'javax.activation:activation:1.1.1'
}
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        mavenCentral()
    }
}
apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.irvvin.trackme"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets { main { res.srcDirs = ['src/main/res', 'src/main/res/values-v14'] } }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'javax.mail:mail:1.5.0-b01'
    compile files('libs/activation.jar')

   //Now I take "mail" from maveen and "activation" from library, but I have tried diferent
   // combiations, such as selecting all from library (the imports where not showing) and 
   // all from maveen (works but shows this error).
   //With the actual combination, also throws this same error. 
}

因为你有Jar文件。因此,将这些jar文件放在libs文件夹中,并在build.gradle(模块)中添加以下内容


大多数情况下,如果您将清理和重建,则上述问题将得到解决

但对“.jar”或maven依赖关系的依赖性很小。这些与当前编译器不兼容。如果您的“.jar”与Java1.6兼容,并且您正在使用Java1.7重新编译,则会出现上述问题

请在Android Studio上查看上述异常顶部的确切消息

这是我的问题:

:app:preDexRelease警告:忽略匿名内部类(com.amazonaws.org.apache.commons.logging.LogFactory$1)的InnerClasses属性,该匿名内部类没有关联的EnclosingMethod属性。该类可能是由不以现代.class文件格式为目标的编译器生成的。建议的解决方案是使用最新的编译器从源代码重新编译类,而不指定任何“-target”类型选项。忽略此警告的结果是,此类上的反射操作将错误地指示它不是内部类。
我通过上述方法解决了问题。

如果我这样做,Gradle控制台将使项目的构建失败,并告知:
失败:构建失败,出现异常。*错误:任务“:app:dexDebug”的执行失败。com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException:process'command'C:\Program Files\Java\jdk1.7.0_21\bin\Java.exe''以非零退出值2结束。
非零退出值2表示调用同一个库两次。你能分享你的完整版本gradle文件吗?用gradle.build文件更新你可以将顶级版本gradle依赖项版本更改为1.1.3
classpath'com.android.tools.build:gradle:1.1.3'
这是1.1.0中的一个bug,但仍然不确定它是否能工作。试试看,非常感谢。它帮助了我。