java 找不到 Ant 的主类错误

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10390488/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 00:50:43  来源:igfitidea点击:

Could not find the main class error with Ant

javaantbuildnoclassdeffounderrorbuild-script

提问by gsingh2011

It's my first time using Ant and I'm getting a java.lang.NoClassDefFoundErrorException when it tries to run. Here is my Ant build script,

这是我第一次使用 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>

The build gives no errors. The run target gives the exception. I've checked the manifest generated in the jar file and it looks like this,

构建没有错误。运行目标给出了异常。我检查了 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

回答by Kodi

Your run target looks a bit wonky, the <java classname="${main-class}" fork="true" />is self closing, so the classpathelement is never used

您的运行目标看起来有点不稳定,它<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>

May work for you.

可能为你工作。

回答by Tim Bender

The problem is that you are not specifying the classpath for the javatask properly.

问题是您没有java正确指定任务的类路径。

Try this:

试试这个:

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

回答by Alexander

And I have the likely problem. My script is the following:

我有可能的问题。我的脚本如下:

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

And when I run, I get the following error:

当我运行时,出现以下错误:

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

But if I CD to the folder "${tomcat.home}/webapps/${project.war}-admin/WEB-INF/lib/" and run:

但是如果我 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)

it worked!

有效!

回答by Alexander

And finally the decision has been found! We rewritten the script in the following way:

终于找到了决定!我们用以下方式重写了脚本:

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