首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AAR文件java.lang.NoClassDefFoundError中找不到Activity

AAR文件java.lang.NoClassDefFoundError中找不到Activity
EN

Stack Overflow用户
提问于 2017-09-12 08:11:29
回答 7查看 7.8K关注 0票数 18

我已经创建了一个android库,它包含一个用于打开相机意图的Activity,该库为调用活动的部分在屏幕上显示的部分提供了完美的例外,并且应用程序崩溃抛出了以下错误

代码语言:javascript
复制
Suppressed: java.lang.ClassNotFoundException: com.me.scanner.ScannerViewActivity
            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 trace available

下面是将使用此库的其他项目的build.gradle文件

代码语言:javascript
复制
repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.me.app:gpio_lib@aar'
    compile ('com.me.app:scanner@aar'){ transitive = true; }
    testCompile 'junit:junit:4.12'
}

请注意:

  • 这个库作为模块项目工作得很好, 编译项目(“:扫描仪控制”) 但在项目中使用它作为aar时却不是
  • 我试过了,不管有没有{ transitive = true; },都没有改变
  • 我已经将我的aar文件重命名为scanner.aar
  • 我已经从/[library-project]/build/outputs/aar/scanner-release.aar中提取了aar文件

Update1 - 2017-09-14

活动ScannerViewActivity是我的库的一部分,它是如何从一个库类中调用的

代码语言:javascript
复制
Intent scannerView = new Intent();
scannerView.putExtra(MESSAGE_RECEIVER, new MessageReceiver());
scannerView.setClass(context, ScannerViewActivity.class);
scannerView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(scannerView);

这个contextandroid.app.Application的实例,而不是任何Activity的实例。

Update2 - 2017-09-14

幸运的是,在谷歌上漫游了两天之后,我发现了问题类在aar中找不到的答案。我已经将库的依赖项添加到项目中,并能够使用aar运行它,但这不是我的问题的解决方案,

下面是我目前面临的流程和问题

  • 我正在开发一个与特定条形码扫描仪硬件通信的库的沙箱版本,因为开发人员不一定会使用沙箱版本的库,从而允许开发人员使用他们的设备摄像机作为条形码扫描器,
  • 我们希望开发人员从提供的AAR文件中提取scanner.aarscanner-sandbox.aar文件,并使用它们中的任何一个。
  • 如果开发人员想要运行库的沙箱版本,我们不希望开发人员向他们的.gradle文件添加额外的依赖项,
  • 下面是用于将设备摄像机模拟为条形码扫描仪的依赖项 编译“me.dm7”

更新的问题是

在开发人员同步文件时,分发aar文件而不将其发布到任何存储库(如)和库的所有依赖项的方法是什么?

EN

回答 7

Stack Overflow用户

发布于 2017-09-19 13:06:40

泽山

我也面临着同样的问题,我做了很多研究&我希望它能帮助你。

为项目创建.aar文件:

  1. 对于库模块,.aar文件由Android自动创建。对于具有任意资源文件或库的项目,可以像下面的步骤中提到的那样生成.aar文件。
  2. 检查插件。它应该在下面,更改为库,如果它是在应用程序,应用插件:'com.android.library‘
  3. 打开打开的右边框格栏,转到“您的项目”->Task->build,然后双击assembleRelease。在构建该项目时,您将在app/build/ .aar /aar/目录中找到两个文件(app-调试器和app-Relase.aar)。在项目中使用.aar文件:
  4. 获取“app-Relase.aar”文件并将其粘贴到项目的libs文件夹中。如果不存在libs文件夹,则在app目录中创建一个名为“libs”的目录。
  5. 将以下内容添加到应用程序gradle文件中,存储库{ flatDir { dirs 'libs‘}}依赖{编译(名称:’app -release‘,ext:'aar') }
  6. 同步时,项目已准备好使用库文件。注意:必须在项目应用程序gradle示例中手动添加.aar gradle依赖项:

假设errors:

System.err: java.lang.NoClassDefFoundError:

解决方案:

必须在项目应用程序gradle中手动添加.aar梯度依赖项。

票数 5
EN

Stack Overflow用户

发布于 2017-09-20 10:34:19

您的"Update2 - 2017-09-14“的答案-可以简单地构建一个fat aar文件。它将包含所有的依赖项,您可能必须处理的一件事是,依赖关系中的冲突有时可能会造成问题。此外,脂肪aar的大小可能是巨大的。所以试一试。

票数 5
EN

Stack Overflow用户

发布于 2017-09-20 19:17:20

有三种分发库的方法:

  1. 创建本地maven库,然后分发生成的aar。 您可以使用Gradle Android Maven插件创建本地aar。如何制作:a.将插件类路径添加到root build.gradle: buildscript { mavenCentral() mavenCentral()}依赖关系{ classpath 'com.android.tools.build:gradle:2.2.3‘classpath mavenCentral}allproject{ jcenter() }} 设置maven插件,并将组名和版本号添加到库build.gradle中: 应用插件:'com.android.library‘应用插件:'com.github.dcendents.android-maven’组= 'com.your.packagename‘版本= '1.0.0’ext.versionCode =1000Android{ compileSdkVersion 25 buildToolsVersion "25.0.3“defaultConfig { minSdkVersion 9 targetSdkVersion 25 versionCode versionCode versionName version } buildTypes {.}依赖项{.}} 设置artifactId设置为settings.gradle:rootProject.name = 'yourlibraryname‘ 构建库并将其安装到本地maven。 您可以在项目文件夹上运行./gradlew安装或使用 Gradle -> YourLibrary ->其他->安装从Android (在Android的右侧) e.直接对项目使用已安装的库。 可以通过将mavenLocal()添加到 build.gradle来使用库。 所有项目{存储库{ jcenter() mavenLocal() //用于本地maven。}} 然后将依赖项添加到项目中: 编译‘com.your.Packagename:modulename:1.0’ 也可以从本地maven路径复制生成的.aar。在Linux中,您可以从/your/userpath/.m2/repository/~/.m2/repository/获得它。
  2. 在数字1中使用相同的技术,但是为每个开发人员计算机创建指向~/.m2/repository/中心的本地maven路径。
  3. 使用私有maven存储库。您可以使用JFrog艺术开放源码软件Nexus仓库开放源码软件
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46171191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档