Android Studio - 导入 Simple-Xml 库

20

我对我的Android Studio IDE感到非常烦躁。

我想要添加来自中央仓库(版本为v2.7.1)的Maven库simple-xml。

  1. 项目编译良好。

  2. Gradle在其build.gradle文件中有该库依赖:

  3. dependencies {
      compile 'com.android.support:appcompat-v7:18.0.0'
      compile 'org.simpleframework:simple-xml:2.7.1'
    }
    
  4. 在Android Studio的模块设置中勾选了simple-xml库的导出:

这里是屏幕截图:https://s6.postimg.cc/xxgj56zkx/Module_Settings.png

但运行我的应用程序时,我收到了“Class not found”的错误提示...

java.lang.NoClassDefFoundError: org.simpleframework.xml.core.Persister

我感到困惑了,听起来像是Gradle由于某些原因没有将库和依赖项打包到apk中...

Edit1:我的Android Studio版本是0.2.13(最新版),Gradle是0.5.+。

Edit2:我使用的完整build.gradle文件如下:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 18
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:18.0.0'
    compile 'org.simpleframework:simple-xml:2.7.1'
}

请返回仅翻译的文本:请参阅Edit 2以获取完整的build.gradle文件。 - existenz31
3个回答

56

您应该这样添加simple-xml库:

compile('org.simpleframework:simple-xml:2.7.1') {
    exclude group: 'stax', module: 'stax-api'
    exclude group: 'xpp3', module: 'xpp3'
}

stax-apixpp3与Android类冲突。这些JAR文件中的类似乎已经包含在Android中。

原始dex消息如下:

处理"javax/xml/stream/events/StartElement.class"时出错:

当不构建核心库时,使用核心类(java.*或javax.*)的不恰当或错误用法。

这通常是由于在使用IDE(如Eclipse)时无意中将核心库文件包含到应用程序项目中。如果您确定没有故意定义核心类,那么这可能是正在发生的事情的最可能解释。

但是,您实际上可能正在尝试在核心命名空间中定义一个类,其源代码可能来自非Android虚拟机项目,例如。这肯定不起作用。至少会危及您的应用程序与平台未来版本的兼容性。这也经常存在法律问题。

如果您真的打算构建核心库-这仅适用于创建完整虚拟机分布而不是编译应用程序,则使用“—core-library”选项来抑制此错误消息。

如果您继续使用“—core-library”,但实际上正在构建应用程序,则应事先警告您的应用程序最终仍将在某个时候无法构建或运行。请为发现例如升级操作系统后您的应用程序停止工作的愤怒客户做好准备。您将对此问题负责。

如果您确实正在合法地使用某些代码,这些代码恰好在核心包中,则您拥有的最简单安全替代方案是重新打包该代码。也就是说,将相关类移动到自己的包命名空间中。这意味着它们永远不会与核心系统类冲突。JarJar是可能帮助您完成此项任务的工具。如果您发现无法执行此操作,则说明您所在的路径最终将导致痛苦、悲伤、悲哀和哀叹。


你对于依赖项排除是正确的。我需要在我的build.gradle中排除这些库。这个解决方法只在我使用simple-xml库下载到项目本地目录lib时有效...可惜了。 - existenz31
刚开始更新到 Gradle 0.12.2 时出现了这个问题。这个建议非常有效。 - Vic Alcazar
太棒了 :) 我一直在处理“javax/xml/XMLConstants.class”和xpp3冲突的错误。花了很长时间才找到这个答案,但现在一切都运行得很好。谢谢 :) - Matthew Cawley
1
四年过去了,这个评论仍然在拯救我们的生命。谢谢! - klambiguit
由于某些原因,我尝试将此添加到我的gradle.build文件中,但它并没有改变。也许在较新的Android API版本中包含了来自simple-xml jar的更多模块。或者是gradle lint更加敏感了?当我运行gradle:build时仍然卡在错误中,有人也遇到这个问题吗? - Alex
1
即使过了8年,这个答案仍然有用,但是冲突仍然存在。 - Idris Bohra

5

使用maven和Android时,出现了相同的错误。我更正了依赖关系,一切都运行良好。这是我的simple-xml库依赖项:

<dependency>
<groupId>org.simpleframework</groupId>
<artifactId>simple-xml</artifactId>
<version>2.7.1</version>
<scope>compile</scope>
<exclusions>
    <exclusion>
        <artifactId>xpp3</artifactId>
        <groupId>xpp3</groupId>
    </exclusion>
    <exclusion>
        <artifactId>stax-api</artifactId>
        <groupId>stax</groupId>
    </exclusion>
    <exclusion>
        <artifactId>stax</artifactId>
        <groupId>stax</groupId>
    </exclusion>
    <exclusion>
        <artifactId>spring-web</artifactId>
        <groupId>org.springframework</groupId>
    </exclusion>
    <exclusion>
        <artifactId>commons-logging</artifactId>
        <groupId>commons-logging</groupId>
    </exclusion>
</exclusions>
</dependency>

1
你救了我的一天!太棒了! - tomurka
帮了我很多!谢谢! - Yuliia Ashomok

1

我找到了问题所在。

正如我预期的那样,问题出在gradle插件0.5.+上。

Android Studio 0.3.0与gradle插件0.6.+(Gradle 1.8)现在已经解决了这个问题。

然而,我让应用程序以Android Studio 0.2.13和gradle插件0.5的方式工作:

由于gradle插件拒绝从maven中央库部署库,我将库和依赖项下载到项目的lib目录中。 我设置项目使用位于项目lib目录中的库作为本地库。

解决方法指南:

  1. 在模块设置中删除我的项目中对simple-xml(maven central)的所有引用

  2. 将simple-xml-2.7.1.jar、stax-1.2.0.jar、stax-api-1.0.1.jar和xpp3-1.1.3.3.jar复制到我的项目的lib目录中

  3. 选择我的项目中的lib simple-xml-2.7.1.jar,使用“添加为库”上下文菜单导入该库

  4. 像这样更改build.gradle:

    依赖 {

    compile 'com.android.support:appcompat-v7:18.0.0'
    
    compile files('simple-xml-2.7.1.jar')
    

    }

注意:不要包含依赖项,否则它们将与Android系统发生冲突,如Grzegorz所述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接