1

次のプロジェクト構造があります。

プロジェクトディレクトリ
-src
-lib
-データ

srcは Java ソース ファイルであり、lib私のプロジェクトで使用するいくつかの外部 JAR がdata含まれており、プログラムがデータの保存と参照に使用するさまざまなテキスト ファイルが含まれています。これまで、私はすべての開発を IDE で (明らかに) 行ってきましたが、すべて問題ありませんでしたが、コードをコンパイルし (クラスパスに JAR を使用)、データを使用して実行できるビルド ファイルを作成しようとしています。ファイル。ANT でビルドを行ってからしばらく経っているので、これは単純な問題だと確信していますが、ビルド スクリプトを正しく動作させることができません。

以下は、ant ファイルです。

<project name="CMSC491Project" basedir="." default="main">

    <property name="src.dir"     value="src"/>

    <property name="build.dir"   value="build"/>
    <property name="classes.dir" value="${build.dir}/classes"/>
    <property name="jar.dir"     value="${build.dir}/jar"/>
    <property name="lib.dir"     value="lib"/>

    <property name="main.class"  value="parse.Driver"/>
    <property name="args"     value="?"/>



    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <fileset id="lib" dir="${lib.dir}">
        <include name="*.jar"/>
    </fileset>

    <path id="build.classpath">
        <fileset refid="${lib.dir}"/>
    </path>

    <target name="compile">
        <mkdir dir="${classes.dir}"/>

        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="build.classpath"/>
    </target>

    <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
        <attribute name="Class-Path" value="${lib.dir}/javahash ${lib.dir}/twitter4j-core-2.2.5 ${lib.dir}/twitter4j-stream-2.2.5"/>
            </manifest>
        </jar>
    </target>

    <target name="clean-build" depends="clean,jar"/>

    <target name="main" depends="clean,jar"/>

    <target name="run" depends="compile" description="run the project">
        <java dir="${classes.dir}" classname="${main.class}" fork="yes">
            <arg line="${args}"/>
        </java>
    </target>

</project>

正常にコンパイルされますが、試してみるant runと、Java がデータ ディレクトリの JAR の 1 つからクラスの 1 つを見つけることができないというエラーが表示されます。

何をする必要があるのか​​ わかりませんが、事前に感謝します。

4

2 に答える 2

2

Ant タスクで使用dirします。javaこれにより、JVM はそのディレクトリでプロセスを呼び出すように指示されます。こちらのドキュメントをご覧ください。jarまたはclasspath属性を介してjarを参照する必要があります。ビルド構成を次のように変更してみてください。

<path id="build.classpath">         
    <fileset refid="lib"/>
    <fileset dir="${classes.dir}"/>     
</path>

<target name="run" depends="compile" description="run the project">
    <java classpathref="build.classpath" classname="${main.class}" fork="yes">
        <arg line="${args}"/>
    </java>
</target>

EDIT (コンパイルに classpathref を含める)

于 2012-05-13T04:41:11.960 に答える
0

実行可能 jar が依存する jar への正しい相対リンクを指定していません。jar は次の場所にあります。

build/jar

そして、次の場所でjarを見つけることができません(マニフェストの「クラスパス」から取得してください):

build/jar/lib/??.jar

この問題を解決する最善の方法は、ANT のmanifestclasspathタスクを使用することです。

<manifestclasspath property="jar.classpath" jarfile="${jar.dir}/${ant.project.name}.jar">
    <fileset dir="lib" >
        <include name="*.jar"/>
    </fileset>
</manifestclasspath>

<jar jarfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
   <manifest>
      <attribute name="Main-Class" value="${main-class}"/>
      <attribute name="Class-Path" value="${jar.classpath}"/>
   </manifest>
</jar>

これがすべてセットアップされたら、次のようにjarを実行します。

<java dir="${classes.dir}" jar="${jar.dir}/${ant.project.name}.jar" fork="yes">
    <arg line="${args}"/>
</java>

jar を実行するには 2 つの方法があります。jarパラメータを使用して、classnameを使用してメイン クラスを指定します。

jarパラメータのみが、jar ファイルのマニフェストに埋め込まれたクラスパスを使用します。クラスパスを使用する場合は、それを指定する必要があります。

最後に、この jar をどのように配布するかを検討する必要があります。jar を他の人に渡す場合は、jar への次の相対パスにあるディレクトリに依存関係を配置する必要があります。

../../lib
于 2012-05-13T13:00:54.990 に答える