2012-04-15 15 views
7

Chcę dołączyć zewnętrzny słoik do mojego projektu java. Używam mrówki. Zewnętrzny plik .jar znajduje się w folderze lib. Mój build.xml wygląda mniej więcej tak:Ant zawiera zewnętrzny .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> 

Ale to nie działa. Kiedy chcę zaimportować coś z zewnętrznego .jar, jest błąd po poleceniu ant compile: pakiet com.something nie istnieje. Co powinienem edytować, aby działało?

Dokładny błąd:

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

Czy możesz edytować swoje pytanie, podając dokładny błąd? – Tom

+0

Dodałem dokładny błąd. – Pajushka

+0

nie można łatwo dołączać bibliotek zewnętrznych w normalnym słoiku. Aby to osiągnąć, potrzebujesz specjalnych zadań, takich jak jeden słoik. – oers

Odpowiedz

4

Należy starać bez zawiera atrybut:

<fileset dir="lib" /> 

A w ramach słoik dołączyć klasy tak:

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

ja również użyj mrówki, aby dołączyć kilka JARów zależności w moim JAR. Moje zadanie kompilacji wygląda tak. Być może coś podobnego zadziała dla ciebie.

<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

Nie można umieścić zewnętrznych bibliotek w słoiku i oczekiwać, że program ładujący klasy użyje tych słoików. Niestety nie jest to obsługiwane.

Istnieją zadania ant takie jak one jar, które pomagają w utworzeniu pliku JAR, który zawiera wszystko, czego potrzebujesz.

Ten bit jest z 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.

innej alternatywy:

  • jarjar: Jar Jar Odnośniki to narzędzie, które ułatwia zapakowanie bibliotek Java i osadzić je w swojej własnej dystrybucji
+0

Nie całkiem dokładne, niektóre aplikacje, takie jak Hadoop, na przykład obsługują konwencję umieszczania słoików w katalogu lib słoika, a aplikacja obsługuje je w ścieżce klas. –

+1

@DavidParks, ale to dlatego, że Hadoop używa własnych programów ładujących klasy. Jest to więc specyficzne dla aplikacji i nie jest częścią oficjalnej definicji słownika. – oers

0

Czasami można bezpośrednio używać zawartości słoika, wystarczy rozpakować plik

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