2012-04-15 7 views
7

Tôi muốn đưa jar bên ngoài vào dự án java của mình. Tôi đang sử dụng kiến. External .jar nằm trong thư mục lib. Build.xml của tôi trông giống như sau:Ant bao gồm bên ngoài .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> 

Nhưng nó không hoạt động. Khi tôi muốn nhập một cái gì đó từ bên ngoài .jar, có một lỗi sau khi lệnh ant compile: gói com.something không tồn tại .. Tôi nên chỉnh sửa để làm cho nó hoạt động?

lỗi chính xác:

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

Bạn có thể chỉnh sửa câu hỏi của mình để cung cấp cho chúng tôi lỗi chính xác không? – Tom

+0

Tôi đã thêm lỗi chính xác. – Pajushka

+0

bạn không thể bao gồm các thư viện bên ngoài dễ dàng trong bình bình thường. Bạn cần các nhiệm vụ đặc biệt như một cái bình để thực hiện điều đó. – oers

Trả lời

4

Bạn nên cố gắng mà không bao gồm các thuộc tính:

<fileset dir="lib" /> 

Và ở phần jar bạn bao gồm các lớp học như thế này:

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

Tôi cũng sử dụng kiến ​​để bao gồm một số JAR phụ thuộc trong JAR của tôi. Nhiệm vụ biên dịch của tôi trông như thế này. Có lẽ một cái gì đó tương tự sẽ làm việc cho bạn.

<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

Bạn không thể đặt thư viện bên ngoài vào bình và mong muốn trình nạp lớp sử dụng các lọ đó. Rất tiếc, điều này không được hỗ trợ.

Có các tác vụ kiến ​​như one jar giúp bạn, để tạo tệp jar, chứa mọi thứ bạn cần.

chút Đây là từ 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.

Alternative khác:

  • jarjar: Jar Jar Liên kết là một tiện ích mà làm cho nó dễ dàng để đóng gói lại các thư viện Java và nhúng chúng vào phân phối của riêng bạn
+0

Không hoàn toàn chính xác, một số ứng dụng như Hadoop, ví dụ, hỗ trợ quy ước đặt các lọ trong thư mục lib của một cái bình và ứng dụng xử lý việc nhận chúng trên đường dẫn lớp. –

+1

@DavidParks nhưng thats vì Hadoop sử dụng một trình nạp lớp riêng. Vì vậy, đây là ứng dụng cụ thể và không phải là một phần của definiton jar chính thức. – oers

0

đôi khi bạn có thể sử dụng nội dung jar trực tiếp, chỉ cần giải nén

 <unzip src="/Developer-Java/mysql-connector-java/mysql-connector-java-5.1.22-bin.jar" dest="${build_dir}" />