На выходных решил уделить наконец-то время одному из своих Android-приложений, а именно BkEmu, и обнаружил, что после обновления Eclipse до версии 4.4 (Luna) отвалился запуск в эмуляторе через "Run As"->"Android Application". Точнее, приложение запускается, но падает с исключением java.lang.NoClassDefFoundError, причем отсутствующий класс находится в библиотеке Apache Commons, подключенной к проекту как Maven-зависимость. Выяснилось, что плагин m2e-android почему-то перестал подключать maven-зависимости в процесс сборки ADT. Включение экспорта контейнера Maven в настройках проекта ("Properties"->"Java Build Path"->"Order and Export"->галочка на "Maven Dependencies") не только не решило проблему, но только усугубило ее - проект вовсе перестал собираться через Eclipse Build, так как ADT стал пытаться положить в результирующий APK все зависимости, даже с областями видимости provided и test.

Довольно продолжительные поиски решения в Google и эксперименты с версиями плагинов Eclipse не увенчались успехом. Конечно, можно отказаться от запуска приложения средствами Eclipse и работать исключительно через Maven Android Plugin, запуская приложение в эмуляторе через mvn clean install android:deploy android:run, но полная пересборка приложения занимает ощутимо больше времени, чем инкрементальная сборка в Eclipse, что критично на этапе экспериментов с добавляемым функционалом.

Для того, чтобы обойти данную проблему, было решено воспользоваться механизмом приватных библиотек ADT. При сборке средствами Eclipse ADT автоматически включает в build path библиотеки из директории libs в корне проекта, так что можно использовать Maven Dependency Plugin для того, чтобы на этапе сборки скопировать необходимые зависимости в данную директорию, после чего можно будет пользоваться стандартным механизмом ADT для запуска приложений в эмуляторе. Для этого необходимо добавить в pom.xml следующий блок:

<project>
    [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.9</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.basedir}/libs</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>true</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <includeScope>runtime</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            ...
    </build>
    [...]
</project>

Далее необходимо включить использование библиотек в libs, поставив галочку на "Properties"->"Java Build Path"->"Order and Export"->"Android Private Libraries":

Screenshot

Чтобы при изменении зависимостей в libs не накапливались устаревшие версии библиотек, необходимо добавить данную директорию в список очищаемых в конфигурации Maven Clean Plugin:

<project>
    [...]
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>2.6.1</version>
                    <configuration>
                        <filesets>
                            <fileset>
                                <directory>libs</directory>
                            </fileset>
                        </filesets>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    [...]
</project>

Теперь достаточно выполнить mvn clean install, после чего необходимые зависимости станут доступны для ADT. Конечно, это больше напоминает костыль, так как зависимости все-таки должны автоматически включаться через m2e-android, но на данный момент решения лучше мне найти пока не удалось.