1. 程式人生 > >Maven + Eclipse + Android 環境搭建

Maven + Eclipse + Android 環境搭建

Android官方開發團隊致力於為Ecilpse外掛提供可靠的支援,而android-maven-plugin致力於將Maven,Android和Eclipse串聯在一起。m2e-android是一個 Maven Integration for Eclipse (m2e) plug-in,為Android Developer Tools (ADT)和 Maven Android Plugin新增Maven支援,為ADT提供Maven依賴管理的特性。 安裝m2e-android需要Eclipse Indigo or Juno (低版本的Eclispe未提供Eclipse Marketplace)

1.Essentials Tools:必備工具

1.1 Android Development Tool(ADT)以及Android SDK。

這個是必須的,不用贅述。

1.2 Android Development Tools and the M2Eclipse

這個是Eclipse的外掛,充當的角色是ADT及m2e之間的橋樑,由於Android專案的特性,Maven所做的操作在Android的專案上並不適用,所以這個外掛相當於兩個外掛之間的介面卡,使得m2e的外掛作出的變更及其通知能夠以ADT所能接受的方式通知ADT對Android的專案作出響應的變更。

進入Eclipse Marketplace.搜尋android m2e ,然後點選Installer按鈕即可。

本專案的Github託管地址為:

注意,目前該專案支援Eclipse indigo,juno,kepler三個版本。

1.3 Android Connector

這個是在Preferences->Maven->Discovery中選擇Android Connector下載。


該專案的主要作用是使得Maven Android外掛能夠使用Android SDK作為Dependence。

(1)Android SDK中下載部署所有你需要的platforms與add-ones.

(2)下載Github 上工程檔案。

(3)使用命令列進入到工程目錄下,使用mvn install安裝依賴項。

(4)如果需要安裝特定級別的SDK,使用如下:

  • mvn install -P 1.5
  • mvn install -P 1.6
  • mvn install -P 2.1
  • mvn install -P 2.2
  • mvn install -P 2.3.3
  • mvn install -P 3.0
  • mvn install -P 3.1
  • mvn install -P 3.2
  • mvn install -P 4.0
  • mvn install -P 4.0.3
  • mvn install -P 4.1
  • mvn install -P 4.2
  • mvn install -P 4.3
  • mvn install -P 4.4

如果有如下錯誤,說明你的SDK中可能確實相應的platforms。


2 配置

安裝好m2e之後,需要選擇你本地的Maven的安裝路徑。


在你的settings檔案中也可以新增如下內容:

<span style="font-family:Microsoft YaHei;"><settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"   

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   

  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">   

  <profiles>   

    <profile>   

      <id>android</id>   

        <properties>   

          <android.sdk.path>   

            E:\dev_tool\android-sdks(android-SDK home路徑)  

          </android.sdk.path>   

        </properties>   

      </profile>   

    </profiles>   

    <activeProfiles> <!--make the profile active all the time -->   

      <activeProfile>android</activeProfile>   

    </activeProfiles>   

</settings></span>  

3 工程

如果你已經有了一個安卓的工程,可以直接右擊->Configure->Convert to Maven Project轉換為Maven專案,其中pom檔案的packaging型別需要更改為apk.

<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/maven-v4_0_0.xsd">  

    <modelVersion>4.0.0</modelVersion>  

    <groupId>org.cst.ming.android.sample</groupId>  

    <artifactId>sample</artifactId>  

    <version>0.0.1-SNAPSHOT</version>  

    <packaging>apk</packaging>  

如果要新建一個Android 專案,可以根據如下步驟:

Create a new Maven Project (File -> New -> Project... then select Maven -> Maven Project).

When prompted to Select Archetype click Add Archetype...

In the dialog that appears enter "de.akquinet.android.archetypes" for Archetype Group Id.

In Archetype Artifact Id enter "android-quickstart".

In Archetype Version enter "1.0.10" and continue.

When prompted enter your desired project group and artifact ID, version and, optionally, set the "platform" property for the Android version (defaults to '16').

Click Finish

注意,這裡的de.akquinet.android.archetypes模板的version經常會改變,可以前往Maven的Central倉庫搜尋檢視相應版本。

Either way you should


在編譯的時候,最好在pom檔案中宣告一個build外掛:

<plugin>  

    <groupId>com.jayway.maven.plugins.android.generation2</groupId>  

    <artifactId>android-maven-plugin</artifactId>  

    <version>3.0.0</version>  

    <inherited>true</inherited>  

    <extensions>true</extensions>  

    <configuration>  

        <sdk>  

            <platform>7</platform>  

            <path>${env.ANDROID_SDK_HOME}</path>  

        </sdk>  

        <deleteConflictingFiles>true</deleteConflictingFiles>  

        <undeployBeforeDeploy>true</undeployBeforeDeploy>  

    </configuration>  

</plugin>  

4 常見問題

(1)No Android SDK path could be found.

在settings.xml裡面新增:

