2012-04-15 13 views
7

मैं अपने जावा प्रोजेक्ट में बाहरी जार शामिल करना चाहता हूं। मैं चींटी का उपयोग कर रहा हूँ। बाहरी .jar फ़ोल्डर lib में है। मेरा build.xml ऐसा कुछ दिखता है:चींटी में बाहरी शामिल हैं .jar

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <path id="classpath"> 
     <fileset dir="lib" includes="**/*.jar"/> 
    </path> 

    <target name="clean"> 
     <delete dir="build"/> 
    </target> 

    <target name="compile"> 
     <mkdir dir="build"/> 
     <javac srcdir="src" destdir="build" classpathref="classpath" /> 
    </target> 

    <target name="jar"> 
     <mkdir dir="trash"/> 
     <jar destfile="trash/test.jar" basedir="build"> 
      <zipgroupfileset dir="lib" includes="**/*.jar"/> 
      <manifest> 
       <attribute name="Main-Class" value="com.Test"/> 
      </manifest> 
     </jar> 
    </target> 

    <target name="run"> 
     <java jar="trash/test.jar" fork="true"/> 
    </target> 
</project> 

लेकिन यह काम नहीं करता है। जब मैं बाहरी .jar से कुछ आयात करना चाहता हूं, तो ant compile कमांड के बाद एक त्रुटि है: पैकेज com.something मौजूद नहीं है .. इसे काम करने के लिए मुझे क्या संपादित करना चाहिए?

सटीक त्रुटि:

Compiling 23 source files to xy/build 
    xy/src/com/Test.java:5: package com.thoughtworks.xstream does not exist 
    import com.thoughtworks.xstream.*; 
^
    1 error 
+0

क्या आप हमें सही प्रश्न प्रदान करने के लिए अपना प्रश्न संपादित कर सकते हैं? – Tom

+0

मैंने सही त्रुटि जोड़ दी है। – Pajushka

+0

आप सामान्य जार में आसानी से बाहरी पुस्तकालयों को शामिल नहीं कर सकते हैं। इसे पूरा करने के लिए आपको एक-जार जैसे विशेष कार्यों की आवश्यकता है। – oers

उत्तर

4

बिना विशेषता भी शामिल है आप का प्रयास करना चाहिए:

<zipgroupfileset includes="*.jar" dir="lib"/> 
0

मैं भी:

<fileset dir="lib" /> 

और जार भाग में आप इस तरह की कक्षाओं में शामिल मेरे जार में कई निर्भरता JARs को शामिल करने के लिए चींटी का उपयोग करें। मेरा संकलन कार्य इस तरह दिखता है। शायद कुछ ऐसा ही आपके लिए काम करेगा।

<target name="compile" depends="init"> 
    <javac srcdir="${src}" destdir="${build}" includeantruntime="false"> 
    <classpath> 
     <pathelement path="${classpath}" /> 
     <fileset dir="${deps}"> 
     <include name="**/*.jar"/> 
     </fileset> 
    </classpath> 
    </javac> 
    <copy todir="${build}"> 
    <fileset dir="${src}" excludes="**/*.java"/> 
    </copy> 
</target> 
1

आप बाहरी पुस्तकालयों को एक जार में नहीं डाल सकते हैं और क्लासलोडर को उन जारों का उपयोग करने की उम्मीद है। दुर्भाग्य से यह समर्थित नहीं है।

one jar जैसे चींटी कार्य हैं जो आपको जार फ़ाइल बनाने में मदद करते हैं, जिसमें आपकी आवश्यकता होती है।

इस बिट background information of one jar से है:

Unfortunately this is does not work. The Java Launcher$AppClassLoader does not know how to load classes from a Jar inside a Jar with this kind of Class-Path. Trying to use jar:file:jarname.jar!/commons-logging.jar also leads down a dead-end. This approach will only work if you install (i.e. scatter) the supporting Jar files into the directory where the jarname.jar file is installed.

Another approach is to unpack all dependent Jar files and repack them inside the jarname.jar file. This approach tends to be fragile and slow, and can suffer from duplicate resource issues.

अन्य वैकल्पिक:

  • jarjar: जार जार लिंक एक उपयोगिता आसान जावा लाइब्रेरीज repackage और उन्हें अपने खुद वितरण में एम्बेड करने के लिए बनाता है
+0

काफी सटीक नहीं है, उदाहरण के लिए, हडोप जैसे कुछ अनुप्रयोग जार की lib निर्देशिका में जार डालने के सम्मेलन का समर्थन करते हैं और एप्लिकेशन उन्हें कक्षापथ पर प्राप्त करने के लिए हैंडल करता है। –

+1

@ डेविडपार्क्स लेकिन ऐसा इसलिए है क्योंकि हडोप अपने स्वयं के क्लासलोडर्स का उपयोग करता है। तो यह आवेदन विशिष्ट है और आधिकारिक जार definiton का हिस्सा नहीं है। – oers

0

कभी-कभी आप सीधे जार सामग्री का उपयोग कर सकते हैं, बस

0 को अनजिप करें
 <unzip src="/Developer-Java/mysql-connector-java/mysql-connector-java-5.1.22-bin.jar" dest="${build_dir}" /> 
संबंधित मुद्दे