为什么我必须在ANT中使用classname?

时间:2011-02-25 07:10:04

标签: java ant jar

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

为什么我不能使用像

这样的东西
   <java jar="build/jar/HelloWorld.jar" fork="true" >
          <classpath>
             <path refid="classpath"/>  
            <path location="${jar.dir}/${ant.project.name}.jar"/>   
  </classpath> 
   </java> 

我收到了错误

 [java] java.lang.NoClassDefFoundError: org/apache/log4j/Logger
 [java]     at oata.HelloWorld.(Unknown Source)
 [java] Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger

2 个答案:

答案 0 :(得分:4)

根据java task documentation,您的第二个示例应该按预期工作(除了classpath将被忽略)。

修改:您在问题中添加的信息意味着以下几点:

  1. 找到.jar文件
  2. 它的清单中有正确的Main-Class条目
  3. 您的申请需要log4j
  4. 指向Class-Path文件的正确log4j.jar条目
  5. 基本上java ant任务与在命令行上使用java -jar具有相同的要求:如果使用.jar命令无法正确运行java -jar myApp.jar文件然后,java Ant任务将无法正常工作。

    编辑2:无论何时直接在Java中调用.jar文件,都无法以任何方式指定其他类路径。当您使用java -jar myApp.jar时也是如此,当java Ant任务与jar属性一起使用时也是如此。这意味着.jar文件本身必须具有正确的Class-Path条目。

答案 1 :(得分:1)

然后,如果yopu有多个主类并且你没有清单中的条目,那么java将如何知道你打算运行哪个类名。使用classname属性来运行主类。