2012-12-19 51 views
4

这是this question的重复,但该答案无法解决我的问题。APK在使用maven构建时缺少一些类

一些背景,我的具体编译环境:

我使用Android maven plugin随着this示例项目。该项目由父母pom.xml,然后pom.xml为三个子模块(项目)中的每一个。每个子模块都将父级定义为父级。

当我在原始下载项目上运行mvn clean install时,它会在手机上建立并安装/运行。

但我没有添加到Eclipse的源代码,它运行良好,让mvn构建脚本不再工作(即apk更小并且缺少类)。

关于如何解决这个问题的任何想法将不胜感激。

这里是POM父文件夹,然后POM为应用程序项目。 很抱歉发布了这么大的代码块,但我不确定问题出在哪里。

更新对于面对我已经开始对谷歌集团[Maven的Android开发者]位于here转换类似的问题的人。我可能会先在那里得到答案。

<?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> 

现在对于应用项目:

<?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> 
+0

你能更新你的android maven插件到3.5,并检查是否有帮助。 https://groups.google.com/forum/#!topic/maven-android-developers/w5H0oRWJN9I/discussion也可以让我知道是什么问题...我没有得到...你想使用eclipse中的android-maven插件或通过命令行...问题在哪里。 – Thalaivar

回答

2

所以事实证明,我只是在Eclipse中手动设置项目时不满意项目结构。一位同事提到mvn eclipse:eclipse指令是偶然的,这个指令整理了我所有的问题。

参照this示例项目。我做了以下事情,让Eclipse和Maven中的所有东西都可以使用。

  1. cd到每个项目{莫尔斯lib下,morseflash-应用,morseflash仪表}和运行mvn eclipse:eclipse

  2. 在Eclipse中分别导入每个项目。 不是* -app和* -instrumentation是Android项目,* -lib是 Java项目。所有项目都应该设置为Java编译器1.6。

  3. 在Eclipse中每个项目上右键点击 - >配置 - >转换到Maven

  4. 对于项目{* -app,* -instrumentation},目标/生成的来源/的R - >右键 - >属性 - >资源 - >资源过滤器 - >添加组 - > {排除所有文件和文件夹,所有儿童(递归)}

  5. 清洁所有项目然后构建所有

  6. 您现在应该能够运行morseflash-应用项目作为一个Android应用程序。

  7. morseflash文件夹中的命令行(含* -lib,* -app,* -instrumentation),你应该能够execure mvn clean install android:deploy拿到手机上的应用程序。

希望这可以帮助别人。如果没有,请给我平息

0

尝试升级到3.5,我建议你去。我还会指定语言级别的源代码和目标。当我的eclipse完全配置为不同的版本时,我曾经遇到过这样的问题。

<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>