2

現在、GlassFish サーバーで Ant を使用して Android アプリケーションを構築しようとしています。

現在の build.xml は、実行時ant debugまたはant releaseコマンド ラインから正常にビルドされますが、Java 経由でビルドしようとすると、例外がスローされ、クラスが見つからないことが通知されます: javax/xml/xpath/XPathExpressionException

エラーメッセージの関連部分は次のとおりです。

C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\ant\build.xml:109: taskdef A class needed by class com.android.ant.GetTypeTask cannot be found: javax/xml/xpath/XPathExpressionException
using the classloader AntClassLoader[C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\anttasks.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\common.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\guava-tools.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\sdklib.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\layoutlib_api.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\commons-compress-1.0.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\httpclient-4.1.1.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\httpcore-4.1.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\httpmime-4.1.1.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\commons-logging-1.1.1.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\commons-codec-1.4.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\dvlib.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\manifmerger.jar]

android build.xml の 109 行目は次のとおりです。<taskdef resource="anttasks.properties" classpathref="android.antlibs" />

これは、xpath のエントリを持つ anttasks.jar 内のファイルを参照します。

ビルドファイル

アプリのビルド ファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<project name="2007_doc2" default="help">
    <property file="local.properties"/>
    <property file="ant.properties"/>
    <property environment="env"/>
    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
        <isset property="env.ANDROID_HOME"/>
    </condition>
    <loadproperties srcFile="project.properties"/>
    <!-- quick check on sdk.dir -->
    <fail
        message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
        unless="sdk.dir"
        />
<import file="custom_rules.xml" optional="true"/>
<import file="${sdk.dir}/tools/ant/build.xml"/>
</project>

私の ant.properties ファイルは空で、local.properties ファイルは SDK を正しく指しています。project.properties ファイル内の唯一のものは次のとおりです。target=android-10

Java コード

Ant を実行するために使用している Java コードはすべて 1 つのクラス内にあり、次のようになります (スペースを節約するために短縮されています)。

setupSDK(dir);
Project project = new Project();

project.setUserProperty("ant.file", buildFile.getAbsolutePath());
project.setBaseDir(dir);

DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
project.addBuildListener(consoleLogger);
project.init();               

ProjectHelper helper = ProjectHelper.getProjectHelper();
project.addReference("ant.projectHelper", helper);
helper.parse(project, buildFile);

project.executeTarget(project.getDefaultTarget()); // build

setupSDK(dir)JVM フラグまたは環境変数 ANDROID_HOME を使用して、その場で local.properties ファイルを作成します (そして正しく動作します)。

それでおしまい

それが私が信じているすべての関連事項です。これを 64 ビット JDK を搭載した新しい Windows 8 マシンで実行していますが、32 ビット JVM を実行している Windows 7 マシンで実行すると同じ問題が発生します。

上で述べたように、実行時ant releaseまたはant debugコマンドラインで動作するため、Java から動作しない理由がわかりません。

アップデート

いくつかのテストの後、GlassFish サーバーで実行されていない場合、Java から実際に動作するようです。誰にもアイデアはありますか?

ありがとう、リンドン

別のアップデート

私の職場の同僚の 1 人は、スコープに関係している可能性があると示唆しており、GlassFish ドメインの外部でクラスをロードしようとしているという事実が原因であると思われます。

アップデート

解決方法は完全にはわかりませんが、これは事実のようです。Glassfishの外部で実行すると、Antのクラスパスが非常に長くなり、すべてのglassfishモジュール(私が思うに)とJDKの正しいランタイム(rt.jarを含む)が含まれていることがわかりました。

一方、glassfish で実行する場合、Java クラスパス上の唯一のものは次のとおりです。 C:\Program Files\glassfish-3.1.2.2\glassfish\modules\glassfish.jar

4

0 に答える 0