2013-12-17 64 views
1

它又是我。 我一直在嘗試使用ant腳本將Java項目創建爲可運行的jar。 這是我的build.xml螞蟻在建立可運行的罐子時卡住了

<project name="simple-app" 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="app.App" /> 

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

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

<target name="compile"> 
    <mkdir dir="${classes.dir}"/> 
    <javac source="1.7" target="1.7" includeantruntime="false" srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" /> 
</target> 

<target name="jar" depends="compile"> 
    <mkdir dir="${jar.dir}" /> 
    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}" includes="*.class"> 
     <manifest> 
      <attribute name="Main-Class" value="${main-class}" /> 
     </manifest> 
    </jar> 
</target> 


<target name="run" depends="jar"> 
    <java classname="${main-class}"> 
     <classpath> 
      <path refid="classpath" /> 
      <path location="${jar.dir}/${ant.project.name}.jar" /> 
     </classpath> 
    </java> 
</target> 

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

一切順利,但是當它到達「運行」它卡住。終端說跑步:沒有任何反應。等了30分鐘,什麼都沒有。我嘗試了很多其他的選項,我在互聯網上發現了這些選項,但是這些選項會導致相同的延遲,或拋出ClassNotFoundException。

我真的不知道該怎麼做。當我用Eclipse製作文件時,一切正常。任何人都可以幫助我?這可能是非常愚蠢的事情,但我只是看不到它。 非常感謝。

+0

您是否嘗試手動運行.jar?它工作嗎? – dimoniy

+0

你到底是怎麼做到的?對不起,一直在尋找這個3-4小時,所以我慢一點。 – user2950356

+1

你有你的jar文件作爲「罐子」目標的結果。試着從命令行運行它。 http://docs.oracle.com/javase/tutorial/deployment/jar/run.html只需要小心地將所有的依賴包括在類路徑中。 – dimoniy

回答

2

要修復ClassNotFoundException異常,您需要將類路徑包含在jar的清單中。該manifestclasspath任務來非常有用:

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

    <manifestclasspath property="jar-classpath" jarfile="${jar.dir}/${ant.project.name}.jar"> 
     <classpath refid="classpath" /> 
    </manifestclasspath> 

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

這使您可以調用的jar如下:

<java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/> 

或命令行:

java -jar /path/to/myproject.jar 

這到底可能無法解釋爲什麼你的構建掛起....是否有可能代碼進入等待狀態?