Est-il possible de spécifier un classpath
Java incluant un fichier JAR contenu dans un autre fichier JAR?
Réponses
Trop de publicités?Si vous essayez de créer un seul bocal qui contient votre application et il est nécessaire de bibliothèques, il y a deux façons (que je connais) pour ce faire. Le premier est Un Pot, qui utilise un chargeur de classe pour permettre l'imbrication des jarres. La deuxième est UberJar, (ou à l'Ombre), qui explose les bibliothèques incluses et met toutes les classes dans le bocal.
Je devrais aussi mentionner que UberJar et de l'Ombre sont des plugins pour Maven1 et Maven2, respectivement. Comme mentionné ci-dessous, vous pouvez également utiliser l'assemblée plugin (qui en réalité est beaucoup plus puissant, mais beaucoup plus difficile à configurer correctement).
Vous ne voulez PAS utiliser ces "exploser POT de contenu des solutions". Ils ont certainement rendre plus difficile de voir les choses (puisque tout est explosé au même niveau). En outre, il pourrait y avoir des conflits de noms (qui ne devrait pas arriver si les gens à utiliser de façon appropriée des paquets, mais vous ne pouvez pas toujours contrôler ce).
La fonctionnalité que vous souhaitez est l'un des 25 meilleurs de Soleil RFEs: RFE 4648386, où le Soleil, dans leur infinie sagesse, a désigné comme étant de faible priorité. Nous ne pouvons qu'espérer que le Soleil se réveille...
En attendant, la meilleure solution que j'ai trouver (je souhaite que le Soleil se copie dans le JDK) est d'utiliser la classe personnalisée chargeur JarClassLoader.
Après quelques recherches, j'ai trouvé la méthode qui ne nécessite pas de maven ou d'un 3ème partie de l'extension/programme.
Vous pouvez utiliser des "Class-Path" dans votre fichier de manifeste.
Par exemple:
Créer le fichier de manifeste MANIFESTE.MF
Manifest-Version: 1.0
Created-By: Bundle
Class-Path: ./custom_lib.jar
Main-Class: YourMainClass
La compilation de tous vos classes et exécutez jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar
c
est synonyme de création de l'archive
f
indique que vous souhaitez spécifier un fichier
v
est verbeux entrée
m
signifie que nous allons passer les fichier manifeste personnalisé
Assurez-vous que vous avez inclus lib dans le bocal paquet. Vous devriez être en mesure d'exécuter le jar de la façon normale.
basé sur: http://www.ibm.com/developerworks/library/j-5things6/
Utiliser le zipgroupfileset tag (utilise les mêmes attributs qu'un fileset tag); il va décompresser tous les fichiers dans le répertoire et les ajouter à votre nouveau fichier d'archive. Plus d'informations: http://ant.apache.org/manual/Tasks/zip.html
C'est un moyen très utile pour contourner le pot-en-pot de problème -- je le sais parce que j'ai googlé ce exact StackOverflow question, tout en essayant de comprendre ce qu'il faut faire. Si vous souhaitez emporter un pot ou dans un dossier de bocaux dans votre construit un pot avec de l'Ant, alors oubliez tous ce chemin de classe ou d'un tiers des trucs plugin, tout ce que vous devez faire est de cette (Ant):
<jar destfile="your.jar" basedir="java/dir">
...
<zipgroupfileset dir="dir/of/jars" />
</jar>
Si vous créez avec ant (je suis en utilisant ant de l'éclipse), vous pouvez simplement ajouter un petit pot de fichiers en disant ant à ajouter... Pas nécessairement la meilleure méthode si vous avez un projet maintenu par plusieurs personnes, mais il fonctionne pour une personne de projet et est facile.
par exemple, mon objectif qui était de construire le .le fichier jar est:
<jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
<manifest>
<attribute name="Author" value="ntg"/>
................................
<attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
</manifest>
</jar>
J'ai juste ajouté une ligne à faire:
<jar ....">
<zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
<manifest>
................................
</manifest>
</jar>
où
<property name="external-lib-dir" value="C:\...\eclipseWorkspace\Filter\external\...\lib" />
a la dir avec l'extérieur des pots. Et c'est tout...