2012-12-04 101 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接管...... –