Now that you have Eclipse set up properly, you're ready to start building a project!
You should create a new project and learn how it works before you start migrating an existing project.
Contents
- Part 1 - Installing Maven for Eclipse
- Part 2 - Compiling and building your APK
- Part 3 - Converting an existing Android project to a Maven project
- Part 4 - Share a library project using a local Maven repository
- Part 5 - How to debug your Android app with Maven?
- Part 6 - Sign your Android app APK for release
- Part 7 - Global properties and settings for Maven
Creating a new Maven Android project
- File > New > Other > Maven > Maven Project > Next > Next.
- For "Catalog", select Android (You'll need to be online for this to work)
- Select "android-quickstart"
- Next
- Group ID is the package name portion of your app, such as "org.companyname"
- Artifact ID is your app's compilation name, such as "codepeeker".
- Version is pretty much the SEMVER version number. Snapshot indicates it's a dev build of sorts that's constantly pushing a compiled library to a repo. I usually set my version to 1.0.0 for new projects.
- For more on naming conventions, see Maven – Guide to Naming Conventions
- Package is prefilled as you enter in your Group and Artifact information.
- Change platform to the Android API version needed.
- Click finish when done.
- And the result is this... a broken project.
Ignoring the consume-aar goal
The pom.xml file generated for you is broken by default. At the bottom of pom.xml, you'll see this lint error:
Plugin execution not covered by lifecycle configuration: com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.8.2:consume-aar (execution: default-consume-aar, phase: compile)
You can use the suggestions by clicking the red cross on the left to either:
- Option 1: Mark it as ignored in pom.xml (preferred, but makes the XML messy)
- Option 2: Ignore permanently in Eclipse (not advised if you work with other people or compile with command line)
Note: If neither of these options are available to you, close pom.xml, right-click it in the file explorer and select Open With > Maven POM Editor.
Choosing Option 1 will add the following <plugin> XML to ignore the consume-arr build goal (under build > pluginManagement > plugins). Don't copy paste, just let Eclipse do it for you.
This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.
Here's one I prepared earlier
I've created a generic pom.xml that works great as a base for most Android app projects. Just fill in the important parts and the rest should be fairly straight forward. Main things to change are:
- groupId, artifactId, version, name (See naming conventions, example below)
<groupId>org.twig.apps</groupId>
<artifactId>d2_runewords</artifactId>
<version>1.0.0</version>
<name>Diablo 2 Runewords</name>
- The platform version (Android API level).
<sdk>
<platform>16</platform>
</sdk>
- Make changes to anything under <properties> to suit your system setup such as "android.sdk.path". These are Maven variables which you can access using ${varname}.
- Added a jarsigner plugin so the Android APK is signed when we're ready to release.
A few other things I had to configure are:
- Java version 1.6 as a minimum for annotation processing (butterknife, parceler, android annotations, etc)
- I've configured the Android SDK local repository so you can easily use the support libraries. (More about that in Part 3)
- The way you include dependencies is via dependencies > dependency
- defaultGoal tells the script what to do and in what order. The "package" goal creates the APK and "android:deploy" pushes it to the device for testing.
Here's the file:
Whenever you make changes to pom.xml, you may need to keep the project in sync with it. Right click on your project > Maven > Update project (or Alt+F5 for those keyboard savvy users). This ensures the Eclipse project has the same configuration as the Maven pom.xml file, dependencies are pre-downloaded ready for compilation and stuff like that.
Compiling from command line
Personally I much prefer compiling from command line. It avoids a lot of the unnecessary complexities and repetitive confirmations involved with the Eclipse UI when it comes to debugging.
I created a script/batch file that contains the following command:
mvn package android:deploy android:run
What this does is compile your APK (package), push the APK to the emulator (android:deploy) and then start it (android:run).
I saved it in the same folder as your project and named it "mvn-debug.bat". Just run that whenever you want to debug your app. It's a lot less trouble than going through the "Eclipse way".
At this point you should be able to compile an APK file and find it in the "target" folder.
Compiling the Eclipse way
Now the Eclipse way...
- Right-click on your project > Debug > Maven build.
- Type in "package android:deploy android:run" as a goal.
- Click "Debug"
- Check the Maven console to see the log.
- If everything went according to plan, you should now have a healthy baby APK sitting in your target folder.
Adding dependencies
Now the main purpose of this lengthy exercise is to easily add new dependencies and removing the complicated mess involved with annotation settings.
The best way of finding the dependency groupID and artifactID is looking up the project homepage and copying the install instructions. For example Butterknife. Here's the Gradle version:
compile 'com.jakewharton:butterknife:6.0.0'
Compared to the Maven version:
<dependency>
<groupId>com.jakewharton</groupId>
<artifactId>butterknife</artifactId>
<version>6.0.0</version>
</dependency>
It's pretty easy to translate the Gradle version to Maven, so if the project doesn't provide the Maven dependency XML you can just convert it yourself.
Under the <dependencies> tag, add in your dependency.
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>${platform.version}</version>
<scope>provided</scope>
</dependency>
<!-- New dependency here -->
<dependency>
<groupId>com.jakewharton</groupId>
<artifactId>butterknife</artifactId>
<version>6.0.0</version>
</dependency>
<!-- /copy -->
</dependencies>
Optional: For some libraries which require multiple dependencies to be the same version (support-v4 and appcompat-v7), I like to have a dependency version under <properties>, so it's easy to find and change:
<android.support.version>19.1.0</android.support.version>
And replace the dependency version with:
<version>${android.support.version}</version>
Once you save pom.xml, update your project and it should automatically fetch any files needed from the Maven repository.
Perform a build to confirm everything is working fine.
Sources
- Maven – Guide to Naming Conventions
- performance - How to convert my Android project to a maven project - Stack Overflow
- eclipse - How to convert an existing Android project with Google API 4.2 to Maven - Stack Overflow
- java - Error in maven pom xml file - Stack Overflow
- M2E plugin execution not covered - Eclipsepedia
- java - maven android plugin with android support library v7 - Stack Overflow
- dex fails because a BuildConfig class from an aar lib is there twice · Issue #326 · simpligility/android-maven-plugin
- Android support library setup with maven - Stack Overflow