4

This is a duplicate of this question, but that answer does not solve my problem.

Some background to my specific build environment:

I am using the Android maven plugin along with this sample project. The project consists of a parent pom.xml, and then a pom.xml for each of the three sub modules (projects). each sub module defines the parent as the parent.

When I run mvn clean install on the raw downloaded project it builds and installs/runs on the phone fine.

But I have no added the source into Eclipse where it runs fine to have the mvn build script no longer work (i.e. the apk is smaller and missing classes).

Any ideas on how I could fix this would be greatly appreciated.

Here is the POM file for the parent and after that the POM for the app project. Sorry to be posting such large chunks of code but I'm not sure where the problem is.

Update For people facing a similar problem I have started a conversion on the Google Group [Maven Android Developers] located here. I may get an answer there first.

<?xml version="1.0" encoding="UTF-8"?>
<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>com.simpligility.android.morse</groupId>
    <artifactId>morseflash-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>MorseFlash - Parent</name>

    <properties>
        <server_schema>http</server_schema>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.8.1</version>
            </dependency>
            <dependency>
                <groupId>com.google.android</groupId>
                <artifactId>android</artifactId>
                <version>2.3.1</version>
            </dependency>
            <dependency>
                <groupId>com.google.android</groupId>
                <artifactId>android-test</artifactId>
                <version>2.3.1</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>

        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-jarsigner-plugin</artifactId>
                    <version>1.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.5</version>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                    <artifactId>android-maven-plugin</artifactId>
                    <version>3.4.1</version>

                    <configuration>
                        <sdk>
                            <platform>10</platform>
                        </sdk>
                        <emulator>
                            <avd>23</avd>
                            <wait>10000</wait>
                            <!--<options>-no-skin</options> -->
                        </emulator>
                        <zipalign>
                            <verbose>true</verbose>
                        </zipalign>
                        <undeployBeforeDeploy>true</undeployBeforeDeploy>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <version>1.5</version>
                </plugin>
                <!--This plugin's configuration is used to store Eclipse m2e settings 
                    only. It has no influence on the Maven build itself. -->
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                                        <artifactId>android-maven-plugin</artifactId>
                                        <versionRange>[3.2.0,)</versionRange>
                                        <goals>
                                            <goal>manifest-update</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <execute />
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

    <profiles>
        <profile>
            <!-- the standard profile runs the instrumentation tests -->
            <id>standard</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <modules>
                <module>morse-lib</module>
                <module>morseflash-app</module>
                <module>morseflash-instrumentation</module>
            </modules>
            <properties>
                <!-- when i will try to enter this address the app will start :) -->
                <!-- for development i want to use my local host -->
                <!-- server schema is defined globally for all profiles but can be overridden
                    here for the local profile -->
                <!-- this properties are good for all the maven modules -->
                <server_host>192.168.1.12</server_host>
                <server_path></server_path>
            </properties>
        </profile>
        <profile>
            <!-- the release profile does sign, proguard, zipalign ... but does not 
                run instrumentation tests -->
            <id>release</id>
            <!-- via this activation the profile is automatically used when the release 
                is done with the maven release plugin -->
            <activation>
                <property>
                    <name>performRelease</name>
                    <value>true</value>
                </property>
            </activation>
            <modules>
                <module>morse-lib</module>
                <module>morseflash-app</module>
            </modules>
            <properties>
                <!-- when i will try to enter this address the app will start :) -->
                <!-- for release i want to use my git -->
                <!-- server schema is defined globally for all profiles but can be overridden
                    here for the local profile -->
                <!-- this properties are good for all the maven modules -->
                <server_host>github.com</server_host>
                <server_path>/jayway/maven-android-plugin-samples</server_path>
            </properties>
        </profile>
    </profiles>

</project>

