2012-05-13 34 views
0

でコンパイルした後、Javaコードを実行できませんプログラムがデータの保存と参照に使用するさまざまなテキストファイル。今まで私はすべての開発を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ファイルのいずれかからのクラスのものを見つけることができないというエラーを取得します。

私に何が必要なのかよく分かりませんが、事前に感謝しています。

答えて

2

あなたはjavaのantタスクでdirを使用します。これは、JVMがそのディレクトリ内のプロセスを呼び出すように指示します。ドキュメントhereをご覧ください。あなたは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を含める)

+0

Hiに、次の相対パスに配置されているディレクトリにある依存関係を持っている必要があります、私は、これはあまりにも問題になるかもしれないと思ったが、これらの変更を反映するようにビルドファイルを変更したところ、同じ問題が発生しました。 –

+0

Javaソースファイルをコンパイルする際に 'classpathref'を使用しています。 classpathrefは '$ {lib.dir}'を参照しています。これはjavaアプリケーションを実行する際にclasspathにも含める必要があります。私は私の答えを更新します。 –

0

あなたが実行可能なjarファイルが依存するjarファイルへの正しい相対リンクを指定していない:にビルド構成を変更してみてください。この問題を解決するための最善の方法を

build/jar/lib/??.jar 

build/jar 

をし、それが次の場所(マニフェストで「クラスパス」からテイク)でのjarファイルを見つけることができません:あなたのjarファイルは次の場所にあります。このすべては、次のようにjarファイルを実行して、セットアップしたら

<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> 

:ANTのmanifestclasspathタスクを使用することである

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

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

パラメータjarパラメータは、jarファイルマニフェストに埋め込まれたクラスパスを使用します。 クラスパスを使用すると、強制的に指定することになります。

最後に、このjarファイルの配布方法を検討する必要があります。あなたが他の誰かに瓶を与えた場合、彼らは瓶

../../lib 
+0

こんにちは、実行ターゲットを2番目のビルドブロックのantコードに置き換え、​​の上にマニフェストクラスパスを追加しましたが、「ルート要素に続く文書のマークアップは整形式でなければなりません。 "fileset dir =" lib ">" –

+0

@THEMANGOこれはXML検証の問題です。私は二重チェックして、上記で提供したXMLがうまく構成されています。私はUNIXプログラム "xmllint"を使ってエラーの詳細を表示することをお勧めします。 –

関連する問題