![](/img/trans.png)
[英]Could not find or load main class- I cannot run my .jar file created from Ant
[英]Cannot find Main Class in File Compiled With Ant
我在Eclipse中編譯並運行程序,並且一切正常,但是當我將其與Ant打包並運行時,出現以下錯誤:
Exception in thread "main" java.lang.NoClassDefFoundError: org/supercsv/io/ICsvB
eanReader
Caused by: java.lang.ClassNotFoundException: org.supercsv.io.ICsvBeanReader
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: jab.jm.main.Test. Program will exit.
請注意,這是運行時錯誤,而不是Ant的編譯器錯誤 。
我以前用0個問題構建了這個項目,現在當我在lib文件夾中添加第二個軟件包時,它突然對我起作用了 ?
這是供參考的構建文件:
<?xml version="1.0" ?>
<project name="ServerJar" default="dist" basedir=".">
<description>
Builds client files into .jar
</description>
<!-- [build variables] -->
<property name="src" location="src" />
<property name="build" location="build" />
<property name="dist" location="dist" />
<property name="lib" location="lib" />
<!-- [path to packages] -->
<path id="master-classpath">
<fileset dir="${lib}">
<include name="*.jar"/>
</fileset>
</path>
<target name="init">
<!-- makes time stamp to be used in jar name -->
<tstamp />
<!-- creates build directory structure -->
<mkdir dir="${build}" />
</target>
<target name="compile" depends="init" description="Compiles the source">
<!-- compiles the java code from ${src} into ${build} -->
<!-- <javac srcdir="${src}" destdir="${build}" /> -->
<javac destdir= "${build}">
<src path="${src}"/>
<classpath refid="master-classpath"/>
</javac>
</target>
<target name="dist" depends="compile" description="Generates distributable">
<!-- creates the distribution directory -->
<mkdir dir="${dist}/lib" />
<!-- puts everything in ${build} into the jar file -->
<jar jarfile="${dist}/lib/CC-${DSTAMP}.jar" basedir="${build}">
<manifest>
<attribute name="Main-Class" value="jab.jm.main.Test" />
</manifest>
</jar>
<!-- makes a jar file for quick test execution -->
<jar jarfile="${dist}/lib/CC.jar" basedir="${build}">
<manifest>
<attribute name="Main-Class" value="jab.jm.main.Test" />
</manifest>
</jar>
</target>
<target name="clean" description="Cleans up the extra build files">
<!-- deletes the ${build} and ${dist} directories -->
<delete dir="${build}" />
<delete dir="${dist}" />
</target>
</project>
先謝謝您的幫助!
編輯:
這是我的主類構造的樣子(這不是實際的文件,但這是我所基於的)。 對於Java程序,其構造非常奇怪,可能會給Ant一些問題。 關於如何重建這一點的任何建議? 嘗試將其分為多個部分時出現了很多錯誤。 我以前從未見過這樣的構造(是的,我知道它是如何工作的(並且在編譯時會起作用),但是Ant可能不喜歡它)。
import java.io.FileReader;
import java.io.IOException;
import org.supercsv.cellprocessor.Optional;
import org.supercsv.cellprocessor.ParseDate;
import org.supercsv.cellprocessor.ParseInt;
import org.supercsv.cellprocessor.constraint.StrMinMax;
import org.supercsv.cellprocessor.constraint.Unique;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvBeanReader;
import org.supercsv.io.ICsvBeanReader;
import org.supercsv.prefs.CsvPreference;
class ReadingObjects {
static final CellProcessor[] userProcessors = new CellProcessor[] {
new Unique(new StrMinMax(5, 20)),
new StrMinMax(8, 35),
new ParseDate("dd/MM/yyyy"),
new Optional(new ParseInt()),
null
};
public static void main(String[] args) throws Exception {
ICsvBeanReader inFile = new CsvBeanReader(new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE);
try {
final String[] header = inFile.getCSVHeader(true);
UserBean user;
while( (user = inFile.read(UserBean.class, header, userProcessors)) != null) {
System.out.println(user.getZip());
}
} finally {
inFile.close();
}
}
}
public class UserBean {
String username, password, town;
Date date;
int zip;
public Date getDate() {
return date;
}
public String getPassword() {
return password;
}
public String getTown() {
return town;
}
public String getUsername() {
return username;
}
public int getZip() {
return zip;
}
public void setDate(final Date date) {
this.date = date;
}
public void setPassword(final String password) {
this.password = password;
}
public void setTown(final String town) {
this.town = town;
}
public void setUsername(final String username) {
this.username = username;
}
public void setZip(final int zip) {
this.zip = zip;
}
}
請注意,該類的名稱實際上是UserBean,並且其中包含一個名為ReadingObjects的非公共類,其中包含主方法。
看起來您的運行時類路徑缺少包含類org.supercsv.io.ICsvBeanReader的jar。
該小問題 ,就是調用一個可執行的JAR,當你不能從命令行設置類路徑。 您必須在清單中進行如下設置:
<target name="dist" depends="compile" description="Generates distributable">
<!-- creates the distribution directory -->
<mkdir dir="${dist}/lib" />
<!-- Remove manifest. This jar will end up on the classpath of CC.jar -->
<jar jarfile="${dist}/lib/CC-${DSTAMP}.jar" basedir="${build}"/>
<!-- Fancy task that takes the pain out creating properly formatted manifest value -->
<manifestclasspath property="mf.classpath" jarfile="${dist}/lib/CC.jar">
<classpath>
<fileset dir="${dist}/lib" includes="*.jar"/>
</classpath><!--end tag-->
</manifestclasspath>
<!-- This is the executable jar -->
<jar jarfile="${dist}/lib/CC.jar" basedir="${build}">
<manifest>
<attribute name="Main-Class" value="jab.jm.main.Test"/>
<attribute name="Class-Path" value="${mf.classpath}"/>
</manifest>
</jar>
</target>
這種方法將允許您按以下方式運行jar:
java -jar CC.jar
如果沒有多余的清單條目,則必須按以下方式運行jar:
java -cp CC.jar:CC-DSTAMPVALUE.jar jab.jm.main.Test
只有CC.jar是可執行文件,並且需要特殊的清單。 使用此模式意味着放置在lib目錄中的將來的其他jar將自動包含在運行時類路徑中。 (對於諸如log4j之類的開源依賴項很有用)
顯然,在運行CC.jar時,如果jar文件不存在,也會出現類似的錯誤:-)
您是否在運行jar時嘗試過明確指定類路徑,以確保新庫在其中?
也許庫1存在於默認的類路徑中,所以您的項目運行良好,直到您添加了不存在的庫2。 在Eclipse中運行時,IDE可能會自動為您添加庫2到類路徑中。 您可以在Eclipse中的項目的“運行配置”中檢查類路徑,並確保當不通過IDE運行時在其中包含所有內容。
這可能是由於生成的類文件的位置而發生的。 例如,當您構建一個全食時,它將在指定為ex:bin的Output文件夾的位置生成類文件,而在運行時,它將在該位置查找類文件。
因此,請檢查您的螞蟻是否在與BuildPath配置中提到的輸出文件夾相同的位置生成類文件。 如果沒有, 請將輸出文件夾位置更改為您的螞蟻生成類文件的位置 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.