Android и maven: проблема с зависимостями maven в apk

В настоящее время я работаю над проектом Android, используя Maven в качестве инструмента сборки. Однако я имею проблему с включением зависимостей, чтобы быть более конкретным: ни одна из зависимостей, перечисленных в моем файле pom, не упакована в apk. Это приводит к ошибкам ClassDefNotFound когда я пытаюсь запустить приложение в своем эмуляторе (базовое исключение ClassNotFound в загрузчике Dalvik).

Я использую Springsource Tool Suite (2.5.2.SR1) со следующей конфигурацией плагина:

  • Средства разработки Android (10.0.1.v201103111512-110841)
  • Интеграция Maven для Android Development Tools (0.2.5)
  • Интеграция Maven для Eclipse (0.12.1.20110112-1712)
  • Maven (2.2.1)

Это мой файл pom

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>android-test</groupId> <artifactId>android-test</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>apk</packaging> <name>android-test</name> <properties> <android-platform>10</android-platform> <android-emulator>Android-2.3.3</android-emulator> <android-sdk-path>C:\Program Files\Android\android-sdk</android-sdk-path> <maven-android-plugin-version>2.8.4</maven-android-plugin-version> <maven-compiler-plugin-version>2.3.2</maven-compiler-plugin-version> <android-version>2.3.1</android-version> <spring-android-version>1.0.0.M2</spring-android-version> <jackson-version>1.7.2</jackson-version> </properties> <build> <sourceDirectory>src</sourceDirectory> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>maven-android-plugin</artifactId> <version>${maven-android-plugin-version}</version> <configuration> <sdk> <platform>${android-platform}</platform> <path>${android-sdk-path}</path> </sdk> <emulator> <avd>${android-emulator}</avd> </emulator> <deleteConflictingFiles>false</deleteConflictingFiles> <undeployBeforeDeploy>true</undeployBeforeDeploy> </configuration> <extensions>true</extensions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin-version}</version> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>${android-version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.android</groupId> <artifactId>spring-android-rest-template</artifactId> <version>${spring-android-version}</version> </dependency> <dependency> <!-- Using Jackson for JSON marshaling --> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>${jackson-version}</version> </dependency> </dependencies> <repositories> <!-- For testing against latest Spring snapshots --> <repository> <id>org.springframework.maven.snapshot</id> <name>Spring Maven Snapshot Repository</name> <url>http://maven.springframework.org/snapshot</url> <releases><enabled>false</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> <!-- For developing against latest Spring milestones --> <repository> <id>org.springframework.maven.milestone</id> <name>Spring Maven Milestone Repository</name> <url>http://maven.springframework.org/milestone</url> <snapshots><enabled>false</enabled></snapshots> </repository> </repositories> </project> при <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>android-test</groupId> <artifactId>android-test</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>apk</packaging> <name>android-test</name> <properties> <android-platform>10</android-platform> <android-emulator>Android-2.3.3</android-emulator> <android-sdk-path>C:\Program Files\Android\android-sdk</android-sdk-path> <maven-android-plugin-version>2.8.4</maven-android-plugin-version> <maven-compiler-plugin-version>2.3.2</maven-compiler-plugin-version> <android-version>2.3.1</android-version> <spring-android-version>1.0.0.M2</spring-android-version> <jackson-version>1.7.2</jackson-version> </properties> <build> <sourceDirectory>src</sourceDirectory> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>maven-android-plugin</artifactId> <version>${maven-android-plugin-version}</version> <configuration> <sdk> <platform>${android-platform}</platform> <path>${android-sdk-path}</path> </sdk> <emulator> <avd>${android-emulator}</avd> </emulator> <deleteConflictingFiles>false</deleteConflictingFiles> <undeployBeforeDeploy>true</undeployBeforeDeploy> </configuration> <extensions>true</extensions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin-version}</version> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>${android-version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.android</groupId> <artifactId>spring-android-rest-template</artifactId> <version>${spring-android-version}</version> </dependency> <dependency> <!-- Using Jackson for JSON marshaling --> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>${jackson-version}</version> </dependency> </dependencies> <repositories> <!-- For testing against latest Spring snapshots --> <repository> <id>org.springframework.maven.snapshot</id> <name>Spring Maven Snapshot Repository</name> <url>http://maven.springframework.org/snapshot</url> <releases><enabled>false</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> <!-- For developing against latest Spring milestones --> <repository> <id>org.springframework.maven.milestone</id> <name>Spring Maven Milestone Repository</name> <url>http://maven.springframework.org/milestone</url> <snapshots><enabled>false</enabled></snapshots> </repository> </repositories> </project> , <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>android-test</groupId> <artifactId>android-test</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>apk</packaging> <name>android-test</name> <properties> <android-platform>10</android-platform> <android-emulator>Android-2.3.3</android-emulator> <android-sdk-path>C:\Program Files\Android\android-sdk</android-sdk-path> <maven-android-plugin-version>2.8.4</maven-android-plugin-version> <maven-compiler-plugin-version>2.3.2</maven-compiler-plugin-version> <android-version>2.3.1</android-version> <spring-android-version>1.0.0.M2</spring-android-version> <jackson-version>1.7.2</jackson-version> </properties> <build> <sourceDirectory>src</sourceDirectory> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>maven-android-plugin</artifactId> <version>${maven-android-plugin-version}</version> <configuration> <sdk> <platform>${android-platform}</platform> <path>${android-sdk-path}</path> </sdk> <emulator> <avd>${android-emulator}</avd> </emulator> <deleteConflictingFiles>false</deleteConflictingFiles> <undeployBeforeDeploy>true</undeployBeforeDeploy> </configuration> <extensions>true</extensions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin-version}</version> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>${android-version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.android</groupId> <artifactId>spring-android-rest-template</artifactId> <version>${spring-android-version}</version> </dependency> <dependency> <!-- Using Jackson for JSON marshaling --> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>${jackson-version}</version> </dependency> </dependencies> <repositories> <!-- For testing against latest Spring snapshots --> <repository> <id>org.springframework.maven.snapshot</id> <name>Spring Maven Snapshot Repository</name> <url>http://maven.springframework.org/snapshot</url> <releases><enabled>false</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> <!-- For developing against latest Spring milestones --> <repository> <id>org.springframework.maven.milestone</id> <name>Spring Maven Milestone Repository</name> <url>http://maven.springframework.org/milestone</url> <snapshots><enabled>false</enabled></snapshots> </repository> </repositories> </project> 

И мой файл манифеста Android:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ae.test.android" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".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> ? <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ae.test.android" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".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> 

Насколько я могу судить, это должна быть правильная настройка. Проблема в том, что когда я пытаюсь построить этот проект, я получаю:

Невозможно добавить исходную папку. Дублировать файлы по тому же пути внутри APK.

Я нашел это на SO, и хотя решение (изменение выходной папки по умолчанию для eclipse в bin вместо target ) действительно устранило ошибку, оно не решило проблему зависимости. Мои созданные андроид-файлы не включены в целевую папку, поэтому решение мне не подходит.

Кто-нибудь еще получил какой-либо опыт настройки Android и Maven, и если да, не могли бы вы помочь мне?

Спасибо заранее!

Я пропустил использование интеграции Maven для Android Development Tools (0.2.5), потому что процесс автоматической сборки eclipse занял много времени. В этом случае я мог бы оставить свою папку вывода по умолчанию в <project>/target/classes .

Построение моего проекта из командной строки отлично работает. Зависимости включены в файл apk.

Запуск проекта из eclipse работает только в том случае, если я добавлю явно явные в проект eclipse

 Project Properties -> Java Build Path -> Libraries -> Add External JARs... 

Это была горькая таблетка, которую я должен был проглотить ( я не являюсь родным английским и надеюсь, что это предложение имеет смысл ).

Используйте <scope>compile</scope> для ваших зависимостей, которые не предоставляются целевой системой (например, андроидные библиотеки предоставляются в системах Android), в противном случае maven не будет помещать файлы .class из ваших зависимостей в apk.

Вы можете использовать <extractDuplicates>true</extractDuplicates\> в конфигурации android-maven-plugin для удаления дубликатов банок.