如何在IntelliJ IDEA中添加一个库(android-support-v7-appcompat)

72

我创建了一个项目,将资源文件复制到项目库中,并加入到项目结构中,指定了样式Theme.AppCompat。编译没有错误,但是在启动时会出现异常。

08-03 00:50:00.406: ERROR/AndroidRuntime(4055): FATAL EXCEPTION: main
        java.lang.NoClassDefFoundError: android.support.v7.appcompat.R$styleable
        at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:98)
        at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:58)
        at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98)
        at com.example.SampleMetrRost.CentralActivity.onCreate(CentralActivity.java:12)
        at android.app.Activity.performCreate(Activity.java:4636)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1051)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1924)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1985)
        at android.app.ActivityThread.access$600(ActivityThread.java:127)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1151)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4476)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:816)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:583)
        at dalvik.system.NativeStart.main(Native Method)

请帮帮我,我今天一整天都在忙。


2
遇到了同样的问题,请查看https://dev59.com/zmQm5IYBdhLWcg3w2R5J#18916738,以获取一种简单而干净的解决方法。 - RedGlyph
https://www.youtube.com/watch?v=MIzgaMiyKoM - Behzad
在Android Studio中添加支持库(appcompat,cardview)的2种方法 - Athira Reddy
9个回答

118

使用Gradle

如果您正在使用Gradle,可以将其作为compile依赖项添加。

说明

  1. 确保您已安装Android支持库SDK包。在构建过程中,Android Studio会自动识别此存储库(不确定纯净的IntelliJ是否支持)。

    Android Support Repository

  2. 将依赖项添加到{project}/build.gradle

