2012-04-15 5 views
7

Je souhaite inclure un fichier jar externe dans mon projet Java. J'utilise la fourmi. Le fichier .jar externe se trouve dans le dossier lib. Mon build.xml ressemble à quelque chose comme ça:Ant include externe .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> 

Mais cela ne fonctionne pas. Quand je veux importer quelque chose du .jar externe, il y a une erreur après la commande ant compile: le paquet com.something n'existe pas. Que dois-je éditer pour le faire fonctionner?

erreur exacte:

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

Pouvez-vous modifier votre question pour nous fournir l'erreur exacte? – Tom

+0

J'ai ajouté l'erreur exacte. – Pajushka

+0

vous ne pouvez pas inclure facilement les bibliothèques externes dans un pot normal. Vous avez besoin de tâches spéciales comme one-jar pour accomplir cela. – oers

Répondre

4

Vous devriez essayer sans l'attribut includes:

<fileset dir="lib" /> 

Et dans la partie jar comprennent les classes comme celle-ci:

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

J'ai aussi utilisez ant pour inclure un certain nombre de fichiers JAR de dépendances dans mon fichier JAR. Ma tâche de compilation ressemble à ceci. Peut-être que quelque chose de semblable fonctionnera pour vous.

<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

Vous ne pouvez pas placer de bibliothèques externes dans un fichier jar et attendez que le chargeur de classe utilise ces fichiers jar. Malheureusement, ceci n'est pas supporté.

Il existe des tâches ant, telles que one jar, qui vous aident à créer un fichier jar contenant tout ce dont vous avez besoin.

Ce bit est de la 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.

Autre alternative:

  • jarjar: Liens Jar Jar est un utilitaire qui le rend facile à reconditionner les bibliothèques Java et les intégrer dans votre propre distribution
+0

Pas tout à fait exact, certaines applications comme Hadoop, par exemple, supportent la convention de mettre des jars dans le répertoire lib d'un jar et l'application gère les obtenir sur le classpath. –

+1

@DavidParks mais c'est parce que Hadoop utilise ses propres classloaders. Donc, ceci est spécifique à l'application et ne fait pas partie de la définition officielle du bocal. – oers

0

Parfois vous pouvez utiliser le contenu du pot directement, juste décompresser

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