J'ai créé un fichier jar contenant tous mes éléments compilés. De plus, mon script de construction de fourmi copie les bibliothèques requises dans un sous-dossier "libs". La structure ressemble à ceci:
MyProgram.jar
libs/
Ainsi, lorsque j'essaye d'exécuter mon programme maintenant, j'obtiens l'erreur suivante:
java -cp ".:/home/user/java/MyProgram/jar/libs" -jar MyProgram.jar
java.lang.ClassNotFoundException: org.postgresql.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at database.PostgresQL.getConnection(PostgresQL.java:38)
at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:19)
at main.Main.calculateCorrelationMatrix(Main.java:51)
at main.Main.main(Main.java:28)
java.lang.NullPointerException
at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:25)
at main.Main.calculateCorrelationMatrix(Main.java:51)
at main.Main.main(Main.java:28)
Pourquoi cela arrive-t-il?
<manifestclasspath>
;
) à la place car le signe deux-points sur Windows est utilisé pour les lettres de lecteur. L'OP a utilisé des deux-points et des barres obliques dans sa question, suggérant qu'ils sont sous Linux ou Mac.Lorsque l'
-jar
option est utilisée, l'-cp
option est ignorée. Le seul moyen de définir le chemin de classe consiste à utiliser le fichier manifeste dans le fichier jar.Il est plus facile d'utiliser simplement l'
-cp
option, d'y ajouter votre fichier jar, puis d'appeler explicitement la classe principale.En outre, en supposant que le
/home/user/java/MyProgram/jar/libs
dossier contient des fichiers jar (par opposition aux fichiers de classe), cela ne fonctionnera pas. Vous ne pouvez pas spécifier un dossier de fichier jar mais devez spécifier chaque fichier jar individuellement dans le chemin de classe (il vaut la peine d'écrire un simple script shell pour le faire pour vous s'il y a un nombre important de jars).la source
C'est un peu délicat. Le script suivant est une tentative d'obtenir le chemin de classe à partir du manifeste du fichier jar, puis de permettre d'ajouter des entrées de chemin de classe supplémentaires. J'ai eu des résultats mitigés avec cela, mais je veux néanmoins partager le script afin qu'il puisse être rendu pleinement fonctionnel ici.
Le script a deux noms
en liant en dur les deux fichiers avec
avec calljar -h, vous pouvez voir l'utilisation.
la source
Pour des tests rapides et ponctuels d'une application, vous pouvez simplement créer un lien symbolique entre les fichiers JAR de dépendance nécessaires dans le répertoire contenant le fichier JAR principal de l'application.
Exemple (pour une application
app.jar
qui utilise la bibliothèque Eclipse SWT, qui dans mon cas a été installée dans/usr/share/java
):la source