dependencies {
    compile 'com.android.support:appcompat-v7:+'
}
  • 点击 Sync Project with Gradle Files 按钮。

  • 编辑:看起来这些相同的说明也在文档中,位于 添加具有资源的库 -> 使用 Android Studio 下面。


    3
    谢谢,但我不使用Gradle。 我没有安装Android Studio。 我使用IntelliJ IDEA编程。 - Alex Malkov
    6
    我主要是为了让其他人在使用Gradle时能够找到你的问题而添加了这句话。如果有人安装了IntelliJ的Android插件并使用Gradle,这应该可以解决问题。 - Austyn Mahoney
    这不起作用。您仍然需要将其添加为库,以便引用参考文献。我不知道为什么。这也一整天都让我感到困惑。 - RichieHH
    你说的“引用引用”是什么意思?你是在说将文档附加到jar或Android库吗? - Austyn Mahoney
    1
    @Eggman87 我知道有点晚了,但是在你的库项目中尝试使用 com.android.support:support-v4:+。这将告诉它使用项目提供的任何版本。 - Austyn Mahoney
    显示剩余4条评论

    85

    没有使用Gradle (点击这里获取Gradle解决方案)

    1. 创建一个支持库项目

    2. 从Eclipse项目中将库项目导入到Intellij(此步骤仅适用于您在Eclipse中创建库的情况)。

    3. 右键单击模块,选择“打开模块设置”。

    4. 设置v7 jar文件的库 设置v7 jar文件的库

    5. 设置v7库模块的库 设置v7库模块的库

    6. 设置应用程序模块依赖于v7库模块 设置应用程序模块依赖于v7库模块


    3
    你能详细说明一下你是如何完成第5步的吗?我会非常感激的...谢谢! - Andreas Wong
    @SiGanteng 第五步实际上是在执行第一步和第二步时自动完成的。 - Populus

    10

    使用Maven

    首先,您应该使用Maven Android SDK部署程序将Android库安装到本地Maven仓库中。

    然后,您可以像这样在POM文件中添加依赖项:

        <dependency>
            <groupId>android.support</groupId>
            <artifactId>compatibility-v7-appcompat</artifactId>
            <version>${compatibility.version}</version>
            <type>apklib</type>
        </dependency>
    
        <dependency>
            <groupId>android.support</groupId>
            <artifactId>compatibility-v7-appcompat</artifactId>
            <version>${compatibility.version}</version>
            <type>jar</type>
        </dependency>
    

    部署程序对我不起作用。相反,我按照以下步骤操作:1)转到ANDROID_HOME\sdk\extras\android\support\v7\appcompat 2)创建整个库的zip文件并将其命名为appcompat.apklib 3)在此位置打开cmd并键入“mvn install:install-file -Dfile=appcompat.apklib -DgroupId=com.google.android -DartifactId=support-v7-appcompat -Dversion=r7 -Dpackaging=apklib” 4)前往/libs 5)键入“mvn install:install-file -Dfile=android-support-v7-appcompat.jar -DgroupId=com.google.android -DartifactId=support-v7-appcompat -Dversion=r7 -Dpackaging=jar” 6)添加适当的依赖项。 - bentzy
    这也很有用:https://code.google.com/p/maven-android-plugin/wiki/ApkLib - bentzy

    4
    这是我的解决方案:
    1. 将 $ANDROID_SDK/extras/android/support/v7/appcompat 复制并粘贴到你的项目根目录下。

    2. 在 Intellij 中打开 "Project Structure",点击 "Project Settings" 下的 "Modules",然后点击 "appcompat" -> "android",确保 "Library Module" 复选框已被选中。

    3. 点击 "appcompat" 下的 "YOUR-PROJECT_NAME",移除 "android-support-v4" 和 "android-support-v7-compat";确保 "appcompat" 前面的复选框已被选中。然后,点击 "ok" 关闭 "Project Structure" 对话框。

    4. 返回主界面,点击项目区域左上角的 "appcompat" -> "libs"。右键点击 "android-support-v4",选择菜单项 "Add as library",将 "Add to Module" 改为 "Your-project"。"android-support-v7-compat" 同理。

    完成以上步骤后,Intellij 应该能够正确找到 android-support-XXXX 模块。
    祝好运!

    4
    另一个简单的解决方案是将这些代码行粘贴到build.gradle文件中。
    dependencies {
    
        //import of gridlayout
        compile 'com.android.support:gridlayout-v7:19.0.0'
        compile 'com.android.support:appcompat-v7:+'
    }
    

    4
    不建议要求获取最新版本的appcompat。相反,使用以下代码:compile 'com.android.support:appcompat-v7:{targetSdkVersion}.+' - Vikram Bodicherla

    3

    对于Maven的另一个解决方案(至少对我来说更好的解决方案)是使用本地Android SDK中包含的Maven存储库。要做到这一点,只需将新存储库添加到您的Pom文件中,指向本地Android SDK即可:

    <repository>
        <id>android-support</id>
        <url>file://${env.ANDROID_HOME}/extras/android/m2repository</url>
    </repository>
    

    添加此存储库后,您可以像这样添加标准的Google依赖项:

    <dependency>
        <groupId>com.android.support</groupId>
        <artifactId>support-v13</artifactId>
        <version>${support-v13.version}</version>
    </dependency>
    
    <dependency>
        <groupId>com.android.support</groupId>
        <artifactId>appcompat-v7</artifactId>
        <version>${appcompat-v7.version}</version>
        <type>aar</type>
    </dependency>
    

    1

    作为库项目

    按照http://developer.android.com/tools/support-library/setup.html的说明,您应该将资源添加到库项目中。

    部分 > 使用带有资源的库

    然后在您的工作区中添加 android-support-v7-appcompat 库,并将其作为参考添加到您的应用程序项目中。

    在应用程序项目中定义所有资源也可以正常工作(但需要添加大量定义,而且您可能会漏掉一些定义),但这不是推荐的方法。


    请注意,如果您将appcompat项目中的所有资源定义到您的项目中,您应该检查生成的R.java文件是否在android.support.v7.appcompat包中。否则,资源将无法被android-support-v7-appcompat.jar看到。 - antonv
    1
    我正在使用IDEA,请告诉我如何添加一个带有资源的库。 他看到资源编译没有错误,但是在启动时出现错误。 - Alex Malkov

    0

    这是我的解决方案,它与之前的解决方案非常相似:

    <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>support-v7</artifactId>
            <scope>system</scope>
            <systemPath>${android.home}/support/v7/appcompat/libs/android-support-v7-appcompat.jar</systemPath>
            <version>19.0.1</version>
    </dependency>
    

    {android.home} 是 Android SDK 的根目录,它使用 systemPath 而不是 repository


    support-v7 不仅仅是一个简单的 jar 文件。 - Serob_b

    0

    关于Austyn Mahoney的回答的更新,配置“compile”已经过时,已被“implementation”和“api”所取代。

    它将在2018年底被移除。更多信息请参见这里


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