web-dev-qa-db-fra.com

Comment puis-je inclure un fichier JAR externe dans mon projet Netbeans?

Lorsque je lance "nettoyer et construire", le fichier .jar en cours de création ne s'exécute que si le dossier lib se trouve dans le même dossier que le fichier .jar

Donc, si je déplace le fichier JAR sur le bureau et que je laisse le dossier lib dans le dossier dist, le fichier jar me donnera une exception.

Comment puis-je régler ce problème?

23
ksm001

Si vous copiez vos fichiers JAR dans le répertoire du code source, ils seront dans votre fichier JAR final. Néanmoins, je ne suis pas sûr si cela fonctionnera à 100% du temps. 

Il existe un excellent article sur Java-forum qui indique ce qui suit:

Sauf quelques circonstances choisies, ce qui me convient le mieux est de Il suffit de fusionner les fichiers manuellement. Un .jar est fondamentalement un .Zip avec contenus organisés, et vous pouvez les ouvrir dans presque tous les fichiers compatibles .Zip programme d’archivage (je viens d’utiliser l’archiveur standard de gnome, File Roller, et cela fonctionne très bien). Sauvegardez votre fichier jar et ouvrez-le dans l’archiveur de votre choix et faites de même pour chaque fichier de bibliothèque dans la bibliothèque annuaire. Glissez-déposez les dossiers de travail (IE, tout sauf SAUF. Le répertoire META-INF) de chaque bibliothèque dans le chemin racine de votre jar (à côté de votre META-INF et du paquet racine de votre application). Maintenant, faites glisser le Fichier META-INF/MANIFEST.MF de votre fichier jar vers votre bureau ou tout autre fichier dossier. Ouvrez-le et effacez les lignes Class-Path et X-COMMENT. Ne pas oubliez de laisser une nouvelle ligne vierge à la fin du fichier! Enregistrez le nouveau fichier manifeste et faites-le glisser dans le répertoire META-INF de votre jar, écraser l'ancien. Testez le pot.

13
rlinden

J'ai résolu ce problème en ne créant qu'un fichier jar contenant toutes les bibliothèques, en ajoutant les éléments suivants à mon fichier build.xml dans NetBeans:

<target name="-post-jar">
  <jar jarfile="dist/Combined-dist.jar">
    <zipfileset src="${dist.jar}" excludes="META-INF/*" />
    <zipfileset src="lib/commons-io-1.4.jar" excludes="META-INF/*" />
    <zipfileset src="lib/ninja-utils-3.2.jar" excludes="META-INF/*" />
    <zipfileset src="lib/Unicorn-1.0.jar" excludes="META-INF/*" />
    <manifest>
        <attribute name="Main-Class" value="com.example.mypackage.Main"/>
    </manifest>
  </jar>
</target>

Cela crée un fichier jar (Combined-dist.jar) qui est la combinaison du jar dist et des jars de la bibliothèque spécifiés (dans ce cas, commons-io-1.4.jar, ninja-utils-3.2.jar et Unicorn-1.0. pot). Vous devez vous assurer de spécifier votre paquet Main Class pour le nouveau fichier jar, sinon il ne fonctionnera pas lorsque vous essayez de l'ouvrir.

23
Hemerson Varela

Il est très facile de conditionner chaque bibliothèque dépendante (* .jar) dans un seul fichier myProject.jar.

Il suffit de suivre ces étapes et vous allez enfin emballer chaque bibliothèque dépendante dans un seul fichier. Si vous utilisez NetBeans, vous pouvez suivre exactement sinon vous devez trouver votre fichier build.xml dans les fichiers de projet.

Suivez ces étapes pour éditer build.xml

1) Cliquez sur Files tab du côté gauche du panneau de projet dans NetBeans.

2) Double-cliquez sur le fichier build.xml et ajoutez-y ces lignes juste avant la ligne </project>.

 <target name="package-for-store" depends="jar">
    <property name="store.jar.name" value="myProject"/>
    <property name="store.dir" value="store"/>
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>
    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
    <delete dir="${store.dir}"/>
    <mkdir dir="${store.dir}"/>
    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>
        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>
    <Zip destfile="${store.jar}">
        <zipfileset src="${store.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </Zip>
    <delete file="${store.dir}/temp_final.jar"/>
