2011-01-21 4 views
7

Je dois utiliser des jarres supplémentaires pendant l'exécution du programme. J'ajoute manuellement les jars dans le dossier relatif .lib puis j'exécute le programme. Comment dois-je définir le classpath dans le fichier manifeste?Comment utiliser l'expression régulière dans le classpath de Java?

+0

J'ai une solution! Je vais inclure des variables comme: Class-Path: lib/externaljar1.jar lib/externaljar2.jar etc jusqu'à 5 ou 10 valeurs. Puis, tout en incluant des fichiers jars pendant l'exécution, ill le renommez simplement comme externaljar1, externaljar2 etc. et copiez-le dans le dossier lib. ;-) – Suraj

+0

Je remercie tous1 qui ont répondu à ma requête. Merci beaucoup! – Suraj

Répondre

11

Vous ne pouvez pas utiliser d'expressions régulières ou d'autres caractères génériques dans l'attribut Class-Path de votre manifeste.

Il n'y a qu'un seul caractère générique pris en charge en Java, et qui ne fonctionne que sur si elle est spécifiée sur la ligne de commande sur un « manuel » java invocation (à savoir ne pas utiliser -jar): using directoryname/*.

+0

Existe-t-il une autre approche que d'utiliser la commande -cp ou la fonction classloader? – Suraj

+0

@Suraj: demander d'autres approches sans nous dire pourquoi ces approches ne sont pas bonnes pour vous est ... plutôt inutile. Et personnellement, je le trouve plutôt grossier aussi. –

+0

Désolé pour ça! En fait, je suis en train de programmer le code pour une approche conviviale et de déployer la même chose dans un fichier exécutable. C'est d'avoir une base de données générique où l'utilisateur peut choisir sa base de données. Par conséquent, il doit spécifier le pot de connectivité nécessaire et le mettre dans le dossier accessible du programme. Je pensais que si je pouvais utiliser l'expression régulière dans un classpath manifeste comme lib/* OR lib/*. Jar, de sorte que lorsque le programme s'exécute, il trouve tous les jars. – Suraj

2

Je ne suis pas trop sûr de ce que vous voulez exactement, mais vous pouvez ajouter des pots lors de l'exécution:

    liste
  • fichiers (pot) en utilisant File.list() sur le répertoire contenant les pots
  • faire une expression régulière sur les noms de fichiers que vous récupérez
  • utiliser un URLClassLoader pour charger le pot

Je ne sais pas comment enregistrer exactement (le cas échéant) les URLClassLoaders au classloader principal. Mais c'est comme ça que je pense que j'irais.

+2

Vous ne pouvez pas modifier le chargeur de classe bootstrap dans la spécification (il existe des hacks laids qui peuvent le faire, en utilisant 'addURL()'). La solution conforme à la spécification consisterait simplement à placer la classe de boostrapping dans son propre pot, à l'utiliser pour trouver tous les autres jars (y compris le «vrai» pot principal) et à charger tous ceux dans un chargeur de classe. Appelez ensuite la méthode principale réelle à partir de la classe principale réelle. –