1

Android Java プロジェクトは Ant をビルド ツールとして使用するため、Ivy を依存関係管理に使用することは、私にとって自然な選択のように思えます。ただし、基本的なセットアップは正常に機能しますが、奇妙な問題が発生しています。問題を簡単に再現するために、GitHub で既存の例のフォークを作成しました。

ポイントは、依存関係が「libs」ディレクトリに正常にダウンロードされることですが、によって呼び出されたビルド プロセスがant debugJAR を見つけられないようです。ただし、オーバーロードされた「-pre-build」ターゲットの一部としてではなく、手動で「解決」ターゲットを呼び出すと、正常に機能しant resolve debugます。

「-pre-build」が終了する直前にライブラリが実際に「libs」にあることを確認しました(「-pre-build」ターゲットの一部として「libs」内のファイルをリストすることにより)。それらは見つかりません。

再現するには、ant を実行する前に「libs」からライブラリを削除することが重要です。ここで何がうまくいかないのですか?

resolve:
[ivy:retrieve] :: Apache Ivy 2.3.0-rc1 - 20120416000235 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] :: loading settings :: file = /Users/seschube/development/IvyAndroidExample/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: com.example#ivy-android-example;0.1
[ivy:retrieve]  confs: [default]
[ivy:retrieve]  found org.acra#acra;4.2.3 in acra
[ivy:retrieve]  found com.google.inject#guice;2.0-no_aop in maven2
[ivy:retrieve]  found com.google.zxing.core#core;1.6 in zxing
[ivy:retrieve] :: resolution report :: resolve 115ms :: artifacts dl 5ms
    ---------------------------------------------------------------------
    |                  |            modules            ||   artifacts   |
    |       conf       | number| search|dwnlded|evicted|| number|dwnlded|
    ---------------------------------------------------------------------
    |      default     |   3   |   0   |   0   |   0   ||   4   |   0   |
    ---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: com.example#ivy-android-example
[ivy:retrieve]  confs: [default]
[ivy:retrieve]  4 artifacts copied, 0 already retrieved (1195kB/76ms)

-pre-build:
     [echo] The "libs" directory contains: acra-4.2.3.jar;core-1.6.jar;guice-2.0-no_aop-javadoc.jar;guice-2.0-no_aop.jar

-code-gen:
[mergemanifest] Merging AndroidManifest files into one.
[mergemanifest] Manifest merger disabled. Using project manifest only.
     [echo] Handling aidl files...
     [aidl] No AIDL files to compile.
     [echo] ----------
     [echo] Handling RenderScript files...
[renderscript] No RenderScript files to compile.
     [echo] ----------
     [echo] Handling Resources...
     [aapt] Generating resource IDs...
     [echo] ----------
     [echo] Handling BuildConfig class...
[buildconfig] Generating BuildConfig class.

-pre-compile:

-compile:
    [javac] Compiling 3 source files to /Users/seschube/development/IvyAndroidExample/bin/classes
    [javac] /Users/seschube/development/IvyAndroidExample/src/com/example/IvyAndroidExampleActivity.java:7: error: package org.acra does not exist
    [javac] import org.acra.*;
    [javac] ^
    [javac] /Users/seschube/development/IvyAndroidExample/src/com/example/IvyAndroidExampleActivity.java:8: error: package com.google.inject does not exist
    [javac] import com.google.inject.*;
    [javac] ^
    [javac] /Users/seschube/development/IvyAndroidExample/src/com/example/IvyAndroidExampleActivity.java:9: error: package com.google.zxing does not exist
    [javac] import com.google.zxing.*;
    [javac] ^
    [javac] 3 errors

BUILD FAILED
4

2 に答える 2

4

何が起こっているのかを知りました。AndroidSDKのbuild.xmlは、すべてのJARをlibsディレクトリからターゲットproject.all.jars.pathの一部としてプロパティに追加します。しかし、Ivyのターゲットがの一部として呼び出された-build-setup場合、これは時期尚早です。これは、の前に呼び出されるためです。したがって、オーバーライドすることを意図していますが、間違った場所です。が呼び出される前にオーバーライドされることを意図した他の「ダミー」ターゲットがないように思われるので、現在、次のようなオリジナルに依存するバージョンでbuild.xmlファイルをオーバーライドしています。retrieve-pre-build-build-setup-pre-build-pre-build-build-setup-build-setupretrieve-build-setup

<target name="-build-setup" depends="retrieve,android_rules.-build-setup" />

于 2012-10-22T11:53:53.037 に答える
0

build.xml自体を見ずに言うのは難しいです。

ただし、を使用<ivy:resolve>して解決を行う場合、ライブラリがプロジェクトに自動的に配置されることはありません。ほとんどの場合、彼らはにいます$HOME/.ivy2/cache<javac>タスクを使用する前に実行する必要がある<ivy:cachepath>のは、コンパイルで使用できるパス参照を作成するために実行することです。

main.classpathタスクで呼び出される必要なクラスパスを作成したことがわかり<ivy:cachepath>ます。<javac>次に、これを使用してタスクに含めることができます。

<ivy:retrieve/>ライブラリをプロジェクトに実際にダウンロードする場合は、実行してから、そのディレクトリをクラスパスに配置する必要があります。

これはあなたを助けますか?

ちなみに、Githubで私のIvyセットアッププロジェクトを見てみることをお勧めします。プロジェクトを共有する人がたくさんいる場合は、Ivyを簡単に含めることができます。単にivy.dir サブディレクトリを作成し、それをインクルードサブプロジェクトにしない場合でも。このように、Ivyはプロジェクトにすでにインストールされているため、誰もインストールする必要はありません。

于 2012-10-21T16:29:38.263 に答える