web-dev-qa-db-fra.com

Classpath ne fonctionne pas sous Linux

Tout le monde a une idée de la raison pour laquelle cette commande fonctionne correctement sous Windows, mais sous Linux, j'obtiens un jeu ClassNotFoundException game.ui.Main

Java -cp ".;lib/*" game.ui.Main -Xms64m -Xmx128m

ma structure de dossiers ressemble à ceci: lib/- Jars game/- Class files

Ceci est le dernier Java 6.

58
sproketboy

La syntaxe du chemin de classe dépend du système d'exploitation. De Wikipedia :

Étant étroitement associée au système de fichiers, la syntaxe de chemin de classe en ligne de commande dépend du système d'exploitation. Par exemple:

sur tous les systèmes d'exploitation de type Unix (tels que Linux et Mac OS X), la structure de répertoires a une syntaxe Unix, avec des chemins de fichiers séparés séparés par deux points (":").

sous Windows, la structure du répertoire a une syntaxe Windows et chaque chemin de fichier doit être séparé par un point-virgule (";").

Cela ne s'applique pas lorsque le chemin de classe est défini dans des fichiers manifeste, où chaque chemin de fichier doit être séparé par un espace (""), quel que soit le système d'exploitation.

102
peter.murray.rust

Essayez de changer le point-virgule en deux-points.

Le séparateur CLASSPATH dépend de la plate-forme et est identique au caractère renvoyé par Java.io.File.pathSeparatorChar .

26
Mikel

Les chemins sont également importants lors de l'utilisation de chemins de classe dans des scripts destinés à être exécutés sur les deux plates-formes: Windows (c'est-à-dire cygwin) et Linux. Lorsque je fais cela, j'inclus une fonction comme celle-ci pour le chemin de classe. La commande 'cygpath' avec l'option '-w' convertit les chemins en chemins de style Windows. Ainsi, dans cet exemple, "/home/user/lib/this.jar" serait converti en quelque chose comme "C:\Cygwin\home\user\lib\this.jar"

#!/bin/bash

function add_Java_classpath() {
  local LOCAL1=$1
  if [ "$OSTYPE" == cygwin ]; then
    LOCAL1="$(cygpath -C ANSI -w $LOCAL1)"
  fi
  if [ -z "$Java_CLASSPATH" ]; then
    Java_CLASSPATH="$LOCAL1"
  Elif [ "$OSTYPE" != cygwin ]; then
    Java_CLASSPATH="${Java_CLASSPATH}:$LOCAL1"
  else
    Java_CLASSPATH="${Java_CLASSPATH};$LOCAL1"
  fi      
}

add_Java_classpath /home/user/lib/this.jar
add_Java_classpath /usr/local/lib/that/that.jar

Java -cp "${Java_CLASSPATH}" package.Main $@
4
pinkston00

Windows:

Java -cp file.jar;dir/* my.app.ClassName

Linux:

Java -cp file.jar:dir/* my.app.ClassName

Rappel:

  • Le séparateur de chemin Windows est ;
  • Le séparateur de chemin Linux est :
  • Dans Windows si l'argument cp ne contient pas d'espace blanc, les guillemets sont facultatifs
1
Wender