[英]Java ANT : Issues with build.xml
我想知道是否有人可以幫助我解決一個嚴重的問題……我需要使用很多依賴項從一個項目中創建一個jar……問題是:我自己編寫的build.xml文件無法正常工作。 更具體地說,它運行沒有問題,只是一個警告:
Buildfile: C:\Users\Alexis Fasquel\workspace\FirstEditServer\build.xml
clean:
[delete] Deleting directory C:\Users\Alexis Fasquel\workspace\FirstEditServer\bin
[delete] Deleting directory C:\Users\Alexis Fasquel\workspace\FirstEditServer\dist
makedir:
[mkdir] Created dir: C:\Users\Alexis Fasquel\workspace\FirstEditServer\bin
[mkdir] Created dir: C:\Users\Alexis Fasquel\workspace\FirstEditServer\dist
compile:
[javac] C:\Users\Alexis Fasquel\workspace\FirstEditServer\build.xml:101: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 14 source files to C:\Users\Alexis Fasquel\workspace\FirstEditServer\bin
jar:
[jar] Building jar: C:\Users\Alexis Fasquel\workspace\FirstEditServer\dist\firstEditServer.jar
main:
BUILD SUCCESSFUL
Total time: 1 second
但是不幸的是我仍然得到一些classNotFoundDefError
我沒有打印出完整的跟蹤記錄,因為這是我嘗試實例化的第一類,但沒有找到...所以我猜沒有任何效果...但是在這里:
Exception in thread "main" java.lang.NoClassDefFoundError: gate/util/GateExcept
on
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: gate.util.GateException
at java.net.URLClassLoader$1.run(Unknown Source)
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)
... 6 more
有我的build.xml文件...有人可以看一下,也許發現我的錯誤是什么?
<?xml version="1.0"?>
<project name="Ant-Test" default="main" basedir=".">
<!-- Sets variables which can later be used. -->
<!-- The value of a property is accessed via ${} -->
<property name="src.dir" location="src" />
<property name="bin.dir" location="bin" />
<property name="gate.dir" location="gate" />
<property name="virtuoso.dir" location="virtuoso" />
<property name="recommendation.dir" location="recommendation" />
<property name="dist.dir" location="dist" />
<path id="bin.classpath">
<fileset dir="${virtuoso.dir}">
<include name="openrdf-sesame-2.6.5-onejar.jar" />
<include name="slf4j-api-1.5.0.jar" />
<include name="slf4j-jdk14-1.5.0.jar" />
<include name="virt_sesame2.jar" />
<include name="virtjdbc3.jar" />
</fileset>
<fileset dir="${gate.dir}">
<include name="plugins\Gazetteer_LKB\Gazetteer_LKB.jar" />
<include name="lib\gate.jar" />
<include name="lib\log4j.jar" />
<include name="lib\commons-io.jar" />
<include name="plugins\Tagger_Framework\TaggerFramework.jar" />
<include name="lib\ant-contrib.jar" />
<include name="lib\ant-launcher.jar" />
<include name="lib\ant.jar" />
<include name="lib\aopalliance.jar" />
<include name="lib\apache-mime4j-core.jar" />
<include name="lib\apache-mime4j-dom.jar" />
<include name="lib\bcmail-jdk15.jar" />
<include name="lib\bcprov-jdk15.jar" />
<include name="lib\commons-codec.jar" />
<include name="lib\commons-compress.jar" />
<include name="lib\commons-lang.jar" />
<include name="lib\commons-logging.jar" />
<include name="lib\dom4j.jar" />
<include name="lib\fontbox.jar" />
<include name="lib\gate-asm.jar" />
<include name="lib\gate-compiler-jdt.jar" />
<include name="lib\lucene-core.jar" />
<include name="lib\metadata-extractor.jar" />
<include name="lib\nekohtml.jar" />
<include name="lib\pdfbox.jar" />
<include name="lib\poi-ooxml-schemas.jar" />
<include name="lib\poi-ooxml.jar" />
<include name="lib\poi-scratchpad.jar" />
<include name="lib\poi.jar" />
<include name="lib\spring-aop.jar" />
<include name="lib\spring-beans.jar" />
<include name="lib\spring-core.jar" />
<include name="lib\tika-core.jar" />
<include name="lib\tika-parsers.jar" />
<include name="lib\wstx-lgpl.jar" />
<include name="lib\xercesImpl.jar" />
<include name="lib\xmlbeans.jar" />
<include name="lib\xmlunit.jar" />
<include name="lib\xpp3.jar" />
<include name="lib\xstream.jar" />
<include name="lib\ivy.jar" />
<include name="lib\java-getopt.jar" />
<include name="lib\java2html.jar" />
<include name="lib\javacc.jar" />
<include name="lib\jaxen.jar" />
<include name="lib\jdom.jar" />
<include name="lib\jempbox.jar" />
<include name="lib\junit.jar" />
<include name="plugins\Gazetteer_LKB\lib\commons-cli-1.1.jar" />
<include name="plugins\Gazetteer_LKB\lib\commons-collections-3.2.1.jar" />
<include name="plugins\Gazetteer_LKB\lib\commons-httpclient-3.1.jar" />
<include name="plugins\Gazetteer_LKB\lib\kim-api-3.0-RC5.jar" />
<include name="plugins\Gazetteer_LKB\lib\kim-util-3.0-RC5.jar" />
<include name="plugins\Gazetteer_LKB\lib\owlim-lite-4.3.jar" />
<include name="plugins\Gazetteer_LKB\lib\trove4j-2.0.2.jar" />
<include name="plugins\Gazetteer_LKB\lib\openrdf-sesame-2.6.3-onejar.jar" />
<include name="plugins\Gazetteer_LKB\lib\slf4j-api-1.5.11.jar" />
<include name="plugins\Gazetteer_LKB\lib\slf4j-log4j12-1.5.11.jar" />
</fileset>
<fileset dir="${recommendation.dir}">
<include name="simmetrics_jar_v1_6_2_d07_02_07.jar" />
</fileset>
</path>
<!-- Deletes the existing bin, docs and dist directory-->
<target name="clean">
<delete dir="${bin.dir}" />
<delete dir="${dist.dir}" />
</target>
<!-- Creates the bin and dist directory-->
<target name="makedir">
<mkdir dir="${bin.dir}" />
<mkdir dir="${dist.dir}" />
</target>
<!-- Compiles the java code (including the usage of library for JUnit -->
<target name="compile" depends="clean, makedir">
<javac srcdir="${src.dir}" destdir="${bin.dir}" classpathref="bin.classpath">
</javac>
</target>
<!--Creates the deployable jar file -->
<target name="jar" depends="compile">
<jar destfile="${dist.dir}\firstEditServer.jar" basedir="${bin.dir}">
<manifest>
<attribute name="Main-Class" value="com.firstedit.main.Main" />
</manifest>
</jar>
</target>
<target name="main" depends="compile, jar">
<description>Main target</description>
</target>
</project>
如您所見,GateException確實位於gate.jar中。
暫時假設它找不到的類位於jar文件lib \\ gate.jar中,那么我想說的是,您正在從項目源中構造jar(firstEditServer.jar)文件,並且就這些。 為了執行該jar,您還需要確保lib ...目錄中的所有jar文件也位於類路徑中。
現在,如果要創建一個包含所有jar庫中所有類的 jar文件,則必須以稍有不同的方式構建jar文件。 您無法構建包含其他jar的可執行jar(帶有Main-Class屬性的jar)。 標准類加載器不會在一個jar中查找其他jar文件。 因此,您需要將庫jar類擴展到最終的jar中。
Ant使用如下所示的方式對此提供了支持。 zipgroupfileset是一項任務,它將獲取jar文件列表,將其展開並將類本身包含到目標jar中。 我過濾掉manifest.mf和屬性文件,以免它們與我自己的文件發生沖突(例如庫jar中的log4j.properties文件)。
這將創建一個包含所有lib jar的所有內容的jar。 清單文件將發生沖突,最后看到的清單文件將獲勝。
<jar destfile='${build.dir}/lib-jars.jar'>
<zipgroupfileset dir='${lib.dir}'>
<include name='**/*.jar'/>
</zipgroupfileset>
</jar>
與單個jar一起使用的zipfileset可以從所需的一個jar中過濾掉所有內容。 這將刪除MANIFEST.MF文件,但也可能會刪除帶有其他排除標記的其他文件。
<jar destfile='${jar.file}' basedir='${classes.dir}'>
<zipfileset src='${build.dir}/lib-jars.jar'>
<exclude name="META-INF/MANIFEST.MF"/>
</zipfileset>
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="${main.class}"/>
<section name="common">
<attribute name="Specification-Title" value="${project.title}"/>
<attribute name="Specification-Version" value="${release.version}"/>
<attribute name="Specification-Vendor" value="${vendor}"/>
<attribute name="Implementation-Title" value="${project.title}"/>
<attribute name="Implementation-Version" value="${release.version} ${TODAY}"/>
<attribute name="Implementation-Vendor" value="${vendor}"/>
</section>
</manifest>
</jar>
確保您的lib文件夾在您的類路徑中。 我也有類似的經歷,就像你一樣。 構建是可以的,因為螞蟻找到了罐子。 如果要構建jar,請確保清單將jar添加到清單文件中的類路徑中。 有一個清單選項,您可以讓ant將清單文件添加到jar中。 如果沒有其他要求,請在命令行上運行程序,然后使用-classpath選項指向您的lib文件夾。 我認為您的問題就在您的課堂上,盡管我已經戰斗了很多次。
這不是答案,但是評論太久了,所以...
您可以執行以下步驟:
gate.util.GateExcept
添加簡單的main方法 public static void main( final String[] args ) {
System.out.println( GateExcept.class.getName() );
}
再次構建jar(將其命名為myjar.jar)
運行此命令
java -cp myjar.jar gate.util.GateExcept
如果工作正常,請嘗試(可執行jar)
java -jar myjar.jar
在我看來,在屏幕快照上您具有gate.util.GateException
,但是在異常堆棧中只有gate.util.GateExcep
(但可能只是SO問題)。
讓我知道是否可行。
如果我錯了,請糾正我,但您不是使用ANT運行此jar,是嗎? ANT僅用於正確構建jar文件嗎?
有兩種啟動Java程序的方法
第一個要求您設置“ Main-Class”和“ Class-Path”清單條目。 第二個要求您顯式列出每個依賴項。
我懷疑您正在嘗試使用前者,但是忘記了包括類路徑.....以下問題也有同樣的問題。 它概述了使用ANT manifestclasspath任務來簡化清單中的類路徑設置的解決方案:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.