- 浏览: 52334 次
- 性别:
- 来自: 成都
文章分类
最新评论
Android之Maven集成Ant多渠道打包
在网上找了这方面的东西,貌似比较少,对maven也不是太了解,所以就想了个比较笨的办法,即用ant执行mvn命令来执行pom.xml文件,
maven只负责做打包和签名,其它的多渠道操作都是ant中处理。
ant.xml部分做循环的操作:
1. 文件替换
2. pom.xml中<appName>标签的修改
3. 执行mvn命令,打apk包及签名
Ant核心代码:
<?xml version="1.0" encoding="utf-8"?> <project name="test" basedir="." default="run" xmlns:artifact="urn:maven-artifact-ant"> <!-- ant build的引用 --> <property file="project.properties" /> <property file="ant.properties" /> <property file="build.properties" /> <!-- SDK目录(获取操作系统环境变量env.ANDROID_SDK_HOME的值) --> <property name="sdk-folder" value="D:/Program Files/android-sdk-windows" /> <property name="antcontrib_jar_path" value="C:/Users/Win7/Desktop/MavenAPK/ant-contrib-1.0b3.jar" /> <property name="appName" value="AppName" /> <property name="assetKey" value="${ant.contrib.asset.key}" /> <property name="nowpath" value="${assetKey}" /> <!-- 渠道名:渠道号 --> <property name="assetPathKey" value="${nowpath}" /> <property name="classPath" value="a.b.ControlAnt" /> <property name="javacPath" value="a/b/ControlAnt.java" /> <property name="mavenPath" value="${M2_HOME}/bin" /> <!-- 使用第三方的ant包,使ant支持for循环--> <taskdef resource="net/sf/antcontrib/antcontrib.properties"> <classpath> <pathelement location="${antcontrib_jar_path}" /> </classpath> </taskdef> <!-- SDK指定平台目录 --> <property name="sdk-platform-folder" value="${sdk-folder}/platforms/android-4" /> <!-- SDK中tools目录 --> <property name="sdk-tools" value="${sdk-folder}/tools" /> <!-- SDK指定平台中tools目录 --> <property name="sdk-platform-tools" value="${sdk-platform-folder}/tools" /> <!-- 编译需要的jar; 如果项目使用到地图服务则需要maps.jar --> <property name="android-jar" value="${sdk-platform-folder}/android.jar" /> <!-- 编译后的文件放置目录 --> <property name="outdir-target" value="target" /> <!-- 清单文件 --> <property name="manifest-xml" value="AndroidManifest.xml" /> <!-- 源文件目录 --> <property name="resource-dir" value="res" /> <property name="asset-dir" value="assets" /> <!-- java源文件目录 --> <property name="srcdir" value="src" /> <property name="srcdir-ospath" value="${basedir}/${srcdir}" /> <!-- 外部类库所在目录 --> <property name="external-lib" value="libs" /> <property name="external-lib-ospath" value="${basedir}/${external-lib}" /> <!-- 生成class目录 --> <property name="outdir-classes-ospath" value="${basedir}/${outdir-target}" /> <!-- 替换文件key : value --> <property name="assetchannelname" value="" /> <property name="assetchannelvalue" value="" /> <!-- 循环修改路徑名 --> <target name="run"> <foreach target="update_replace_path" list="${assetKey}" param="assetchannel" delimiter=","> </foreach> </target> <!-- 修改nowpath,并根据nowpath替换文件、打包 --> <target name="update_replace_path"> <echo> master.xml I passed PARAMETER passed-info with value ---------${assetchannel} </echo> <replaceregexp flags="nowpath" byline="false" encoding="UTF-8"> <regexp pattern='nowpath=(.*)' /> <substitution expression='nowpath=${assetchannel}' /> <fileset dir="${basedir}" includes="ant.properties" /> </replaceregexp> <mkdir dir="${outdir-classes-ospath}/classes" /> <!-- 此java类就做了一件事,通过循环的值assetchannel(path名称)读取到对应的值赋给nowpath --> <javac srcdir="src" includes="${javacPath}" destdir="${outdir-classes-ospath}" classpath="${outdir-classes-ospath}"> </javac> <java classname="${classPath}"> <arg value="${assetchannel}" /> <classpath> <pathelement path="./bin/classes" /> </classpath> </java> <antcall target="maven-apk"> </antcall> </target> <!--根据path值循环替换文件 --> <target name="deploy"> <echo level="info">Modify the asset files...</echo> <foreach target="modify_content_by_path" list="${assetPathKey}" param="assetpathchannel" delimiter=","> </foreach> <!-- 清理 --> <delete includeemptydirs="true" verbose="true"> <fileset dir="${outdir-classes-ospath}" excludes="*.apk,classes"> </fileset> </delete> </target> <!-- 替换需修改的文件并修改AppName --> <target name="modify_content_by_path"> <!-- 获取渠道名字 --> <propertyregex override="true" property="assetchannelname" input="${assetpathchannel}" regexp="(.*)::" select="\1" /> <!-- 获取渠道号码 --> <propertyregex override="true" property="assetchannelvalue" input="${assetpathchannel}" regexp="::(.*)" select="\1" /> <echo level="info">Replace ----- ${assetchannelname}......${assetchannelvalue}.........</echo> <if> <equals arg1="${appName}" arg2="${assetchannelname}" /> <then> <!-- 修改pom文件的appName标签,确定打包后的apk名称 --> <replaceregexp flags="g" byline="false" encoding="UTF-8"> <regexp pattern='\x3CappName\x3E(.*)\x3C/appName\x3E' /> <substitution expression="<appName>${assetchannelvalue}</appName>" /> <fileset dir="${basedir}" includes="pom.xml" /> </replaceregexp> </then> <else> <!-- 开始替换文件 --> <available property="file.exist" file="${assetchannelname}" /> <if> <isset property="file.exist" /> <then> <filter filtersfile="${assetchannelname}" /> <copy file="${assetchannelname}" overwrite="true" preservelastmodified="true" todir="./${assetchannelvalue}" verbose="true"> </copy> </then> <else> <echo level="error">Error: "${assetchannelname}" 文件不存在</echo> </else> </if> </else> </if> </target> <target name="maven-apk" depends="deploy"> <!-- 通过 执行maven命令来打apk包,前提是先配置maven到环境变量 --> <exec command="mvn.bat"> <arg value="-f" /> <arg value="${basedir}/pom.xml" /> <arg value="compile" /> <arg value="package" /> </exec> <echo level="verbose">--------BUILD SUCCESSFULL---------</echo> </target> </project>
配置信息:
ant.properies: ----> 属性配置信息,由于在maven中的setting.xml配置了keystore信息,所以此配置可略掉
build.properies: ----> 需替换的文件配置信息,可把ant.properties整合
ant.properies:
key.store=LS.keystore key.alias=LS key.store.password=xxxxxxx key.alias.password=xxxxxxx jdk.version=1.6
#Update nowpath value #Mon Apr 08 13:29:02 CST 2013 ant.contrib.asset.key=path,path1,path2 path2=E\:/a.png\:\:res/drawable-hdpi,E\:/b.png\:\:res/drawable-hdpi,E\:/c.png\:\:res/drawable-hdpi,E\:/ic_launcher.png\:\:res/drawable-hdpi,AppName\:\:MavenAnt2 path=E\:/a.png\:\:res/drawable-hdpi,E\:/b.png\:\:res/drawable-hdpi,E\:/c.png\:\:res/drawable-hdpi,E\:/ic_launcher.png\:\:res/drawable-hdpi,AppName\:\:MavenAnt path1=E\:/a.png\:\:res/drawable-hdpi,E\:/b.png\:\:res/drawable-hdpi,E\:/c.png\:\:res/drawable-hdpi,E\:/ic_launcher.png\:\:res/drawable-hdpi,AppName\:\:MavenAnt1 nowpath=E\:/a.png\:\:res/drawable-hdpi,E\:/b.png\:\:res/drawable-hdpi,E\:/c.png\:\:res/drawable-hdpi,E\:/ic_launcher.png\:\:res/drawable-hdpi,AppName\:\:MavenAnt2
AntControl.java根据path/path1/path2修改nowpath的值,如果没有此需求可以省略这一步。(在ant中循环ant.contrib.asset.key的值path为${assetchanel},
以${assetchanel}为key取出"E:\......"的时候取的值总为key的值,path本来就是value,应该有办法的,有人知道的话告诉我一下,所以又定义 了一个nowpath
而且还是在java中去修改,这样比较麻烦)。
AntControl.java
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; //This class is a util class , in order to pack apk file. public class ControlAnt { public static void main(String[] args) { try { InputStream in = new FileInputStream("build.properties"); Properties properties = new Properties(); properties.load(in); //路径名 String str = (String) properties.get(args[0]); String property = properties.getProperty(str, str); //通过路径名拿到路径value,然后赋给nowpath properties.setProperty("nowpath", property); FileOutputStream fos = new FileOutputStream("build.properties"); properties.store(fos, "Update" + " nowpath " + "value"); } catch (IOException e) { e.printStackTrace(); } } }
以下是maven模块的配置:
<?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> <artifactId>MavenAnt</artifactId> <groupId>a.b</groupId> <version>2.1.2</version> <packaging>apk</packaging> <name>MavenAnt</name> <properties> <!-- ant中修改此标签,决定打包后apk名称,达到多渠道打包目的 --> <appName>MavenAnt</appName> </properties> <dependencies> <dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>2.1.2</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>${appName}</finalName> <plugins> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <version>3.0.0-alpha-14</version> <configuration> <encoding>UTF-8</encoding> <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile> <assetsDirectory>${project.basedir}/assets</assetsDirectory> <resourceDirectory>${project.basedir}/res</resourceDirectory> <nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory> <sdk> <path>${env.ANDROID_HOME}</path> <platform>8</platform> </sdk> <deleteConflictingFiles>true</deleteConflictingFiles> <undeployBeforeDeploy>true</undeployBeforeDeploy> </configuration> <extensions>true</extensions> </plugin> <!-- 精减打包 --> <!--plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <id>zipalign</id> <goals> <goal>exec</goal> </goals> <phase>install</phase> <configuration> <executable>${ANDROID_HOME}/tools/zipalign</executable> <arguments> <argument>-f</argument> <argument>4</argument> <argument>target/${appName}.apk</argument> <argument>target/${appName}-sign.apk</argument> </arguments> <tasks> </tasks> </configuration> </execution> <execution> </execution> </executions> </plugin --> <!-- 签名 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jarsigner-plugin</artifactId> <version>1.2</version> <executions> <execution> <id>signing</id> <goals> <goal>sign</goal> </goals> <phase>package</phase> <inherited>true</inherited> <configuration> <archiveDirectory></archiveDirectory> <encoding>UTF-8</encoding> <includes> <argument>target/${appName}.apk</argument> </includes> <removeExistingSignatures>true</removeExistingSignatures> <keystore>${keyFilePath}</keystore> <storepass>${storePassword}</storepass> <keypass>${keyPassword}</keypass> <alias>${keyAlias}</alias> <deleteConflictingFiles>true</deleteConflictingFiles> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
在setting.xml中的profiles中添加:
<!-- 打包新增 --> <profile> <id>sign</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <keyFilePath>C:\Users\Win7\Desktop\Task\LS.keystore</keyFilePath> <storePassword>xxxxxxx</storePassword> <keyPassword>xxxxxxx</keyPassword> <keyAlias>LS</keyAlias> </properties> </profile>
相关推荐
《Maven Ant Tasks 2.1.3:构建与集成利器》 在软件开发领域,Maven 和 Ant 是两种广泛使用的构建工具。Maven 以其强大的依赖管理和项目生命周期管理功能著称,而 Ant 则以其灵活性和可定制性受到开发者青睐。然而...
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 maven-ant-tasks.jar
标题“Maven 与 Ant 之比较”表明了本文将探讨两种在Java开发中广泛使用的构建工具——Maven和Ant。它们的主要功能是管理和自动化项目的构建过程,包括编译源代码、运行测试、打包应用以及部署。通过对两者进行对比...
Android Maven 插件是将Android项目与Maven构建系统集成的一种工具。在传统的Android开发中,我们通常使用Gradle作为构建系统,但Maven在Java领域有着广泛的应用,因此对于那些习惯于Maven或者需要利用Maven生态的...
Android Maven Gradle 插件,作为Android库项目与Maven集成的重要桥梁,是开发者进行高效、灵活的项目管理和依赖管理的关键。本文将深入探讨这一插件的原理、使用方法及其在当前Android构建系统中的角色。 首先,...
Maven2的构建过程分为多个阶段,如编译(compile)、测试(test)、打包(package)、验证(verify)、集成测试(integration-test)、部署(deploy)等。开发者可以根据需求选择执行其中的部分或全部阶段。Maven的...
Maven 与 Ant 的奇妙整合 Maven 和 Ant 是两种常见的自动化构建工具,它们都有其独特的优点和缺点。在本文中,我们将探讨如何将 Maven 和 Ant 整合,以充分发挥两者的优势。 一、Maven 介绍 Maven 是一款基于项目...
本主题将深入探讨如何使用Android Studio和Gradle进行多渠道打包以及处理外部库依赖。 **一、多渠道打包** 多渠道打包是Android应用发布时的一个常见需求,它允许我们为不同的市场或推广渠道创建定制的应用版本。...
The Mavent Ant Tasks allow several of Maven's artifact handling features to be used from within an Ant build. These include: Dependency management - including transitive dependencies, scope ...
本文将详细讲解如何使用Maven来打包一个Java项目,并创建JAR文件。 首先,Maven有三个主要生命周期阶段:`clean`、`default`(也称为`compile`)和`install`。每个阶段包含一系列的阶段(或者称为目标,如`compile`...
工程大了以后,不可避免就会出现方法数目超出65536的限制,很幸运的是新的android提供了多dex打包的方式可以解决这个问题。本资源就是演示如何用android-maven-plugin打多dex包。
【maven】说明:Gradle maven工件发布与maven、maven发布、android maven Gradle插件的演练。该项目包含..., (Gradle maven artifacts publishing walkaround with maven , maven-publish , android-maven gradle ...
这使得开发者能够在Ant构建脚本中使用Maven的特性,如自动下载项目依赖、执行生命周期阶段(如编译、测试、打包、部署)等。 以下是一些使用maven-ant-tasks的关键知识点: 1. **安装与引入**:首先,你需要在Ant...
标题 "maven ant thrift0.9.0" 涉及到的是三个关键的软件开发工具:Thrift 0.9.0、Apache Ant 和 Apache Maven。这些工具在Java和其他编程语言的开发环境中广泛使用,特别是在构建和部署分布式系统时。 Thrift ...
4. **多渠道发布**:`android-maven-publish`允许你将库发布到多个Maven仓库,包括本地Maven仓库、JFrog Artifactory、Sonatype Nexus等。 5. **Groovy DSL支持**:插件使用Groovy DSL编写构建脚本,使得配置更加...
"maven+bat打包"是指使用Apache Maven,一个流行的Java项目管理工具,结合批处理脚本(BAT)来自动化项目的打包过程。这种方式可以极大地提高开发效率,确保每次构建的一致性和可重复性。下面将详细介绍这个过程及其...
"maven 过滤文件夹打包"这个主题涉及到的是如何利用Maven的资源过滤功能来实现针对不同运行环境的配置文件打包。下面将详细解释这一过程。 在开发环境中,我们通常会有多种配置文件,比如`application-dev....
maven下通用的ant配置文件,只要0积分。只需修改11行末尾的target/自己的工程名即可。
【标题】:“maven多环境配置打包” 在Java开发中,常常需要针对不同的运行环境(如开发、测试、生产)进行不同的配置。Maven作为Java项目管理的重要工具,提供了强大的多环境配置打包功能,帮助开发者有效地管理和...
以上就是关于"Maven打包,指定classes路径"的知识点,主要涉及到Maven的资源配置和插件定制。理解并掌握这些配置可以帮助开发者更高效地管理和构建Java Web应用。同时,记得在实际项目中根据实际情况调整`pom.xml`,...