【问题标题】:DrawerLayout not found in Android Maven project at runtime运行时在 Android Maven 项目中找不到 DrawerLayout
【发布时间】:2023-04-10 20:39:02
【问题描述】:

好的,所以几周以来我一直在尝试解决这个问题,并且在 StackOverflow 上大量查看类似问题并尝试将它们应用于我自己的情况,但无济于事。我担心我只是在做一些非常愚蠢的事情,或者忘记了一些愚蠢的事情,会浪费别人的时间,但我现在没有选择和想法,所以如果最终出现这种情况,我深表歉意。我没有使用 Eclipse 或 Android Studio,只是 CLI Maven。我需要在我的应用程序中使用 DrawerLayout,但由于在运行时无法找到类(可能是 support-v4 包的其余部分),应用程序在尝试实例化它时崩溃。所以,一步一步来。

这是创建 DrawerLayout 的代码行:

DrawerLayout drawer = new android.support.v4.widget.DrawerLayout(this);

这是应用程序在尝试创建 DrawerLayout 的新实例时如何崩溃的堆栈跟踪。

E/AndroidRuntime( 2065): FATAL EXCEPTION: main
E/AndroidRuntime( 2065): Process: com.patron.main, PID: 2065
E/AndroidRuntime( 2065): java.lang.NoClassDefFoundError: android.support.v4.widget.DrawerLayout
E/AndroidRuntime( 2065):        at com.patron.main.FlashMenu.onCreate(FlashMenu.java:120)
E/AndroidRuntime( 2065):        at android.app.Activity.performCreate(Activity.java:5933)
E/AndroidRuntime( 2065):        at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
E/AndroidRuntime( 2065):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
E/AndroidRuntime( 2065):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
E/AndroidRuntime( 2065):        at android.app.ActivityThread.access$800(ActivityThread.java:144)
E/AndroidRuntime( 2065):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
E/AndroidRuntime( 2065):        at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 2065):        at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime( 2065):        at android.app.ActivityThread.main(ActivityThread.java:5221)
E/AndroidRuntime( 2065):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 2065):        at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime( 2065):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
E/AndroidRuntime( 2065):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
W/ActivityManager( 1228):   Force finishing activity com.patron.main/.FlashMenu

这是我在 POM.xml 中包含依赖项的方式:

<dependency>
  <groupId>com.android.support</groupId>
  <artifactId>support-v4</artifactId>
  <version>21.0.3</version>
  <type>aar</type>
  <exclusions>
    <exclusion>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
    </exclusion>
  </exclusions>
</dependency>

我正在使用 google 在 android-sdk/extras/android/m2repository 文件夹中提供的本地 maven 存储库,正如另一篇 SO 帖子所建议的那样。显然它可以编译并运行正常,所以我相信它可以正确找到它。当我调用 mvn dependency:build-classpath 来查看编译时类路径时,它向我显示了这个:

然后在 7zip 中手动打开该 AAR 文件夹并检查类 jar 以确保 DrawerLayout 在那里,我可以肯定地看到它是:

因此,在这一点上,我不确定我可以更改或做些什么来让此支持包在运行时可用。我详细检查了类路径,我相信我不会两次导入 support-v4 包,只是一次,并且根据两次导入它的错误性质来判断,如果那样的话,我认为我无法编译是问题所在。我尝试手动设置依赖项的范围以编译(应该是正确的),然后设置为运行时并提供以防万一没有任何运气。如果有人对解决此 NoClassDefFoundError 的问题有任何想法,将不胜感激。

【问题讨论】:

    标签: java android maven


    【解决方案1】:

    想通了。为后代: 您需要更新到最新版本的 Android Maven 插件,以避免出现此错误。此外,我在其他几个类中没有找到 ActivityCompat21 时遇到的一个旧错误,我使用 hacky 解决方法修复了该错误,也通过更新到插件的 4.0.0-rc2 版本来修复。

    <plugin>
        <groupId>com.jayway.maven.plugins.android.generation2</groupId>
        <artifactId>android-maven-plugin</artifactId>
        <version>4.0.0-rc.2</version>
        <extensions>true</extensions>
        <configuration>
            <includeLibsJarsFromAar>true</includeLibsJarsFromAar>
        </configuration>
    </plugin>
    

    【讨论】:

    • 你的构建路径是什么样的?您是否还必须将外部 jar 添加到构建路径?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2016-01-13
    • 1970-01-01
    • 2013-04-29
    • 2016-01-23
    • 1970-01-01
    相关资源
    最近更新 更多