Now for app project:

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <parent>
        <groupId>com.simpligility.android.morse</groupId>
        <artifactId>morseflash-parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <artifactId>morseflash-app</artifactId>
    <packaging>apk</packaging>
    <name>MorseFlash - App</name>

    <properties>
        <environment>development</environment>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.simpligility.android.morse</groupId>
            <artifactId>morse-library</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android-test</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>

    <!-- <sourceDirectory>src</sourceDirectory> -->

    <finalName>${project.artifactId}</finalName>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <!-- use the copy resources instead of resources, which adds it to 
                            the eclipse buildpath -->
                        <phase>initialize</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.basedir}/res</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>${project.basedir}/src/templates/res</directory>
                                    <targetPath>${project.basedir}/res</targetPath>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <manifest>
                        <debuggable>true</debuggable>
                    </manifest>
                </configuration>
                <executions>
                    <execution>
                        <id>manifestUpdate</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>manifest-update</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>alignApk</id>
                        <phase>package</phase>
                        <goals>
                            <goal>zipalign</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>development</id>
            <!-- using this since activeByDefault does not work well with multiple 
                profiles -->
            <activation>
                <property>
                    <name>environment</name>
                    <value>!production</value>
                </property>
            </activation>
            <properties>
                <deployment.stage>In Development</deployment.stage>
            </properties>
        </profile>
        <profile>
            <id>production</id>
            <properties>
                <deployment.stage>In Production</deployment.stage>
            </properties>
        </profile>
        <profile>
            <id>release</id>
            <!-- via this activation the profile is automatically used when the release 
                is done with the maven release plugin -->
            <activation>
                <property>
                    <name>performRelease</name>
                    <value>true</value>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-jarsigner-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>signing</id>
                                <goals>
                                    <goal>sign</goal>
                                    <goal>verify</goal>
                                </goals>
                                <phase>package</phase>
                                <inherited>true</inherited>
                                <configuration>
                                    <removeExistingSignatures>true</removeExistingSignatures>
                                    <archiveDirectory />
                                    <includes>
                                        <include>${project.build.directory}/${project.artifactId}.apk</include>
                                    </includes>
                                    <keystore>${sign.keystore}</keystore>
                                    <alias>${sign.alias}</alias>
                                    <storepass>${sign.storepass}</storepass>
                                    <keypass>${sign.keypass}</keypass>
                                    <verbose>true</verbose>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- the signed apk then needs to be zipaligned and we activate proguard 
                        and we run the manifest update -->
                    <plugin>
                        <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                        <artifactId>android-maven-plugin</artifactId>
                        <inherited>true</inherited>
                        <configuration>
                            <sign>
                                <debug>false</debug>
                            </sign>
                            <zipalign>
                                <skip>false</skip>
                                <verbose>true</verbose>
                                <inputApk>${project.build.directory}/${project.artifactId}.apk</inputApk>
                                <outputApk>${project.build.directory}/${project.artifactId}-signed-aligned.apk
                                </outputApk>
                            </zipalign>
                            <manifest>
                                <debuggable>false</debuggable>
                                <versionCodeAutoIncrement>true</versionCodeAutoIncrement>
                            </manifest>
                            <proguard>
                                <skip>false</skip>
                            </proguard>
                        </configuration>
                        <executions>
                            <execution>
                                <id>manifestUpdate</id>
                                <phase>process-resources</phase>
                                <goals>
                                    <goal>manifest-update</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>alignApk</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>zipalign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>build-helper-maven-plugin</artifactId>
                        <configuration>
                            <artifacts>
                                <artifact>
                                    <file>${project.build.directory}/${project.artifactId}-signed-aligned.apk</file>
                                    <type>apk</type>
                                    <classifier>signed-aligned</classifier>
                                </artifact>
                                <artifact>
                                    <file>${project.build.directory}/proguard/mapping.txt</file>
                                    <type>map</type>
                                    <classifier>release</classifier>
                                </artifact>
                            </artifacts>
                        </configuration>
                        <executions>
                            <execution>
                                <id>attach-signed-aligned</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>attach-artifact</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>
Community
  • 1
  • 1
jim
  • 8,670
  • 15
  • 78
  • 149
  • Can you update your android maven plugin to 3.5 and check if that helps. https://groups.google.com/forum/#!topic/maven-android-developers/w5H0oRWJN9I/discussion also can you let me know what is the problem... i am not getting... do you want to use android-maven plugin in eclipse or through command line... where is the problem. – Thalaivar Dec 20 '12 at 11:29

2 Answers2

2

So it turns out I just upset the project structure when manually setting up the projects in Eclipse. It was juts by chance that a colleague mentioned the mvn eclipse:eclipse command, which sorted out all my issues.

With reference to this sample project. I did the following to get everything working in Eclipse and Maven.

  1. cd into each project { morse-lib, morseflash-app, morseflash-instrumentation } and run mvn eclipse:eclipse.

  2. In Eclipse import each project individually. Not *-app and *-instrumentation are Android projects and *-lib is a Java project. All projects should be set to Java compiler 1.6.

  3. For each project in Eclipse Right Click -> Configure -> Convert To Maven

  4. For projects { *-app, *-instrumentation }, target/generated-sources/r -> right click -> properties -> resources -> resource filters -> add group -> { exclude all, files and folders, all children(recursive) }

  5. Clean all projects then build all

  6. You should now be able to run the morseflash-app project as an Android application.

  7. From the command line in the morseflash folder (contains *-lib, *-app, *-instrumentation) you should be able to execure mvn clean install android:deploy to get the app on the phone.

Hope this helps somebody else out. Ping me if not.

jim
  • 8,670
  • 15
  • 78
  • 149
0

Try upgrading to 3.5, that i would suggest you to go with. I would also specify the source and target to the language level.I was once facing such issue, when my eclipse was configured to different version altogether.

<plugin>
    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <version>3.4.1</version>
    <configuration>
        <sdk>
            <platform>10</platform>
        </sdk>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
        <emulator>
            <avd>23</avd>
            <wait>10000</wait>
            <!--<options>-no-skin</options> -->
        </emulator>
        <zipalign>
            <verbose>true</verbose>
        </zipalign>
        <undeployBeforeDeploy>true</undeployBeforeDeploy>
    </configuration>
</plugin>
Thalaivar
  • 23,282
  • 5
  • 60
  • 71