2008-12-01 16 views
3

J'ai essayé d'exécuter un fichier jar - appelons-le test.jar - qui utilise Sybase jconn3.jar sur un système Unix.Java Manifest.mf classpath issues

J'ai créé un fichier MANIFEST.MF qui a les éléments suivants:

Class-Path: $SYBASE/jConnect-6_0/classes/jconn3.jar commons-net-1.3.0.jar 

Cela donne une ClassNotFoundError. $ SYBASE est la variable système qui pointe vers/opt/sybase13; J'ai aussi essayé ce qui suit:

Class-Path: /opt/sybase13/jConnect-6_0/classes/jconn3.jar commons-net-1.3.0.jar 

et

Class-Path: opt/sybase13/jConnect-6_0/classes/jconn3.jar commons-net-1.3.0.jar 

Cependant, si je copie le fichier jconn3.jar des SYBASE $/jConnect-6_0/classes le même répertoire que test. jar, et mettre à jour mon MANIFEST.MF pour lire comme suit:

Class-Path: jconn3.jar commons-net-1.3.0.jar 

L'application s'exécute comme prévu.

Maintenant, j'ai été en mesure de vérifier le fichier jconn3.jar fonctionne en le copiant localement; mon fichier MANIFEST.MF inclut le chemin vers ma Main-Class, donc ce n'est pas en cause ici.

Selon vous, quel pourrait être le problème? Je regarde cette chose depuis trop longtemps maintenant. Merci!

+0

Je suppose que ce JAR contient votre pilote de base de données; Il est assez courant qu'une application crée son propre java.net.URLClassLoader pour récupérer des classes de pilotes dans une classe spécifiée via une configuration d'application. – erickson

+0

Pourquoi ne pas simplement ajouter le fichier jar au script de démarrage de l'application. La plupart des serveurs d'applications ont une partie spéciale où placer ces jars supplémentaires. – OscarRyz

Répondre

11

Les entrées du chemin d'accès à la classe sont soit relatives au fichier JAR dans lequel elles sont incorporées (que vous utilisez), soit en tant qu'URL. Pour rendre vos chemins absolus fonctionnent, vous aurez besoin de les convertir à l'URL, par exemple,

file:/opt/sybase13/...

Il n'y a aucun mécanisme pour l'utilisation de variables.

Bien que la spécification JAR ne le dise pas clairement, les URL file: absolus fonctionnent dans l'attribut class-path.

+0

Cela semble fonctionner pour le moment.Je souhaite qu'il y ait une solution plus flexible disponible avec le fichier Manifest par défaut (puisque le serveur Prod a un chemin différent pour ce fichier par rapport au serveur de développement), mais il sera opérationnel pour le moment. Merci! –

+0

Nick: Si vous le pouvez, essayez d'utiliser des liens symboliques. Thnks à Erickson, cependant. Fonctionne bien, bien que j'utilise habituellement trois barres obliques (fichier: /// opt/sybase) car sinon la partie "host" est manquante et certains outils en ont besoin. –

+0

"Pour que vos chemins absolus fonctionnent" - Cela fonctionne-t-il toujours avec Java 8? Je ne peux pas obtenir des chemins absolus pour travailler, avec ou sans le préfixe "file: //". – Itai

0

Les variables d'environnement ne sont pas lues par le chargeur de classe AFAIK. Cependant, vous pouvez ajouter le pot dans un script de configuration

Accoding à la spécification des entrées sont des parents à la jarre pas absolue:

Class-Path:

La valeur de cet attribut spécifie le parent Les URL des extensions ou des bibliothèques dont cette application ou cette extension a besoin. Les URL sont séparées par un ou plusieurs espaces. Le chargeur de classe d'application ou d'extension utilise la valeur de cet attribut pour construire son chemin de recherche interne.

http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html #Manifest Spécification