2014-04-02 98 views
1

我編寫了Java工具(本例中爲iOffloadMaker),它也包含自定義的Ant任務作爲啓動Ant的主要啓動工具。我將所有外部jar庫捆綁到了我的工具的jar中。我也提供了一個簡單的Ant build.xml文件來啓動我的工具:java.lang.NoClassDefFoundError,Ant任務無法在jar中看到jar中的類

<?xml version="1.0"?> 
<project name="TestBound" default="main" basedir="."> 
    <!-- Sets varables which can later be used. --> 
    <property name="src.dir" value="src" /> 
    <property name="build.dir" value="bin" /> 
    <property name="dist.dir" value="dist" /> 
    <property name="libs.dir" value ="libs" /> 


    <path id="build.classpath"> 
     <fileset dir="${libs.dir}"> 
      <include name="**/*.jar"/> 
     </fileset> 

     <pathelement location=".\iOffloadMaker.jar"/> 
    </path> 
     <!-- define offload maker task --> 

    <taskdef name="iOffloadMaker" classname="com.richardle.ioffload.OffloadMakerTask" classpathref= "build.classpath"/>    

    ... 

     <!-- Creates the build, docs and dist directory--> 
    <target name="modify" description="modify the source code" >   
     <iOffloadMaker projectFolder="${basedir}">   
     </iOffloadMaker> 

    </target> 

     ... 

    <target name="main" depends="compile"> 
     <description>Main target</description> 
    </target> 
</project> 

的事情是,Ant任務不能引用類的罐子庫我的工具JAR文件中。因此,當我運行螞蟻,它拋出異常,因爲

D:\SOFTWARE\Android\TestBound>ant modify 
Buildfile: D:\SOFTWARE\Android\TestBound\build.xml 

modify: 
[iOffloadMaker] Offload Maker is executing... 

BUILD FAILED 
D:\SOFTWARE\Android\TestBound\build.xml:40: java.lang.NoClassDefFoundError: org/ 
xmlpull/v1/XmlPullParserException 
     at com.richardle.ioffload.offloadmaker.ApplicationProject.<init>(Applica 
tionProject.java:30) 
     at com.richardle.ioffload.offloadmaker.OffloadMaker.execute(OffloadMaker 
.java:121) 
     at com.richardle.ioffload.OffloadMakerTask.execute(OffloadMakerTask.java 
:26) 
     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. 
java:57) 

我相信,所有必要的庫都捆綁到iOffloadMaker.jar。問題在於Ant Task loader無法在我的jar文件中看到依賴JAR的類。

如果我沒有將所有依賴項捆綁到jar中,而是將它們與iOFfloadMaker.jar一起交付到依賴項文件夾中,它將按我的預期工作。但是我想將所有的依賴和我的工具源代碼捆綁到一個交付jar文件中。

有沒有解決這個問題的方法?

+1

相關問題:http://stackoverflow.com/questions/19015447/javas-classloader-versus-jars-within-jars –

+0

@AaronDigulla:謝謝你,我用的JarClassLoader和它的工作對我來說 –

回答

2

標準Java類加載器無法處理遞歸JAR(即捆綁在其他JAR中的JAR)。

此頁面列出了幾個解決方案爲:http://www.jdotsoft.com/JarClassLoader.php

請讓我知道哪一個爲你工作。

+0

我使用的JarClassLoader類它起到了魅力的作用。非常感謝您的快速回復。 –