2013-04-17 50 views
0

我正在嘗試使用Ant Build來構建一個項目,並且我引用了幾個jar來使其工作。現在,當我把由Ant構建的jar創建到其他機器並運行它時。 我收到錯誤NoClassDefFoundError org/apache... Not found。 反正有沒有把所有引用的jar放在項目的classpath或manifest文件中?
或者有無論如何重新包裝項目中的所有罐子? 我知道有一種方法使用jarjar但我不知道如何使用它。
請給我一些建議,我一直堅持這個小問題很長一段時間。Jar:找不到類Def錯誤

+0

你是如何運行它? – Mark

+0

也許這將有助於: http://stackoverflow.com/questions/1821803/creating-a-bundle-jar-with-ant – NeplatnyUdaj

+0

目標機器上的外部容器(包含org/apache等) ? classpath或java.ext.dirs是否設置爲指向目標機器上的外部罐子? – karakuricoder

回答

0

使用ANT構建時,您需要的外部罐子正被ANT工具添加到類路徑中。查看構建腳本,最有可能在javac任務中或在定義類路徑的設置任務中有條目。

生成代碼後,您的jar文件只包含您的類,第三方jar文件(如Apache)中的類默認不添加到您的jar文件中。

你需要決定的是你想要一個包含所有需要的類的單個jar文件還是願意部署多個jar文件?如果您願意將應用程序作爲多個jar文件提供,那麼您將需要提供批處理文件或shell腳本來爲構建類路徑的用戶啓動應用程序,以包含已部署的jar。

如果你想要一個jar文件,你可以做下面的事情。假設你有第三方jar文件是由ANT財產確定lib.dir目錄:

<jar destfile='${build.dir}/lib-jars.jar'> 
    <zipgroupfileset dir="${lib.dir}"> 
    <include name="**/*.jar" /> 
    </zipgroupfileset> 
</jar> 
<sleep seconds='1'/> <!-- avoid timestamp warnings --> 

這是什麼會做你的build.dir是創建目錄中名爲一個jar文件lib-jars.jar包含所有第三方jar中的所有類。理解這將導致相同的文件(如MANIFEST.MF文件)被覆蓋,如果它們存在於多個罐子中並且只有最後一個存在。

一旦你有了這個新的全庫罐子,然後你可以罐子你的應用程序類和這個全庫罐子的內容放入一個罐子:

<jar destfile='${jar.file}' basedir='${classes.dir}'> 
    <!-- using zipfileset we can filter on entries in the one file --> 
    <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}"/> 
     <attribute name="Implementation-Vendor" value="${vendor}"/> 
    </section> 
    </manifest>  
</jar> 

通知我排除MANIFEST.MF來自全部庫的文件並創建自己的文件。然後,最終的結果是一個單獨的jar文件,其中包含所有庫jar文件和類的所有類/屬性文件/資源​​。