2010-12-27 15 views
6

मेरे जावा स्रोत-कोड में मैं अपने अनुप्रयोग की "lib" निर्देशिका में संग्रहीत जावा अभिलेखागार (.jar) से विभिन्न वर्गों का उपयोग करना चाहता हूं। लेकिन अगर मैं "चींटी रन" करता हूं तो मुझे हमेशा "java.lang.NoClassDefFoundError" संदेश मिलता है। मैंने इसे ठीक करने के लिए कई चीजों की कोशिश की लेकिन कुछ भी काम नहीं किया ... शायद कोई यहां मेरी मदद कर सकता है?चींटी build.xml फ़ाइल में बाहरी पुस्तकालयों को कैसे शामिल करें?

यह मेरा build.properties फ़ाइल:

app.name=MyApplication 
app.version=1.0 
main.class=mypackage.MyMain 
build.dir=build 
classes.dir=${build.dir}/classes 
jar.dir=${build.dir}/jar 
dist.dir=dist 
src.dir=src 
test.dir=test 
lib.dir=lib 

यह मेरा build.xml है:

<?xml version="1.0" encoding="UTF-8" ?> 
<project name="My Project" default="run" basedir="."> 
    <description>My description.</description> 

    <property file="build.properties" /> 
    <path id="classpath"> 
    <fileset dir="${lib.dir}" includes="*.jar"/> 
    </path> 

    <!-- Initialization --> 
    <target name="init" description="Prepare needed directories."> 
    <mkdir dir="${build.dir}" /> 
    <mkdir dir="${classes.dir}" /> 
    <mkdir dir="${jar.dir}" /> 
    <mkdir dir="${dist.dir}" /> 
    <mkdir dir="${lib.dir}" /> 
    </target> 

    <!-- Cleanup --> 
    <target name="clean" description="Remove all files created by the build/test process."> 
    <delete dir="${classes.dir}" /> 
    <delete dir="${dist.dir}" /> 
    </target> 

    <!-- Compile application --> 
    <target name="compile"> 
    <mkdir dir="${classes.dir}"/> 
    <javac srcdir="${src.dir}" 
     destdir="${classes.dir}" 
     debug="yes" 
     includeantruntime="false"> 
     <!-- <classpath refid="classpath" /> --> 
    </javac> 
    </target> 

    <!-- Java Archive --> 
    <target name="jar" depends="compile"> 
    <!--<delete file="${jar.dir}/${app.name}-${app.version}.jar"/>--> 
    <delete dir="${jar.dir}"/> 
    <mkdir dir="${jar.dir}"/> 
    <jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}"> 
     <manifest> 
     <attribute name="Class-Path" value="${lib.dir}"/> 
     <attribute name="Main-Class" value="${main.class}"/> 
     </manifest> 
    </jar> 
    </target> 

    <!-- Run application --> 
    <target name="run" depends="jar"> 

    <java jar="${jar.dir}/${app.name}-${app.version}.jar" 
     fork="true"> 
    </java> 
    <!-- 
    <java fork="true" classname="${main.class}"> 
     <classpath> 
     <path refid="classpath"/> 
     <path location="${jar.dir}/${app.name}-${app.version}.jar"/> 
     </classpath> 
    </java> 
    --> 
    </target> 
</project> 

यह अगर कोई मदद कर सकता है अच्छा होगा।

चीयर्स!

बेनी

+0

क्या आपके 'lib' निर्देशिका कैसा दिखता है? क्या सभी जार फ़ाइलों को उस निर्देशिका में डंप किया गया है, या उपनिर्देशिकाएं हैं? –

+0

सभी जार फ़ाइलें उस निर्देशिका में हैं (बिना किसी उप-निर्देशिका के)। संरचना इस तरह दिखती है: ./lib/log4j-1.2.9.jar,।/lib/cobertura.jar, ./lib/easymock-3.0.jar, ... मैं अपने जार फ़ाइल में उन पुस्तकालयों को कैसे शामिल कर सकता हूं? –

उत्तर

0

मैं देख रहा हूँ कि आप <java> कार्य के लिए अपने classpath सेट करने की कोशिश की है।

आप की कोशिश की है:

<java jar="${jar.dir}/${app.name}-${app.version}.jar" fork="true"> 
    <classpath refid="classpath" /> 
</java> 

संपादित करें: डबल अपने गुण फाइल में मूल्यों की जाँच करें। क्या आपके पास lib.dir या jar.dir के मान के लिए पीछे की जगह है?

http://ant.apache.org/faq.html#properties-not-trimmed

चींटी javac के माध्यम से अपना कार्यक्रम बनाने यहाँ तक कि जब मैं जरूरत जार एक बाहरी build.properties में डाल फ़ाइल और pathelement द्वारा उन्हें संदर्भित करने के लिए विफल रहा है या classpath refid।

एक बाहरी फ़ाइल से चींटी भार गुण यह गुणों की मूल्य स्पर्श नहीं करता है, तो पीछे चल रिक्त स्थान उदाहरण के लिए छंटनी की नहीं किया जाएगा।

मूल्य एक फ़ाइल पथ, एक जार संकलित करने के लिए की जरूरत की तरह प्रतिनिधित्व करता है, काम जो मूल्य की आवश्यकता है, उदाहरण के लिए javac के बाद से यह फ़ाइल नहीं मिल रहा है संकलन करने विफल हो जाएगा कारण रिक्त स्थान अनुगामी के लिए ।

+0

जब मैं इसका उपयोग करता हूं, तो मुझे "चींटी संकलन" के दौरान एक त्रुटि मिलती है। फिलहाल मैं अपनी बाहरी जार फ़ाइलों की प्रत्येक स्रोत-कोड फ़ाइलों को निकालता हूं और उन्हें अपनी "src" निर्देशिका में डालता हूं। फिर मैं अपनी परियोजना को बिना किसी समस्या के चला सकता हूं क्योंकि मेरी परियोजना को संकलित और चलाने पर निर्भरता शामिल होती है। लेकिन मुझे लगता है कि यह सबसे अच्छा उपयोग-मामला नहीं है। लेकिन अब तक मुझे कोई अन्य समाधान नहीं मिला है जो बाहरी जार फ़ाइलों को अपनी जार फ़ाइल में प्रदान करेगा। मुझे लगता है कि मुझे मेनिफेस्ट में क्लासपाथ घोषणा पर फिर से ध्यान देना होगा जैसा कि आपने मुझे बताया था ... –

+0

@ बेनी न्यूजबॉउर - अपने गुणों के लिए कोई पिछला सफेद स्थान है या नहीं, यह देखने के लिए अपनी गुण फ़ाइल प्रविष्टियों को दोबारा जांचें। –

3

अपने build.properties फ़ाइल काम करेंगे से classes.dir=build/classes और jar.dir=${build.dir}/jarjar.dir=build/jar साथ साथ classes.dir=${build.dir}/classes की जगह।

2

कृपया निम्नानुसार लक्षित जार संपादित करें। मुझे यकीन है कि यह काम करेगा।

<target name="jar" depends="compile"> 

<delete dir="${jar.dir}"/> 
<mkdir dir="${jar.dir}"/> 
<jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}"> 
    <manifest> 
    <attribute name="Class-Path" value="${lib.dir}"/> 
    <attribute name="Main-Class" value="${main.class}"/> 
    </manifest> 
    <zipgroupfileset dir="${lib.dir}"/> 

</jar> 

संबंधित मुद्दे