迁移到 Android Studio 后,我收到“不明智或错误地使用核心类”错误

Posted

技术标签:

【中文标题】迁移到 Android Studio 后,我收到“不明智或错误地使用核心类”错误【英文标题】:After migrating to Android Studio, I get the "Ill-advised or mistaken usage of a core class" error 【发布时间】:2016-05-19 09:54:30 【问题描述】:

所以直到最近我还在用 Eclipse 开发一个带有服务器组件的 android 应用程序;依赖管理是用 Maven 完成的。我现在想尝试迁移到 Android Studio(最新版本的工作室和 SDK)。

在 Eclipse 中,我有 3 个项目:一个服务器项目(用于 Tomcat;Apache Jersey、Jackson 和 Hibernate),一个包含模型类的“通用”项目,以及用于应用程序的 Android 项目。 Android 项目引用了“通用”项目,这样我也可以在 Android 应用程序中使用该模型和 Jackson Annotations。这一切都很完美。

现在我将 Android 项目导入 Android Studio 并简化了依赖项。 “通用”项目变成了一个本地 Maven 模块,我将其包含在新 Android 项目的 build.gradle 中。这是 build.gradle:

...

repositories 
    mavenCentral()
    mavenLocal()


dependencies 
    compile 'com.android.support:support-v4:22.2.0'
    compile 'com.google.android.gms:play-services:8.3.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'at.schulupdate:schulupdate-common:0.0.1-SNAPSHOT'
    compile 'com.joanzapata.android:android-iconify:1.0.9'
    compile 'uk.co.chrisjenx:calligraphy:1.1.0'
    compile 'commons-io:commons-io:2.4'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.4.2'

“普通”项目的 POM 如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>at.schulupdate</groupId>
    <artifactId>schulupdate-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.6.Final</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-hibernate4</artifactId>
            <version>2.4.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-jstlel</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
    </dependencies>
</project>

并且gradle依赖显示:

compile - Classpath for compiling the main sources.
+--- project :viewpagerindicator
|    \--- com.android.support:support-v4:22.2.0
|         \--- com.android.support:support-annotations:22.2.0
+--- com.android.support:support-v4:22.2.0 (*)
+--- com.google.android.gms:play-services:8.3.0
|    +--- com.google.android.gms:play-services-ads:8.3.0
|    |    \--- com.google.android.gms:play-services-basement:8.3.0
|    |         \--- com.android.support:support-v4:22.2.0 (*)
|    +--- com.google.android.gms:play-services-analytics:8.3.0
|    |    \--- com.google.android.gms:play-services-basement:8.3.0 (*)
|    +--- com.google.android.gms:play-services-appindexing:8.3.0
|    |    \--- com.google.android.gms:play-services-basement:8.3.0 (*)
|    +--- com.google.android.gms:play-services-appinvite:8.3.0
|    |    \--- com.google.android.gms:play-services-base:8.3.0
|    |         \--- com.google.android.gms:play-services-basement:8.3.0 (*)
|    +--- com.google.android.gms:play-services-appstate:8.3.0
|    |    \--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-auth:8.3.0
|    |    \--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-basement:8.3.0 (*)
|    +--- com.google.android.gms:play-services-cast:8.3.0
|    |    +--- com.google.android.gms:play-services-base:8.3.0 (*)
|    |    \--- com.android.support:mediarouter-v7:22.2.0
|    |         \--- com.android.support:appcompat-v7:22.2.0
|    |              \--- com.android.support:support-v4:22.2.0 (*)
|    +--- com.google.android.gms:play-services-drive:8.3.0
|    |    \--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-fitness:8.3.0
|    |    +--- com.google.android.gms:play-services-base:8.3.0 (*)
|    |    \--- com.google.android.gms:play-services-location:8.3.0
|    |         +--- com.google.android.gms:play-services-base:8.3.0 (*)
|    |         \--- com.google.android.gms:play-services-maps:8.3.0
|    |              \--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-games:8.3.0
|    |    +--- com.google.android.gms:play-services-base:8.3.0 (*)
|    |    \--- com.google.android.gms:play-services-drive:8.3.0 (*)
|    +--- com.google.android.gms:play-services-gcm:8.3.0
|    |    +--- com.google.android.gms:play-services-base:8.3.0 (*)
|    |    \--- com.google.android.gms:play-services-measurement:8.3.0
|    |         \--- com.google.android.gms:play-services-basement:8.3.0 (*)
|    +--- com.google.android.gms:play-services-identity:8.3.0
|    |    \--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-location:8.3.0 (*)
|    +--- com.google.android.gms:play-services-maps:8.3.0 (*)
|    +--- com.google.android.gms:play-services-measurement:8.3.0 (*)
|    +--- com.google.android.gms:play-services-nearby:8.3.0
|    |    \--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-panorama:8.3.0
|    |    \--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-plus:8.3.0
|    |    \--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-safetynet:8.3.0
|    |    \--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-vision:8.3.0
|    |    \--- com.google.android.gms:play-services-base:8.3.0 (*)
|    +--- com.google.android.gms:play-services-wallet:8.3.0
|    |    +--- com.google.android.gms:play-services-base:8.3.0 (*)
|    |    +--- com.google.android.gms:play-services-identity:8.3.0 (*)
|    |    \--- com.google.android.gms:play-services-maps:8.3.0 (*)
|    \--- com.google.android.gms:play-services-wearable:8.3.0
|         \--- com.google.android.gms:play-services-base:8.3.0 (*)
+--- com.android.support:appcompat-v7:22.2.0 (*)
+--- at.schulupdate:schulupdate-common:0.0.1-SNAPSHOT
|    +--- org.hibernate:hibernate-entitymanager:4.3.6.Final
|    |    +--- org.jboss.logging:jboss-logging:3.1.3.GA
|    |    +--- org.jboss.logging:jboss-logging-annotations:1.2.0.Beta1
|    |    +--- org.hibernate:hibernate-core:4.3.6.Final
|    |    |    +--- org.jboss.logging:jboss-logging:3.1.3.GA
|    |    |    +--- org.jboss.logging:jboss-logging-annotations:1.2.0.Beta1
|    |    |    +--- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final
|    |    |    +--- dom4j:dom4j:1.6.1
|    |    |    |    \--- xml-apis:xml-apis:1.0.b2
|    |    |    +--- org.hibernate.common:hibernate-commons-annotations:4.0.5.Final
|    |    |    |    +--- org.jboss.logging:jboss-logging:3.1.3.GA
|    |    |    |    \--- org.jboss.logging:jboss-logging-annotations:1.2.0.Beta1
|    |    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    |    +--- org.javassist:javassist:3.18.1-GA
|    |    |    +--- antlr:antlr:2.7.7
|    |    |    \--- org.jboss:jandex:1.1.0.Final
|    |    +--- dom4j:dom4j:1.6.1 (*)
|    |    +--- org.hibernate.common:hibernate-commons-annotations:4.0.5.Final (*)
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final
|    |    \--- org.javassist:javassist:3.18.1-GA
|    +--- com.fasterxml.jackson.datatype:jackson-datatype-hibernate4:2.4.2
|    |    +--- com.fasterxml.jackson.core:jackson-databind:2.4.2
|    |    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.4.0 -> 2.4.2
|    |    |    \--- com.fasterxml.jackson.core:jackson-core:2.4.2
|    |    \--- com.fasterxml.jackson.core:jackson-core:2.4.2
|    +--- com.fasterxml.jackson.core:jackson-annotations:2.4.2
|    +--- org.apache.taglibs:taglibs-standard-jstlel:1.2.1
|    |    +--- org.apache.taglibs:taglibs-standard-spec:1.2.1
|    |    \--- org.apache.taglibs:taglibs-standard-impl:1.2.1
|    +--- org.apache.commons:commons-lang3:3.3.2
|    \--- javax.validation:validation-api:1.1.0.Final
+--- com.joanzapata.android:android-iconify:1.0.9
+--- uk.co.chrisjenx:calligraphy:1.1.0
+--- commons-io:commons-io:2.4
\--- com.fasterxml.jackson.core:jackson-databind:2.4.2 (*)

