2009-10-15 17 views
16

Javaプログラムを実行する際に問題があります(サードパーティ製のJARを使用しています)。私はそれをコンパイルすることはできますが、私が蟻で実行目標を呼び出すとき、クラスパスで実行されたクラスを見つけることができないと言います。antでクラスパスを設定する際の問題

<project basedir="." default="build"> 
<property name="build" value="build" /> 
<property name="src" value="." /> 
<property name="lib" value="lib" /> 

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

<target name="build"> 
    <javac srcdir="${src}" destdir="${build}"> 
     <classpath refid="classpath" /> 
    </javac> 
</target> 

<target name="run"> 
    <java classname="FirstClass"> 
     <classpath refid="classpath" /> 
    </java> 
</target> 

は、誰もが私が間違っているかもしれないものを知っています:ここに私のbuild.xmlは次のようになりますか? - あなたのパスにlibの相対ディレクトリ内の唯一のjarファイルが読み込まなっている

ant run Buildfile: build.xml 

run: 
[java] Could not find GuiStarter. Make sure you have it in your classpath 
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:138) 
[java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:764) 
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:218) 
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:132) 
[java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:105) 
[java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) 
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
[java] at java.lang.reflect.Method.invoke(Method.java:616) 
[java] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
[java] at org.apache.tools.ant.Task.perform(Task.java:348) 
[java] at org.apache.tools.ant.Target.execute(Target.java:357) 
[java] at org.apache.tools.ant.Target.performTasks(Target.java:385) 
[java] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337) 
[java] at org.apache.tools.ant.Project.executeTarget(Project.java:1306) 
[java] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
[java] at org.apache.tools.ant.Project.executeTargets(Project.java:1189) 
[java] at org.apache.tools.ant.Main.runBuild(Main.java:758) 
[java] at org.apache.tools.ant.Main.startAnt(Main.java:217) 
[java] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257) 
[java] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104) 
[java] Java Result: -1 

BUILD SUCCESSFUL Total time: 1 second 
+0

srcディレクトリ内に含まれるlibディレクトリですか?別のsrcディレクトリがbasedirとして使用され、libがsrcと同じレベルにある場合は、basedirを作成し、sourceディレクトリとしてプロパティsrcを指定する必要があります。あるいは、Antスクリプトを1つのディレクトリに移動することもできます。 –

+0

ソースでデフォルトパッケージを使用していますか?そうでなければ、おそらく "**/*。class"をクラスパスに含める必要があります。 –

答えて

3

それは方法:


ここにアリからの私のスタックトレースです。そこに第三者の瓶がありますか?コンパイル時には必要ないが実行時には欠けている実行時ライブラリがあります。 stacktraceを投稿すると、私はさらに教えてあげます:)

+0

stacktraceがこのコメントに収まりませんでしたので、私はこの質問に答えました。 – David

+0

Hm - GuiStarterはパッケージを持たないクラスを持っているようです(あなたのものですか?)その場合、トップレベルのディレクトリがクラスパスにあることを確認する必要があります – Bostone

+0

! 3年後でも:) –

5

私はこの問題があなたのclasspathパス宣言にあると思います。 buildディレクトリには、私はあなたのclasspath REFIDの3サードパーティのjarファイルのみが含まれるであろう、また<pathelement>

<path id="classpath"> 
    <fileset dir="${lib}"> 
     <include name="**/*.jar" /> 
    </fileset> 
    <pathelement location="${build}" /> 
</path> 

でなければなりません。だからブロック全体が見える。

<path id="3rd-party-classpath"> 
    <fileset dir="${lib}"> 
     <include name="**/*.jar" /> 
    </fileset> 
</path> 

<target name="build"> 
    <javac srcdir="${src}" destdir="${build}"> 
     <classpath refid="3rd-party-classpath" /> 
    </javac> 
</target> 

<target name="run"> 
    <java classname="FirstClass"> 
     <classpath> 
     <pathelement location="${build}" /> 
     <path refid="3rd-party-classpath" /> 
     </classpath> 
    </java> 
</target> 

また、DroidIn.netが指摘しているように、あなたのプログラム用のパッケージを作成する必要があります。

+0

私は同意する - 私は "pathelement"それはあなたがクラスのために使用するものだと思う – Bostone

+0

これらの変更で、私はjava.lang.NoClassDefFoundError:com/sun/media/codec/audio/AudioCodec例外をGuiStarterが見つかりませんでした。あなたのクラスパスエラーでそれを持っていることを確認してください。 このプロジェクトでは、jarファイルをant libディレクトリに置く方が簡単だと思います。 – David

+0

jarをant libディレクトリに入れないでください。第三者のツールが上記のライブラリに依存しているようです。たぶんこれは正しい方向にあなたを指し示しますhttp://ubuntuforums.org/archive/index.php/t-351989.html –

0

これを試してみると、私のクラスを実行することができました。

<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="main-class" value="sample.Sample" /> 

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

<path id="classpath"> 
    <fileset dir="${jar.dir}"> 
     <include name="*.jar" /> 
    </fileset> 
    <fileset dir="${classes.dir}"> 
     <include name="/*.class" /> 
    </fileset> 
</path> 

<target name="compile"> 
    <mkdir dir="${classes.dir}" /> 
    <javac srcdir="${src.dir}" destdir="${classes.dir}"> 
     <classpath refid="classpath" /> 
    </javac> 
</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}" /> 
     </manifest> 
    </jar> 
</target> 

<target name="run" depends="jar"> 
    <java classname="${main-class}"> 
     <classpath refid="classpath" /> 
    </java> 
</target> 

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

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

関連する問題