ClassNotFoundException с использованием AndroidAnnotations

Я пытаюсь использовать AndroidAnnotations, но получаю ошибку ClassNotFoundException в своем проекте.

В целях тестирования я создал новый проект с одним Activity и все еще получаю сообщение об ошибке. Мои файлы:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.rodrigora.testannotations"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.rodrigora.testannotations.MainActivity_"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.java

package com.rodrigora.testannotations;

import android.app.Activity;
import android.view.Menu;

import com.googlecode.androidannotations.annotations.EActivity;

@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

Это два файла, которые я изменил из примера проекта, созданного Eclipse, и выполнил следующие шаги, чтобы добавить AndroidAnnotations в проект:

  1. Добавлено androidannotations-api-2.7.jar в папку libs и в build path
  2. Добавлено androidannotations-2.7.jar в папку compiled-libs и в Factory Path
  3. Отмечен androidannotations-2.7.jar на вкладке Order and Export.

Вот трассировка стека при запуске приложения:

12-28 20:29:21.296: E/AndroidRuntime(30600): FATAL EXCEPTION: main
12-28 20:29:21.296: E/AndroidRuntime(30600): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.rodrigora.testannotations/com.rodrigora.testannotations.MainActivity_}: java.lang.ClassNotFoundException: com.rodrigora.testannotations.MainActivity_ in loader dalvik.system.PathClassLoader[/data/app/com.rodrigora.testannotations-2.apk]
12-28 20:29:21.296: E/AndroidRuntime(30600):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1573)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at android.os.Looper.loop(Looper.java:130)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at android.app.ActivityThread.main(ActivityThread.java:3687)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at java.lang.reflect.Method.invokeNative(Native Method)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at java.lang.reflect.Method.invoke(Method.java:507)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at dalvik.system.NativeStart.main(Native Method)
12-28 20:29:21.296: E/AndroidRuntime(30600): Caused by: java.lang.ClassNotFoundException: com.rodrigora.testannotations.MainActivity_ in loader dalvik.system.PathClassLoader[/data/app/com.rodrigora.testannotations-2.apk]
12-28 20:29:21.296: E/AndroidRuntime(30600):    at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
12-28 20:29:21.296: E/AndroidRuntime(30600):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1565)
12-28 20:29:21.296: E/AndroidRuntime(30600):    ... 11 more

Кто-нибудь знает, что я забыл? Eclipse должен показывать сгенерированные классы AndroidAnnotations?

Благодарю вас!

ИЗМЕНИТЬ

Полный код — битбакет


person Rodrigo    schedule 28.12.2012    source источник
comment
Вы должны включить препроцессор аннотаций или что-то подобное... вы это сделали?   -  person K-ballo    schedule 29.12.2012
comment
Да, журнал ошибок показывает AndroidAnnotations сообщений. Пример: Number of files generated by AndroidAnnotations: 1   -  person Rodrigo    schedule 29.12.2012
comment
Вы можете сделать эти файлы аннотаций загружаемыми ??   -  person itsrajesh4uguys    schedule 02.01.2013
comment
@Rajesh, посмотри мою правку, пожалуйста!   -  person Rodrigo    schedule 02.01.2013


Ответы (2)


Похоже, ваши сгенерированные AndroindAnnotation классы не включаются в вашу сборку. Вот строки, которые, кажется, отсутствуют в вашем .classpath -

   <classpathentry kind="src" path=".apt_generated">
               <attributes>
                       <attribute name="optional" value="true"/>
               </attributes>
   </classpathentry>

Они должны были быть сгенерированы для вас в процессе установки AndroidAnnotations. Что нужно проверить --

  • Ваши инструменты ADT обновлены.

  • Вы запустили Project->Clean после включения аннотаций

Мне удалось клонировать ваш репозиторий, импортировать в eclipse, получить чистую сборку и запустить приложение без сбоев, выполнив следующие действия:

  1. Рефакторинг/переименование проекта в TestAnnotations (затмение импортировано как «MainActivity_»)
  2. Включить обработку аннотаций (необходимо включить Enable project specific settings и Enable annonation processing в `Java Compiler->Обработка аннотаций)
  3. Проект->Очистить
  4. Запустить его

Примечание. Если бы я выполнил импорт и просто выполнил рефакторинг, чтобы получить чистую сборку, но не включил обработку аннотаций, я бы получил точно такое же поведение, как вы описываете. Убедитесь, что у вас включены конкретные настройки проекта и аннотации, а затем выполните чистую сборку.

person iagreen    schedule 03.01.2013
comment
Сгенерированные классы должны быть видны в eclipse? - person Rodrigo; 03.01.2013
comment
Нет, они не появятся в затмении. Как правило, они считаются временными файлами, поскольку создаются заново при каждой сборке. Они создаются в скрытом каталоге (.apt_generated). Если вы сделаете их невидимыми, вы не забудете изменить их, потому что любые внесенные вами изменения будут перезаписаны следующей сборкой. - person iagreen; 03.01.2013
comment
В моем случае я пропустил проверку Project settings -> Java Compiler -> Annotation Processing -> Enable Project Specific Settings. Когда я включил этот флажок, у меня появился сгенерированный файл MainActivity_. - person Rostyslav Druzhchenko; 25.02.2014

При обновлении maven и eclipse конфигурация проекта приводит к изменению выходной папки аннотаций Android. Чтобы исправить это, перейдите в «Путь сборки java»> «Источник» и установите для выходной папки аннотации Android выходную папку по умолчанию.

person Hadi Tok    schedule 01.11.2013