<profiles>

    <profile>

        <id>android</id>

        <properties>

            <android.sdk.path>

                /Users/lily/android-sdk-macosx <!-- 此處為自己sdk路徑 -->

            </android.sdk.path>

        </properties>

    </profile>

</profiles>

<activeProfiles> <!--make the profile active all the time -->

          <activeProfile>android</activeProfile>

</activeProfiles>

或者在系統變數中建立ANDROID_HOME變數,或者直接在pom.xml中指定android. sdk.path。

(2)[ERROR] Failed to execute goal com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.8.0:generate-sources(default-generate-sources) on project controltower-android: Executiondefault-generate-sources of goalcom.jayway.maven.plugins.android.generation2:android-maven-plugin:3.8.0:generate-sourcesfailed:

以及

Project Build Error:unknown packaging:apk

這是因為沒有安裝m2e android connector,可以按照如下步驟。

Preferences -> Maven -> Discovery and click "Open Catalog".然後選擇 m2e android connector 安裝好以後就可以解決這個問題。

(3)@Override 的程式碼全部都報錯

預設Maven中的JAVA版本是1.5,只要修改成1.6就好了

<plugin>

  <groupId>org.apache.maven.plugins</groupId>

  <artifactId>maven-compiler-plugin</artifactId>

  <version>2.1</version>

  <configuration>

    <source>1.6</source>

    <target>1.6</target>

  </configuration>

</plugin>

(4)No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?這個錯誤即是找不到JDK的錯誤,可以使用如下方案:

l 在Eclipse的ini檔案中新增如下語句:

-vm

C:\Program Files\Java\jdk1.7.0_25\bin\javaw.exe

l Window ->Preferences -> Java -> Installed JREs, 點選"Add"按鈕,選擇預設的"Standard VM", 點選"Next >", 點選"JRE home"右邊的"Directory"選擇資料夾D:\Development\Java\jdk1.7.0_25\jre,一路“確定”,回到"Installed JREs"介面,在剛新增的"jdk1.7.0_25"打上勾。再選擇目錄樹中的"Execution Environments",點選介面左側的"J2SE-1.7",然後在右側點選"jdk1.7.0_25"。重啟Eclipse,一切OK了。或者edit已經存在的jre,然後點選Add Extends JARS按鍵,新增jdk\lib\tools.jar檔案,同樣可以解決。

(5)匯入工程後,pom.xml檔案中,以下外掛報錯

          <plugin>

                <groupId>com.jayway.maven.plugins.android.generation2</groupId>

                <artifactId>android-maven-plugin</artifactId>

                <version>3.8.0</version>

                <configuration>

                    <sdk>

                        <!-- platform or api level (api level 4 = platform 1.6)-->

                        <platform>18</platform>

                    </sdk>

                    <undeployBeforeDeploy>true</undeployBeforeDeploy>

                </configuration>

                <extensions>true</extensions>

            </plugin>

提示:

Plugin execution not covered by lifecycle configuration: 

 com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.8.0:consume-aar (execution:

 default-consume-aar, phase: compile)

解決:

開啟 'Problems'檢視: 'Window' -> 'Show View' -> 'Problems'

右鍵點選報錯的地方,選擇'Quick Fix'

點選選擇'Permanently mark goal generate in pom.xml as ignored in Eclipse build' -> 'Finish' -> 'OK'

修改完後,右鍵專案—> Maven —> Update Project

(6)dependency=[com.actionbarsherlock:library:apklib:4.1.0:compile] not found in 
workspace com.actionbarsherlock.library 換了artifactId了,是actionbarsherlock,並且使用4.4.0的版本..Plugin execution not covered by lifecycle configuration: 

常用命令

Goal

Description

Creates an Android Archive (aar) file.

Creates the apk file. By default signs it with debug keystore.Change that by setting configuration parameter <sign><debug>false</debug></sign>.

Creates the apklib file.apklib files do not generate deployable artifacts.

Deploys the apk(s) of the current project(s) to all attached devices and emulators. Automatically skips other projects in a multi-module build that do not use packaging apk without terminating.Deploymnet is automatically performed when running mvn integration-test (or mvn install) on a project with instrumentation tests.

Deploys a specified Android application apk to attached devices and emulators. By default it will deploy to all, but a subset or single one can be configured with the device and devices parameters.This goal can be used in non-android projects and as standalone execution on the command line. 

Deploys all directly declared dependencies of <type>apk</type> in this project's pom.Usually used in a project with instrumentation tests, to deploy the apk to test onto the device before running the deploying and running the instrumentation tests apk.Automatically performed when running mvn integration-test (or mvn install) on a project with instrumentation tests.

DevicesMojo lists all attached devices and emulators found with the android debug bridge. It uses the same naming convention for the emulator as used in other places in the Android Maven Plugin and adds the status of the device in the list. TODO The goal is very simple and could be enhanced for better display, a verbose option to display and to take the android.device paramter into account.

