2012-04-30 93 views
0

這是我第一次使用Ant,並在運行時遇到java.lang.NoClassDefFoundError異常。這裏是我的螞蟻生成腳本,找不到Ant的主類錯誤

<project name="LearnKirtan" basedir="." default="main"> 

    <property name="src.dir" value="src" /> 
    <property name="lib.dir" value="lib" /> 

    <property name="build.dir" value="build" /> 
    <property name="classes.dir" value="${build.dir}/classes" /> 
    <property name="jar.dir" value="${build.dir}/jar" /> 

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

    <property name="main-class" value="gsingh.learnkirtan.Main" /> 

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

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

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

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

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

</project> 

該版本沒有提供任何錯誤。運行目標給出例外。我檢查的jar文件清單生成,它看起來像這樣,

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.2 
Created-By: 1.6.0_30-b12 (Sun Microsystems Inc.) 
Main-Class: gsingh.learnkirtan.Main 

回答

4

你運行目標看起來有點靠不住的<java classname="${main-class}" fork="true" />是自閉,所以classpath元素從未使用過

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

可能適合你。

1

問題是您沒有正確指定java任務的類路徑。

試試這個:

<java classname="${main-class}" fork="true"> 
    <classpath> 
     <path refid="classpath" /> 
     <path location="${jar.dir}/${ant.project.name}.jar" /> 
    </classpath> 
</java> 
0

和我有可能出現的問題。我的腳本如下:

<java classname="SchedulerManager" fork="true"> 
      <jvmarg value="-Ddb.username=${db.user}"/> 
      <jvmarg value="-Ddb.password=${db.password}"/> 
      <jvmarg value="-Ddb.url=${db.url}"/> 

      <classpath> 
      <pathelement location="${tomcat.home}/webapps/${project.war}-admin/WEB-INF/lib/${jar_name}"/> 
      <pathelement path="com.${company}.${project}.scheduler.SchedulerManager"/> 
      </classpath> 
     </java> 

當我跑,我得到以下錯誤:

[java] Exception in thread "main" java.lang.NoClassDefFoundError: com/<company>/<project>/scheduler/SchedulerManager 
[java] Caused by: java.lang.ClassNotFoundException: com.<company>.<project>.scheduler.SchedulerManager 
[java]  at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
[java]  at java.security.AccessController.doPrivileged(Native Method) 
[java]  at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
[java]  at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
[java]  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
[java]  at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
[java] Could not find the main class: com.<company>.<project>.scheduler.SchedulerManager. Program will exit. 
[java] Java Result: 1 

但是,如果我的CD文件夾 「${tomcat.home}/webapps/${project.war}-admin/WEB-INF/lib/」 並運行:

java -cp "*" -Ddb.username=${db.user} -Ddb.password=${db.password} -Ddb.url=${db.url} com.<company>.<project>.scheduler.SchedulerManager (of course I gave real parameters) 

它的工作!

0

最後決定已被發現!我們用以下方式重寫劇本:

<path id="master-classpath"> 
    <fileset dir="${tomcat.home}/webapps/${project.war}-admin/WEB-INF/lib"> 
     <include name="*.jar"/> 
    </fileset> 

    <fileset dir="${workspace.path}/artifacts"> 
     <include name="${jar_name}"/> 
    </fileset> 

    <fileset dir="${workspace.path}/deploy_scripts/libs/app"> 
     <include name="${jdbc_jar_name}"/> 
    </fileset> 
    </path> 
    <java classname="com.${company}.${project}.scheduler.SchedulerManager" fork="true"> 
     <jvmarg value="-Ddb.username=${db.user}"/> 
     <jvmarg value="-Ddb.password=${db.password}"/> 
     <jvmarg value="-Ddb.url=${db.url}"/> 

     <classpath refid="master-classpath"/> 
    </java>