2012-04-30 11 views
0

Antを初めて使用しましたが、実行しようとするとjava.lang.NoClassDefFoundError例外が発生します。ここに私のAntビルドスクリプトがあります。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> 

ビルドにエラーはありません。 runターゲットは例外を与えます。 Iあなたの実行ターゲットが少しグラグラに見える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> 

そして、私が実行したときに、私は次のエラーを取得:フォルダに "${tomcat.home}/webapps/${project.war}-admin/WEB-INF/lib/" を

[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の場合は以下を実行します。

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> 
関連する問題