3

「lib」フォルダー内の3つのjarファイルに依存する「src」フォルダー内に多数の.javaファイルがあります。次のbuild.xmlファイルがあります。

<?xml version="1.0"?>
<project name="MyProj" basedir=".">
 <property name="src"   value="src"/>
 <property name="build" value="build"/>
 <property name="lib"   value="lib"/>


 <path id="master-classpath">
   <fileset dir="${lib}">
     <include name="activemq-all-5.1-SNAPSHOT.jar"/>
     <include name="geronimo-jms_1.1_spec-1.1.1.jar"/>
     <include name="activemq-core-5.3.0.jar"/>
   </fileset>
 </path>

 <javac destdir="${build}">
   <src path="${src}"/>
   <classpath refid="master-classpath"/>
 </javac>

</project>

これは正常にコンパイルされますが、実行しようとすると、

"java.lang.NoClassDefFoundError:javax / jms / Destination"

ただし、Eclipseを使用してビルドパスにjarを含めると、このプログラムは正常に実行およびコンパイルされます。

編集:それで、私はjarファイルをコンパイルされたクラスがあるフォルダーにコピーしました。mainメソッドを持つクラスはNDriver.classです。私が試してみると:

java -classpath ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar NDriver

これは与える:

スレッド「メイン」の例外java.lang.NoClassDefFoundError:NDriver

助けていただければ幸いです。

4

4 に答える 4

3

アプリケーションを実行するときは、コンパイル時に使用されるjarファイルをクラスパスに配置する必要があります。残念ながら、実際にどのように実行しているかについての詳細を提供しなかったため、より多くのガイダンスを提供することは困難です。

更新:コンパイルされたクラスを含むディレクトリもクラスパスに追加する必要があります。javaコンパイルされたクラスを含むディレクトリから起動する場合は、を使用.して現在のディレクトリを指定できます。以下に示すようにクラスパスに追加して、javaそこでもクラスを探すように指示します(.直後に追加しましたactivemq-all-5.1-SNAPSHOT.jar)。

java -classpath ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar:. NDriver
于 2009-12-22T23:05:44.677 に答える
1

片道(あなたの変数とは少し異なる変数)

<path id="classpath">
    <fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>

<manifestclasspath property="manifest.classpath" jarfile="${jarfile}">
    <classpath refid="classpath"/>
</manifestclasspath>

<target name="jar" depends="compile" description="create the jar">
    <jar destfile="${jarfile}" basedir="${build.dir}">
        <manifest>
            <attribute name="Manifest-Version" value="${manifest-version}"/>
            <attribute name="Created-By" value="${ant.java.version}"/>
            <attribute name="Main-Class" value="${main-class}"/>
            <attribute name="Class-Path" value="${manifest.classpath}"/>
        </manifest>
    </jar>
</target>

もちろん、ここでは、jarを作成して実行していることを前提としています(そこのクラスパスを含む)。別のオプションは、タグを使用し、そこでクラスパスを明示的に使用runするターゲットを持つことです。<java>

于 2009-12-22T23:03:09.033 に答える
1

プログラムを実行すると、ライブラリjarがクラスパスに含まれますか?Eclipseはこれらを自動的に追加しますが、コマンドラインからプログラムを実行するときに指定する必要があります。

于 2009-12-22T23:08:35.700 に答える
0

私の経験から、Eclipseは、クラスパス宣言を明示的に使用せずに、クラスパスにクラスとjarを含めることが多いようです。実際、Eclipseのビルドからクラスを削除するのは非常に難しい場合があります(クラスを削除またはクリーンアップする必要があります)。

于 2009-12-22T23:06:33.927 に答える