2009-12-22 138 views
3

我在「src」文件夾中有一堆.java文件,這些文件夾依賴於「lib」文件夾中的三個罐子。我有以下build.xml文件:如何在包含多個jar的類路徑中使用ant?

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

該程序運行和編譯很好,當我使用包括在BuildPath罐子Eclipse,但是。

編輯:所以我複製到具有編譯類的文件夾的罐子。主要方法的類是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

這給:

Exception in thread "main" java.lang.NoClassDefFoundError: NDriver

我會很感激的任何幫助。

回答

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

如果您使用的是Java 6,並且罐子都在同一個目錄中,那麼您也可以使用通配符。例如:java -cp ./* :. NDriver –

2

的一種方式(稍有不同的變量比你)

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

當然在這裏我假設你正在創建一個罐子並運行它(包括類路徑那裏)。另一種選擇是使用<java>標記的run目標,並在其中顯式使用類路徑。

0

從我的經驗看來Eclipse將通常包括在類路徑中的類和JAR而不顯式使用類路徑聲明。事實上,從Eclipse的構建中刪除類有時很難(它們必須被刪除或清除)。

1

運行程序時庫類庫是否包含在類路徑中? Eclipse會自動添加這些,但是當您從命令行運行程序時需要指定它們。

相關問題