[英]issue with java ant build(not setting the classpath correctly)
這個構建文件怎么了? 它基本上包括兩個jar文件AbsoluteLayout.jar和swing-layout-1.0.3.jar
<?xml version="1.0"?>
<project>
<property name="srcDir" location="src"/>
<property name="buildDir" location="build"/>
<property name="distDir" location="dist"/>
<property name="library" value="lib/"/>
<path id="classpath">
<fileset dir="${library}">
<!--<include name="**/*.jar"/>-->
<include name="*.jar"/>
</fileset>
</path>
<property name="myclasspath" refid="classpath"/>
<!-- Emit the property to the ant console -->
<echo message="Classpath = ${myclasspath}"/>
<target name="init">
<mkdir dir="${buildDir}"/>
<mkdir dir="${distDir}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="${srcDir}" destdir="${buildDir}" classpathref="classpath"/>
</target>
<target name="dist" depends="compile">
<jar destfile="${distDir}/pro.jar" basedir="${buildDir}">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="Main.Class"/>
</manifest>
</jar>
<!--<jar destfile="${distDir}/package-src.jar" basedir="${srcDir}"/>-->
</target>
<target name="clean">
<delete dir="${buildDir}"/>
<delete dir="${distDir}"/>
</target>
</project>
它說BUILD SUCCESSFUL。當我在終端中運行ant文件時。 但是,當我運行jar文件時,出現以下錯誤:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jdesktop/layout/GroupLayout$Group
Caused by: java.lang.ClassNotFoundException: org.jdesktop.layout.GroupLayout$Group
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
為什么不將兩個文件包含在classpath中?
但是,當我運行jar文件時,出現以下錯誤:
Exception in thread "main" java.lang.NoClassDefFoundError
這是運行時錯誤。 運行時,jdesktop jar在jar文件的類路徑中不可用。
嘗試
java -cp .;path_jdesktop.jar; yourclass.jar
Class-Path: jar1-name jar2-name directory-name/jar3-name
所以像這樣:
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="Main.Class"/>
<attribute name="Class-Path" value="lib/jdesktop.jar"/>
</manifest>
而在運行jar文件,確保有一個lib
目錄和jdesktop.jar
在lib
目錄。
您可以使用路徑結構來構建類路徑。 例如,您可以從lib目錄中讀取所有jar文件:
<target name="init-classpath" depends="retrieve">
<path id="lib.classpath">
<fileset dir="${lib}">
<include name="*.jar" />
</fileset>
</path>
</target>
但是classpath接受由空格分隔的路徑列表,因此您需要展平路徑結構:
<pathconvert property="mf.classpath" pathsep=" ">
<path refid="lib.classpath" />
<flattenmapper />
</pathconvert>
最后,將您的mf.classpath放在Class-Path屬性中:
<jar destfile="${jars}/${result.name}.${result.ext}">
<manifest>
...
<attribute name="Class-Path" value="${mf.classpath}" />
</manifest>
...
</jar>
在這種情況下,您需要將庫jar部署在與輸出jar相同的目錄中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.