Converts compiled Java classes to the Android dex format.

After compiled Java classes use emma tool

EmulatorStartMojo can start the Android Emulator with a specified Android Virtual Device (avd).

EmulatorStartMojo can stop the Android Emulator with a specified Android Virtual Device (avd).

EmulatorStopeAllMojo will stop all attached devices.

Generates R.java based on resources specified by the resources configuration parameter. Generates java files based on aidl files.

Display help information on android-maven-plugin.Call

  mvn android:help -Ddetail=true -Dgoal=<goal-name>

to display parameter details.

Runs the instrumentation apk on device.

Internal. Do not use.Called automatically when the lifecycle reaches phase integration-test. Figures out whether to call goals in this phase; and if so, calls android:instrument.

Internal. Do not use.Called automatically when the lifecycle reaches phase pre-integration-test. Figures out whether to call goals in this phase; and if so, calls android:deploy-dependencies and android:deploy.

LintMojo can run the lint command against the project. Implements parsing parameters from pom or command line arguments and sets useful defaults as well. Warning, if you use android.lint.enableClasspath and/or android.lint.enableLibraries the behavior of this goal will vary depending on the phase where this goal is executed. See android.lint.classpath/lintClassPath and android.lint.libraries/lintLibraries for more details.

Updates various version attributes present in the AndroidManifest.xml file.

Can execute tests using UI/Application Exerciser Monkey.Implements parsing parameters from pom or command line arguments and sets useful defaults as well. This goal will invoke Android Monkey exerciser. If the application crashes during the exercise, this goal can fail the build. A typical usage of this goal can be found at .

Can execute monkey runner programs.Implements parsing parameters from pom or command line arguments and sets useful defaults as well. This goal will invoke monkey runner scripts. If the application crashes during the exercise, this goal can fail the build. A typical usage of this goal can be found at .

Processes both application and dependency classes using the ProGuard byte code obfuscator, minimzer, and optimizer. For more information, see https://proguard.sourceforge.net.

Copy file or directory from all the attached (or specified) devices/emulators.

Copy file to all the attached (or specified) devices/emulators.

Undeploys and the deploys (= redeploys) the apk(s) of the current project(s) to all attached devices and emulators. Automatically skips other projects in a multi-module build that do not use packaging apk without terminating.

Reploys a specified Android application apk to attached devices and emulators. By default it will deploy to all, but a asubset or single one can be configured with the device and devices parameters. This simply tries to undeploy the APK first and then deploy it again. This goal can be used in non-android projects and as standalone execution on the command line.

Runs the first Activity shown in the top-level launcher as determined by its Intent filters.

Android provides a component-based architecture, which means that there is no "main" function which serves as an entry point to the APK. There's an homogeneous collection of Activity(es), Service(s), Receiver(s), etc.

The Android top-level launcher (whose purpose is to allow users to launch other applications) uses the Intent resolution mechanism to determine which Activity(es) to show to the end user. Such activities are identified by at least:

Action type: android.intent.action.MAIN

Category: android.intent.category.LAUNCHER

And are declared in AndroidManifest.xml as such:

<activity android:name=".ExampleActivity">

    <intent-filter>

        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />

    </intent-filter>

</activity>

This Mojo will try to to launch the first activity of this kind found in AndroidManifest.xml. In case multiple activities satisfy the requirements listed above only the first declared one is run. In case there are no "Launcher activities" declared in the manifest or no activities declared at all, this goal aborts throwing an error.

The device parameter is taken into consideration so potentially the Activity found is started on all attached devices. The application will NOT be deployed and running will silently fail if the application is not deployed.

Can execute tests using ui uiautomator.Implements parsing parameters from pom or command line arguments and sets useful defaults as well. This goal is meant to execute a special java project dedicated to UI testing via UIAutomator. It will build the jar of the project, dex it and send it to dalvik cache of a rooted device or to an emulator. If you use a rooted device, refer to The tests are executed via ui automator. A surefire compatible test report can be generated and its location will be logged during build. To use this goal, you will need to place the uiautomator.jar file (part of the Android SDK >= 16) on a nexus repository. A typical usage of this goal can be found at .

Undeploys the apk(s) of the current project(s) to all attached devices and emulators. Automatically skips other projects in a multi-module build that do not use packaging apk without terminating.Deploymnet is automatically performed when running mvn integration-test (or mvn install) on a project with instrumentation tests.

Undeploys a specified Android application apk from attached devices and emulators. By default it will undeploy from all, but a subset or single one can be configured with the device and devices parameters. You can supply the package of the application and/or an apk file. This goal can be used in non-android projects and as standalone execution on the command line.

Unpack libraries code and dependencies into target. This can be useful for using the proguard maven plugin to provide the input jars. Although it is encouraged to use the proguard mojo of the android maven plugin.

ZipalignMojo can run the zipalign command against the apk. Implements parsing parameters from pom or command line arguments and sets useful defaults as well.