0

私はAntに非常に慣れていません(Mavenから来ました)。次の操作を行うには多くの問題があります。

ShellExtBridgeという名前の別の依存プロジェクトを使用するCrystalIceGUIという名前のメイン プロジェクトがあります。

依存関係プロジェクトShellExtBridgeには、プロジェクトをコンパイルし、 Releaseという名前のディレクトリに配置された jar ファイルにパックする独自のbuild.xmlファイルがあります。

メイン プロジェクトCrystalIceGUIには、initという名前のターゲットを含むbuild.xml ant ファイルがあり、 ShellExtBridge依存プロジェクトのbuild.xmlファイルを実行してこのプロジェクトをビルドし、後で別のターゲットでその jar を使用しようとします。

問題は、 ShellExtBridgeの build.xml ant スクリプトを実行するとうまく動作し、jar ファイルがReleaseディレクトリに正しく作成されることです(したがって、この ant スクリプトは問題ないと思います)が、build.xmlから呼び出すとメインプロジェクトでは、長い一連のエラーが発生します。

これは、 ShellExtBridge依存プロジェクトのbuild.xmlです。

<?xml version="1.0"?>
<project default="default">

    <!-- ============================================ -->
    <!-- Load build properties                        -->
    <!-- ============================================ -->

    <property name="project.buildfile" value="build.num" />
    <property file="${project.buildfile}" />
    <property file="info.properties" />


    <!-- ============================================ -->
    <!-- The default target                           -->
    <!-- ============================================ -->

    <target name="default" depends="jar" />

    <!-- Elimina le cartelle contenenti le classi compilate ed i jar -->
    <target name="clean">
        <echo message="Into ShellExtBridge build.xml clean target"/>
        <delete dir="../Release" />
        <!-- Elimina directory del jar finale -->
        <delete dir="bin" />
        <!-- Elimina directory delle classi compilate -->
    </target>


    <!-- Contiene i task di COMPILAZIONE: 
         1) Crea la directory "bin/" nel progetto
         2) Compila tutte le classi dentro la cartella "src" del progetto e mette i risultanti .class
            dentro "bin"
    -->
    <target name="compile" depends="clean">
        <echo message="Into ShellExtBridge build.xml compile target"/>
        <mkdir dir="bin" />
        <javac srcdir="src" destdir="bin" />
    </target>

    <target name="jar" description="Packs classes of shellextbridge" depends="compile">
        <echo message="Into ShellExtBridge build.xml jar target"/>
        <jar destfile="../Release/shellExtBridge.jar" index="false">
            <fileset dir="bin" />
            <manifest>
                <attribute name="Created-By" value="${info.software.author}" />
                <attribute name="Main-Class" value="com.techub.crystalice.rmi.Main" />
            </manifest>
        </jar>

    </target>

</project>

これは、メイン プロジェクトCrystalIceGUIのbuild.xmlファイルのinitターゲットです。

<target name="init">


        <ant antfile="${basedir}../../../ShellExtBridge/Project/build.xml" />
</target>

この ant スクリプトのinitターゲットを実行しようとすると、次のエラーが発生します。

Buildfile: /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/build.xml
init:
clean:
     [echo] Into ShellExtBridge build.xml clean target
   [delete] Deleting directory /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/bin
compile:
     [echo] Into ShellExtBridge build.xml compile target
    [mkdir] Created dir: /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/bin
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/ShellExtBridge/Project/build.xml:37: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 117 source files to /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/bin
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/src/com/techub/crystalice/utils/QuickLocale.java:8: package org.apache.log4j does not exist
    [javac] import org.apache.log4j.Logger;
    [javac]                        ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/src/com/techub/crystalice/fuse/AtmosFuseWrapper.java:8: package org.apache.log4j does not exist
    [javac] import org.apache.log4j.Logger;
    [javac]                        ^
    [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/src/com/techub/crystalice/fuse/AtmosFuseWrapper.java:11: package com.techub.crystalice.jaxb.settings does not exist
    [javac] import com.techub.crystalice.jaxb.settings.DriveType;
    [javac] 
...............................................................................
...............................................................................
ETCETCETC MANY OTHERS SIMILAR ERRORS
...............................................................................
...............................................................................
BUILD FAILED
/home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/build.xml:70: The following error occurred while executing this line:
/home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/ShellExtBridge/Project/build.xml:37: Compile failed; see the compiler error output for details.

ご覧のとおり、この ant スクリプトのエコー メッセージが表示されているため、依存関係のShellExtBridgeプロジェクトのbuild.xml ant スクリプトが呼び出されているようです。

しかし、ShellExtBridgeの build.xml スクリプトが呼び出されたときに次の操作が実行されるため、奇妙なことがあります。

[echo] Into ShellExtBridge build.xml clean target [delete] Deleting directory /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/bin compile: [echo] Into ShellExtBridge build.xml compile target [mkdir] Created dir : /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/bin [javac] /home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/ShellExtBridge/Project/build.xml:37: 警告: 'includeantruntime'は設定されていませんでした。デフォルトは build.sysclasspath=last; です。繰り返し可能なビルドの場合は false に設定

ShellExtBridgeプロジェクト内の bin ディレクトリに関連する正しいディレクトリではなく、このディレクトリ/home/andrea/Documenti/XCloud/Implementazione/CrossPlatform/CrystalIceGUI/Project/binを削除します。

ShellExtBridgeプロジェクトの ant ファイルを呼び出すと、その参照が失われ、適切なプロジェクトではなくメイン プロジェクトのフォルダーに対して操作が行われるようです。

それを解決するためのアイデアはありますか?

4

2 に答える 2

1

dirまたはオプションだけを単独で動作させることはできませんでしたuseNativeBasedir(Ant 1.9.3 を使用)。inheritall="false"sub-Ant ビルドで正しい basedir を使用するには、dir オプションを指定して指定する必要がありました。

<target name="stage" depends="init">
    <ant antfile="../otherproject/build.xml" inheritall="false" dir="../otherproject">
</target>
于 2014-08-13T19:17:33.027 に答える
1

修正するのはとても簡単だと思います。タスクは<ant>、属性を指定しない限り、現在のディレクトリを作業ディレクトリとして使用しdirます (さらに、実行するターゲット ファイルの名前が build.xml の場合は、antfile プロパティを省略できます)。

だから、ここで私が提案する初期化ターゲット:

<target name="init">
    <ant dir="${basedir}../../../ShellExtBridge/Project" />
</target>

dir プロパティに関する公式ドキュメントは次のとおりです。

dir: 新しい Ant プロジェクトの basedir として使用するディレクトリ (useNativeBasedir が true に設定されていない場合)。inheritall が false に設定されていない限り、現在のプロジェクトの basedir にデフォルト設定されます。 false に設定されている場合、デフォルト値はありません。これにより、呼び出されたプロジェクトの basedir 設定が上書きされます。また、antfile および出力属性の値 (存在する場合) を解決するためのディレクトリとしても機能します。

于 2013-10-14T19:42:52.223 に答える