2012-12-04 102 views
1

是否有可能使用类型“apklib”的常春藤依赖?Android常春藤ActionBarSherlock

在我的项目中,我使用了ActionBarSherlock库,我想用Ivy来检索依赖关系。

这是我不工作的xml:

<dependency 
    name="actionbarsherlock" 
    conf="binaries" 
    org="com.actionbarsherlock" 
    rev="4.2.0" 
    transitive="true" 
    type="apklib" /> 

谢谢您的帮助!

回答

2

在这种情况下,所有这一切需要的是一个简单的依赖声明如下:

<dependency org="com.actionbarsherlock" name="actionbarsherlock" rev="4.2.0" conf="default"/> 

为什么?这个Maven模块是特殊的,Maven POM已经配置了一个包装,设置为值“apklib”。这意味着模块的主文件是“actionbarsherlock-4.2.0.apklib”,而不是默认的.jar文件。

有什么困惑的是,还有一个jar文件发布.......若要检索此,您可以添加特殊神器标签:

<dependency org="com.actionbarsherlock" name="actionbarsherlock" rev="4.2.0" conf="default"> 
    <artifact name="actionbarsherlock" type="jar"/> 
</dependency> 

要查看该模块发布的所有文件我建议Maven search

+0

是否在Eclipse中ivyde工作?据我所知,它不会在Eclipse 3.8上使用ivyde nightlies ... –

+0

这个jar是不够的。此外,常春藤获得apklib文件,但问题是你如何处理它..看到我的答案。 :) – aleb

+0

@aleb是的,你的答案更全面。我专注于询问有关“apklib”类型(由于Maven POM文件已被设置的方式而不需要指定)的问题部分。 –

0

可以在具有的ivy.xml例如:

<configurations> 
    <conf name="compiling"/> 
    </configurations> 
    <dependencies> 
    <dependency org="com.actionbarsherlock" name="actionbarsherlock" rev="4.3.1" conf="compiling->master"/> 

然后,如果你使用ant,在build.xml文件,你可以有一个目标,其准备这些“apklib”文件给你:

<target name="ivy"> 
    <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpath="ivy-2.3.0.jar"/> 
    <ivy:retrieve conf="compiling" type="apklib" pattern="libs/[artifact].apklib"/> 
    <!-- For each apklib artifact you need to unpack it so you can use it. --> 
    <unzip src="libs/actionbarsherlock.apklib" dest="apklibs/action-bar-sherlock"/> 

现在你已经拥有了apklibs/action-bar-sherlock库项目的src /,res /等。

下面是如何建立一个Android应用程序,它取决于多种的Android库项目的APK一个完整的build.xml例如:

<?xml version="1.0" encoding="utf-8"?> 

