基本上我正在尝试运行我使用ANT构建文件创建的JAR文件。程序需要使用外部jar才能正确编译。我已将它包含在JAR清单的类路径中。在运行它时会吐出一个堆栈跟踪,让我知道它无法找到主类。
堆栈跟踪如下:
[java] java.lang.NoClassDefFoundError: $edu/gatech/oad/antlab/pkg1/AntLabMain
[java] Caused by: java.lang.ClassNotFoundException: $edu.gatech.oad.antlab.pkg1.AntLabMain
[java] at java.net.URLClassLoader$1.run(Unknown Source)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at java.net.URLClassLoader.findClass(Unknown Source)
[java] at java.lang.ClassLoader.loadClass(Unknown Source)
[java] at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
[java] at java.lang.ClassLoader.loadClass(Unknown Source)
[java] Could not find the main class: $edu.gatech.oad.antlab.pkg1.AntLabMain. Program will exit.
[java] Exception in thread "main"
[java] Java Result: 1
但是当我检查\ edu \ gatech \ oad \ antlab \ pkg1下的jar文件时,AntLabMain.class就在那里。奇怪。
我将在下面包含XML源代码,说实话我不确定导致问题的原因。我最好的猜测是我对JAR文件的方式有问题,但我已经看了好几个小时,看不到尽头。
<project name="My Buildfile" default="all" basedir=".">
<target name="init" depends="prepare" description="Initialize and set up properties">
<property name="src.dir" location="./src/" />
<property name="build.dir" location="build" />
<property name="library.dir" location="lib" />
<property name="apidoc.dir" location="apidoc" />
</target>
<target name="prepare" description="Making required directories">
<mkdir dir="build" />
<mkdir dir="apidoc" />
</target>
<target name="compile" depends="init" description="Compiling necessary files">
<javac destdir="${build.dir}" includeantruntime="first">
<src path="${src.dir}" />
<classpath>
<pathelement path="${build.dir}" />
<fileset dir="${library.dir}" includes="**/*.jar" />
</classpath>
</javac>
</target>
<target name="javadoc" depends="init" description="Generating useful javadocs">
<javadoc sourcepath="${src.dir}" access="public" destdir="${apidoc.dir}">
<fileset dir="${src.dir}">
<include name="**/*.java" />
</fileset>
<classpath>
<fileset dir="${library.dir}" includes="**/*.jar" />
</classpath>
</javadoc>
</target>
<target name="jar" depends="compile" description="JARing files for distribution">
<jar destfile="${build.dir}/AntLabRun_Test.jar" basedir="${build.dir}" excludes="**/*.jar">
<manifest>
<attribute name="Main-Class" value="edu.gatech.oad.antlab.pkg1.AntLabMain" />
<attribute name="Class-Path" value="${library.dir}\resources.jar" />
</manifest>
</jar>
</target>
<target name="run" depends="jar" description="Now running the program">
<java jar="${build.dir}/AntLabRun_Test.jar" fork="true">
<classpath>
<fileset dir="${library.dir}" includes="**/*.jar" />
</classpath>
</java>
</target>
<target name="all" depends="run" description="Doing EVERYTHING!">
</target>
<target name="clean" depends="init" description="Cleaning Directories">
<delete dir="${build.dir}" />
<delete dir="${apidoc.dir}" />
</target>
最后,我将包含使用JAR压缩的清单
这是我对Ant构建文件的第一次尝试,所以我对它们并不熟悉。希望我已经提供了足够的信息来推动这场比赛。
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_21-b07 (Sun Microsystems Inc.)
Main-Class: edu.gatech.oad.antlab.pkg1.AntLabMain
Class-Path: C:\Users\Mike Sandt\workspace\M4\lib/resources.jar
答案 0 :(得分:1)
查看您的清单文件,似乎Main-Class
属性在类名前面有一个额外的$。尝试删除它,重新编译jar,然后再次执行它。
另外,如果您计划在其他计算机上运行此jar,则可以考虑将清单文件中的Class-Path
属性更改为相对路径。
答案 1 :(得分:1)
事实证明答案很简单。我需要编辑我的init目标,将属性设置为值而不是位置。
即
<target name="init" depends="prepare" description="Initialize and set up properties">
<property name="src.dir" location="./src/" />
<property name="build.dir" value="build" />
<property name="library.dir" value="lib" />
<property name="apidoc.dir" value="apidoc" />
</target>
谢谢大家的回复。
答案 2 :(得分:0)
作为最后的手段,您可以在构建文件夹中提取resources.jar(而不是将其包含在类路径中)并再次生成您的jar文件(使用从其中包含的resources.jar中提取的文件)。
答案 3 :(得分:0)
其他人已经指出了类名的$问题。
问题,您的AntLabMain类是否具有在加载类时运行的任何静态初始化程序?如果是这样,并且如果其中一个初始化程序失败,那么JVM将报告找不到AntLabMain类,因为它无法加载它。这是错误的错误,但你会看到。
因此,如果您在类中进行了静态初始化,请检查以确保所有这些都正常工作。