</target>

3) Changez value dans la deuxième ligne du code selon le nom de votre projet, qui est

<property name="store.jar.name" value="myProject"/> //<---Just value not name

4) Enregistrez-le et cliquez avec le bouton droit de la souris sur build.xml et choisissez Run Target et ensuite Autres cibles et enfin cliquez sur Package-for-store

5) Et ici vous avez fait. Maintenant, vous pouvez vérifier que, tout comme le dossier dist, il y aura un dossier store qui contiendra votre fichier jar complet final, y compris toutes vos bibliothèques dépendantes. Maintenant, chaque fois que vous souhaitez modifier/ajouter plus de bibliothèques ou plus, suivez simplement l'étape 4.

Image pour l'étape 4

enter image description here

7

Vous pouvez utiliser Apache Ant depuis la version 1.7 pour créer le fichier JAR avec les bibliothèques requises dans un seul fichier. Vous pourriez avoir un fichier de configuration comme suit:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="buildJar">
    <target name="buildJar">
        <!-- Name of jar -->
        <jar destfile="C:/MyJar.jar" filesetmanifest="mergewithoutmain">
            <manifest>
                <!-- Your class with the main method -->
                <attribute name="Main-Class" value="myPackage.MyClass"/>
                <!-- Path in the jar -->
                <attribute name="Class-Path" value="."/>
            </manifest>
            <!-- Dir of compiled class -->
            <fileset dir="C:/NetBeansProjects/MyProject/bin"/>
            <!-- Include required jars -->
            <zipfileset excludes="META-INF/*.SF" 
                src="C:/NetBeansProjects/MyProject/lib/library1.jar"/>
            <zipfileset excludes="META-INF/*.SF" 
                src="C:/NetBeansProjects/MyProject/lib/library2.jar"/>
        </jar>
    </target>
</project>

Dans Netbeans, placez le fichier XML dans votre projet et exécutez-le avec le menu contextuel.

Plus d'informations dans Apache Ant - Manuel de l'utilisateur .

5
Paul Vargas

Si vous allez distribuer votre application sur un autre pc

Vous venez de compresser le fichier .jar avec le dossier lib. 

Si vous voulez exécuter votre application depuis n'importe quel endroit de votre PC

Prenez en compte la manière Maven de le faire - créez un référentiel local, par exemple. C:\libs où vos bibliothèques existeraient et .jar pourrait y accéder plus tard de n’importe quel endroit de votre ordinateur. 

Ou vous pouvez simplement utiliser Maven. Il existe une discussion sur la distribution d'une application avec toutes les dépendances (bibliothèques): Java: Comment créer des distributions autonomes de projets Maven? .

3
JMelnik

Copiez ce fichier jar dans:

C:\Program Files\Java\jdk\jre\lib\ext 

et

C:\Program Files\Java\jre\lib\ext

Vous devriez pouvoir l'utiliser dans Netbeans et dans vos importations manuelles, tout comme les importations standard. 

3
Thiyagarajan

J'ai peut-être trouvé la solution la plus simple à ce problème ici . Il vous suffit de copier le prochain extrait de code à la fin du fichier build.xml dans votre dossier de projet.

<target name="-post-jar">

    <!-- Change the value to the name of the final jar without .jar -->
    <property name="store.jar.name" value="MyJarName"/>

    <!-- don't edit below this line -->
    <property name="store.dir" value="dist"/>
    <property name="temp.dir" value="temp"/>
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>

    <delete dir="${temp.dir}"/>
    <mkdir dir="${temp.dir}"/>

    <jar destfile="${temp.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>

        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>

    <delete dir="${store.dir}"/>

    <Zip destfile="${store.jar}">
        <zipfileset src="${temp.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </Zip>

    <delete dir="${temp.dir}"/>

