На выходных решил уделить наконец-то время одному из своих Android-приложений, а именно BkEmu, и обнаружил, что после обновления Eclipse до версии 4.4 (Luna) отвалился запуск в эмуляторе через "Run As"->"Android Application". почему-то перестал подключать 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":
Чтобы при изменении зависимостей в 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, но на данный момент решения лучше мне найти пока не удалось.
Комментарии