Android Studio 中的 gradle 构建成功!但是当我想将它部署到设备时,我收到以下错误:

:schulupdate:transformClassesWithDexForDebug 故障处理 “javax/transaction/Status.class”:

在以下情况下对核心类(java.* 或 javax.*)的不明智或错误使用 不构建核心库。

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

但是,您实际上可能正在尝试在核心中定义一个类 命名空间,您可能已经获取了它的来源,例如,从 非安卓虚拟机项目。这肯定不会 工作。至少,它会危害您的应用程序与 平台的未来版本。它也经常是有问题的 合法性。

如果你真的打算建立一个核心库——这只是 适合作为创建完整虚拟机分发的一部分, 而不是编译应用程序 - 然后使用 “--core-library”选项来禁止显示此错误消息。

如果您继续使用“--core-library”,但实际上是在构建一个 应用程序,然后预先警告您的应用程序仍然会失败 在某个时候构建或运行。请为愤怒的顾客做好准备 例如,他们发现您的应用程序停止运行一次 他们升级他们的操作系统。你将为此负责 问题。

如果您合法地使用某些恰好位于核心中的代码 包装,那么您拥有的最简单安全的替代方法是重新包装 那个代码。也就是说,将有问题的类移动到您自己的包中 命名空间。这意味着它们永远不会与核心冲突 系统类。 JarJar 是一个可以帮助您完成这项工作的工具。 如果你发现你不能做到这一点,那么这表明你 你所走的道路最终会导致痛苦、苦难、悲伤, 和悲叹。

1 个错误;中止

现在我知道我的“通用”项目包括传递依赖项,如 org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final 定义 javax.transaction 命名空间中的类。但我真的不明白如何解决这个问题。我仍然需要设备上那个包中的代码,对吧?而且它根本不是核心包,所以它肯定不包含在 Android 设备中。我应该将我的“通用”项目定义为核心库吗?

【问题讨论】:

【参考方案1】:

最终我自己找到了解决方案。由于 Hibernate 在 Android 上不可用,我需要排除该依赖项:

dependencies 
    compile 'com.android.support:support-v4:22.2.0'
    compile 'com.google.android.gms:play-services:8.3.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile('at.schulupdate:schulupdate-common:0.0.1-SNAPSHOT') 
        exclude group: 'org.hibernate'
    
    compile 'com.joanzapata.android:android-iconify:1.0.9'
    compile 'uk.co.chrisjenx:calligraphy:1.1.0'
    compile 'commons-io:commons-io:2.4'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.4.2'

【讨论】:

以上是关于迁移到 Android Studio 后,我收到“不明智或错误地使用核心类”错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Android Studio 中迁移到 AndroidX 后出现 YoutubeAndroidPlayerAPI 错误

Eclipse 工程迁移到 Android Studio

Eclipse 工程迁移到 Android Studio

Eclipse 工程迁移到 Android Studio

Eclipse 工程迁移到 Android Studio

迁移到 Android Studio