基本上,我試圖運行一個使用ANT構建文件創建的JAR文件。該程序需要使用外部jar才能正確編譯。我已經將它包含在JAR清單的類路徑中。一旦運行它吐出堆棧跟蹤讓我知道它找不到主要類。ClassNotFoundException:通過ANT構建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的jar文件\ gatech \ OAD \ antlab \ pkg1在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
你的AntLabMain包含一個public static void main(String [] args)方法嗎? – mazaneicha
是的,AntLabMain.java包含一個主要方法。它什麼都沒做,只是打印出一大堆文字,表示我們已經完成了作業。但是,它依賴於resources.jar,我將它包含在classpath中。 – msandt3