</target>
  1. Accédez au fichier build.xml situé à la racine de votre projet et ajoutez le code juste avant la balise </project> à la fin.

  2. Modifiez maintenant la valeur du premier champ de propriété comme commenté et enregistrez les modifications.

  3. A partir de maintenant, chaque fois que vous nettoyerez et construirez votre projet, le fichier jar complet avec les dépendances sera généré dans le dossier dist du projet

2
Deniz Celebi

la solution de user1016588 fonctionne pour moi. Il y a une faute de frappe: cette ligne devrait être zipfileset src = "dist/lib/commons-io-1.4.jar" excludes = "META-INF/*" 

1
Gang Su

C'est ce qui a fonctionné pour moi:

J'ai intégré la fonctionnalité d'exportation Excel à mon projet. Les 2 fichiers .jars externes que j'ai utilisés à cette fin étaient jxl.jar et sx.jar. 

Décompressez ces 2 fichiers JAR dans un dossier (classes Java) en utilisant 7-Zip sans aucun fichier META. Décompressez le fichier de votre projet dans le même dossier, y compris le fichier META.

Re-Pack tout le dossier des classes Java en utilisant JARMaker pour recréer votre projet .jar dans son dossier de distribution d'origine ... et voilà ... toutes les fonctionnalités d'Excel.

1
user2270400

Essayez ceci - dans l'EDI Netbeans:

  1. Allez dans Outils -> Bibliothèques
  2. Dans la boîte de dialogue, en bas à gauche, cliquez sur "Nouvelle bibliothèque", nommez-le.
  3. Sur le côté droit, cliquez sur "Ajouter un fichier JAR/dossier" 
  4. Cliquez sur OK en bas à droite
  5. Redémarrez le IDE et vérifiez. 
1
vfredrick

Suivez ces étapes: - 1. Faites un clic droit sur le projet ouvert dans l'éditeur Netbeans 2. sélectionnez propriétés 3. choisissez des bibliothèques 4. Ajouter le bocal 5. cliquez sur OK

0
myskons

Vous pouvez également utiliser ceci (lorsque les bibliothèques ne sont pas dans "dist/lib"), testé avec NetBeans et ant-contrib:

	<target name="-post-jar">
		<taskdef resource="net/sf/antcontrib/antlib.xml">
		  <classpath>
			<!-- Path to ant-contrib -->
			<pathelement location="../../Libs/ant-contrib-1.0b3.jar"/>
		  </classpath>
		</taskdef>

		<!-- Change the value to the name of the final jar without .jar -->
		<property name="store.jar.name" value="${application.title}"/>

		<!-- don't edit below this line -->
		<property name="store.dir" value="dist"/>
		<property name="temp.dir" value="temp"/>
		<property name="temp.libs.dir" value="temp/libs"/>
		<property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

		<echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
		
		<fileset id="store.jars.absolute" dir="${store.dir}" includes="*.jar"/>		
		<pathconvert property="store.jars.relative" refid="store.jars.absolute" dirsep="/">
			<map from="${basedir}/" to=""/>
		</pathconvert>
		
		<for list="${store.jars.relative}" param="item">
			<sequential>
				<echo message="Adding @{item} into single JAR at ${store.jar}"/>
			</sequential>
		</for>

		<delete dir="${temp.dir}"/>
		<mkdir dir="${temp.dir}"/>
		
		<for list="${javac.classpath}" param="item" delimiter=":">
			<sequential>
				<echo message="Adding @{item} into single JAR at ${store.jar}"/>
				<copy file="@{item}" todir="${temp.libs.dir}" overwrite="true" />
			</sequential>
		</for>

		<jar destfile="${temp.dir}/temp_final.jar" filesetmanifest="skip">
			<zipgroupfileset dir="${store.dir}" includes="*.jar"/>
			<zipgroupfileset dir="${temp.libs.dir}" includes="*.*"/>

			<manifest>
				<attribute name="Main-Class" value="${main.class}"/>
			</manifest>
		</jar>

		<delete dir="${store.dir}"/>

		<Zip destfile="${store.jar}">
			<zipfileset src="${temp.dir}/temp_final.jar" excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
		</Zip>

		<delete dir="${temp.dir}"/>

	</target>

0
user2830808