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
Could not find the main class error with Ant
提问by gsingh2011
It's my first time using Ant and I'm getting a java.lang.NoClassDefFoundError
Exception 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 classpath
element 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 java
task 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>