<project name="dev" default="release" xmlns:ivy="antlib:org.apache.ivy.ant"> 

    <!-- According to http://developer.android.com/sdk/requirements.html --> 
    <property name="ant.build.javac.source" value="1.6"/> 
    <property name="ant.build.javac.target" value="1.6"/> 

    <property file="local.properties"/> 
    <property file="project.properties" prefix="android.project"/> 

    <property name="android.target.dir" value="${sdk.dir}/platforms/${android.project.target}"/> 
    <property name="android.jar" value="${android.target.dir}/android.jar"/> 
    <property name="apk.name" value="YOUR_APP.apk"/> 
    <property name="out.dir" value="build/compiled"/> 
    <property name="out.test-classes.dir" value="build/compiled-test"/> 
    <property name="test.libs.dir" value="libs/test"/> 

    <target name="clean"> 
    <delete dir="build"/> 
    <delete dir="gen"/> 
    <delete dir="apklibs"/> 
    <delete file="${apk.name}"/> 
    </target> 

    <target name="ivy"> 
    <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpath="ivy-2.3.0.jar"/> 
    <ivy:retrieve conf="compiling" type="bundle,jar" pattern="libs/[artifact].[ext]"/> 
    <ivy:retrieve conf="compiling" type="apklib" pattern="libs/[artifact].apklib"/> 
    <unzip src="libs/actionbarsherlock.apklib" dest="apklibs/action-bar-sherlock"/> 
    <unzip src="libs/library.apklib" dest="apklibs/view-pager-indicator"/> 
    <path id="lib.path.id"> 
     <fileset dir="libs" includes="*.jar"/> 
    </path> 
    <ivy:retrieve conf="compiling" type="source" pattern="sources/[artifact].[ext]" sync="true"/> 
    <ivy:retrieve conf="packaging" type="bundle,jar" pattern="[artifact]-[revision].[ext]"/> 
    <ivy:retrieve conf="testing" type="bundle,jar" pattern="libs/test/[artifact].[ext]"/> 
    </target> 

    <target name="-check-properties" unless="sdk.dir"> 
    <echo> 
     You need to create a local.properties file with: 
     storepass=...the password... 
     sdk.dir=...path to Android SDK... 
    </echo> 
    </target> 

    <target name="generate" depends="-check-properties"> 
    <mkdir dir="gen"/> 
    <mkdir dir="build"/> 
    <condition property="debug.mode" value="--debug-mode" else=""> 
     <istrue value="${debug}"/> 
    </condition> 
    <echo>debug=${debug}</echo> 
    <echo>debug.mode=${debug.mode}</echo> 
    <exec executable="${sdk.dir}/platform-tools/aapt" failonerror="true"> 
     <arg value="package"/> 
     <arg line="${debug.mode}"/> 
     <arg value="-f"/> 
     <arg value="-m"/> 
     <arg value="--auto-add-overlay"/> 
     <arg value="-M"/> 
     <arg file="AndroidManifest.xml"/> 
     <arg value="-F"/> 
     <arg file="build/resources.arsc"/> 
     <arg value="-I"/> 
     <arg file="${android.jar}"/> 
     <arg value="-J"/> 
     <arg file="gen"/> 
     <arg value="-S"/> 
     <arg file="facebook-android-sdk/facebook/res"/> 
     <arg value="-S"/> 
     <arg file="apklibs/view-pager-indicator/res"/> 
     <arg value="-S"/> 
     <arg file="barone/res"/> 
     <arg value="-S"/> 
     <arg file="apklibs/action-bar-sherlock/res"/> 
     <arg value="-S"/> 
     <arg file="res"/> 
     <arg value="--extra-packages"/> 
     <arg value="com.facebook.android:com.viewpagerindicator:com.triposo.barone:com.actionbarsherlock"/> 
     <arg value="-A"/> 
     <arg file="assets"/> 
    </exec> 
    <taskdef name="buildconfig" classname="com.android.ant.BuildConfigTask" 
      classpath="${sdk.dir}/tools/lib/anttasks.jar"/> 
    <buildconfig 
     genFolder="gen" 
     package="com.actionbarsherlock" 
     buildType="${debug}" 
     previousBuildType=""/> 
    <buildconfig 
     genFolder="gen" 
     package="COM.YOUR.PACKAGE" 
     buildType="${debug}" 
     previousBuildType=""/> 
    </target> 

    <target name="compile" depends="clean, ivy, generate"> 
    <mkdir dir="${out.dir}"/> 
    <javac destdir="${out.dir}" debug="true" includeantruntime="false"> 
     <src path="src"/> 
     <src path="facebook-android-sdk/facebook/src"/> 
     <src path="apklibs/view-pager-indicator/src"/> 
     <src path="barone/src"/> 
     <src path="apklibs/action-bar-sherlock/src"/> 
     <src path="gen"/> 
     <classpath> 
     <path refid="lib.path.id"/> 
     <pathelement path="${android.jar}"/> 
     </classpath> 
    </javac> 
    <copy todir="${out.dir}"> 
     <fileset dir="src" excludes="**/*.java"/> 
     <fileset dir="gen" excludes="**/*.java"/> 
    </copy> 
    </target> 

    <target name="apk-unsigned" depends="compile"> 
    <!-- Prepare the .class files and the .properties files. --> 
    <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask" 
      classpath="jarjar-1.1.jar"/> 
    <jarjar jarfile="build/app.jar" duplicate="preserve"> 
     <fileset dir="${out.dir}"/> 
     <zipgroupfileset dir="libs" includes="*.jar"/> 
     <keep pattern="COM.YOUR.PACKAGE.**"/> 
     <keep pattern="com.amazonaws.**"/> 
     <keep pattern="com.facebook.android.**"/> 
     <keep pattern="com.google.android.apps.analytics.**"/> 
     <keep pattern="com.google.gson.GsonBuilder"/> 
     <keep pattern="com.google.common.base.Splitter"/> 
     <keep pattern="com.google.common.io.Files"/> 
     <keep pattern="com.google.common.base.Charsets"/> 
     <keep pattern="javax.annotation.Nullable"/> 
     <keep pattern="org.apache.commons.lang3.**"/> 
     <keep pattern="android.support.v4.**"/> 
     <!-- Required because these seem to be missing from the phone JVM 
      and they are used by our CursorMapper. --> 
     <keep pattern="javax.annotation.**"/> 
     <!-- From http://actionbarsherlock.com/faq.html --> 
     <keep pattern="com.actionbarsherlock.**"/> 
     <keep pattern="*Annotation*"/> 
     <rule pattern="com.google.common.**" result="[email protected]"/> 
     <!-- We rename this because at least "HTC Sensation XL with Beats Audio" 
      has a bad Gson library which we don't want to use. --> 
     <rule pattern="com.google.gson.**" result="[email protected]"/> 
    </jarjar> 
    <!-- Convert the .class files to Dalvik byte code. --> 
    <exec executable="${sdk.dir}/platform-tools/dx" failonerror="true"> 
     <arg value="--dex"/> 
     <arg value="--output=build/classes.dex"/> 
     <arg file="build/app.jar"/> 
    </exec> 
    <!-- Package the resources and the classes into an apk. --> 
    <taskdef name="apkbuilder" classname="com.android.ant.ApkBuilderTask" 
      classpath="${sdk.dir}/tools/lib/anttasks.jar"/> 
    <apkbuilder outfolder="." 
       resourcefile="build/resources.arsc" 
       apkfilepath="build/unsigned.apk" 
       verbose="false"> 
     <dex path="build/classes.dex"/> 
     <sourcefolder path="${out.dir}"/> 
    </apkbuilder> 
    </target> 

    <!-- We need this because I use JDK 7, see the Caution in: 
     http://developer.android.com/guide/publishing/app-signing.html#signapp 
     Ant 1.8.3 allows specifying a sigalg and a digestalg, but 
     I don't have it yet, so we have this macro instead. --> 
    <macrodef name="signjarjdk7"> 
    <attribute name="jar" /> 
    <attribute name="signedjar" /> 
    <attribute name="keystore" /> 
    <attribute name="storepass" /> 
    <attribute name="alias" /> 
    <sequential> 
     <exec executable="jarsigner" failonerror="true"> 
     <arg line="-digestalg SHA1 -sigalg MD5withRSA" /> 
     <arg line="-keystore @{keystore} -storepass @{storepass}" /> 
     <arg line="-signedjar &quot;@{signedjar}&quot;" /> 
     <arg line="&quot;@{jar}&quot; @{alias}" /> 
     </exec> 
    </sequential> 
    </macrodef> 

    <macrodef name="zipalign"> 
    <attribute name="apk" /> 
    <attribute name="optimizedapk" /> 
    <sequential> 
     <exec executable="${sdk.dir}/tools/zipalign" failonerror="true"> 
     <arg value="-f"/> 
     <arg value="4"/> 
     <arg file="@{apk}"/> 
     <arg file="@{optimizedapk}"/> 
     </exec> 
    </sequential> 
    </macrodef> 

    <!-- Make an apk. 
     See http://developer.android.com/guide/developing/building/index.html --> 
    <macrodef name="apk"> 
    <attribute name="keystore"/> 
    <attribute name="storepass"/> 
    <attribute name="alias"/> 
    <sequential> 
     <antcall target="apk-unsigned"/> 
     <!-- Sign the apk for release. --> 
     <signjarjdk7 
      keystore="@{keystore}" storepass="@{storepass}" alias="@{alias}" 
      jar="build/unsigned.apk" signedjar="build/unaligned.apk"/> 
     <!-- Optimize the apk to improve speed. --> 
     <zipalign apk="build/unaligned.apk" optimizedapk="${apk.name}"/> 
    </sequential> 
    </macrodef> 

    <target name="release"> 
    <property name="debug" value="false"/> 
    <apk keystore="keystore" storepass="${storepass}" alias="YOUR ALIAS"/> 
    </target> 

    <target name="debug"> 
    <property name="debug" value="true"/> 
    <apk keystore="debug.keystore" storepass="android" alias="androiddebugkey"/> 
    </target> 

    <target name="compile.tests" depends="compile"> 
    <mkdir dir="${out.test-classes.dir}"/> 

    <javac encoding="ascii" source="1.6" target="1.6" debug="true" extdirs="" 
      includeantruntime="false" 
      destdir="${out.test-classes.dir}"> 
     <src path="test"/> 
     <classpath> 
     <pathelement path="${out.dir}"/> 
     <path refid="lib.path.id"/> 
     <fileset dir="${test.libs.dir}" includes="*.jar"/> 
     <pathelement path="${android.jar}"/> 
     </classpath> 
    </javac> 
    </target> 

    <target name="test" depends="compile.tests"> 
    <mkdir dir="${basedir}/out/reports/tests"/> 
    <junit showoutput="true" failureproperty="junit.failure"> 
     <formatter type="plain" usefile="false"/> 
     <formatter type="xml"/> 
     <batchtest todir="${basedir}/out/reports/tests"> 
     <fileset dir="test"> 
      <include name="**/*Test.java"/> 
     </fileset> 
     </batchtest> 
     <classpath> 
     <pathelement path="${out.dir}"/> 
     <path refid="lib.path.id"/> 
     <fileset dir="${test.libs.dir}" includes="*.jar"/> 
     <pathelement path="${android.jar}"/> 
     <pathelement path="${out.test-classes.dir}"/> 
     </classpath> 
    </junit> 
    <fail if="junit.failure" message="Unit test(s) failed. See reports!"/> 
    </target> 
</project> 
+0

常青藤taskdef是可选的,只要ivy jar位于$ ANT_HOME/lib或$ HOME/.ant/lib(安装ANT扩展的标准位置)。为什么?常春藤被打包成一个antlib。 –

+0

这个想法是克隆一个项目,并能够立即建立它,每个人都使用相同的工具(常春藤库)。现在用新的Gradle构建系统已经过时了。 – aleb

+0

Gradle非常酷。不幸的是,我不认为它从Maven和ANT接管...... –