Je ne parviens pas à compiler et à exécuter mon code Java, destiné à me permettre d'interfacer Java avec un objet partagé pour Vensim, un logiciel de modélisation de simulation.
Le code suivant compile sans erreur:
javac -d . -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.Java VensimHelper.Java VensimException.Java VensimContextRepository.Java
Cependant, lorsque j'essaie d'exécuter ce qui suit:
Java -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
J'ai l'erreur suivante: "Erreur: impossible de trouver ou de charger la classe principale SpatialModel". Mon code SpatialModel.Java contient une méthode 'principale' (ci-dessous). Je ne suis donc pas sûr du problème. Quelqu'un peut-il m'aider, s'il vous plaît? Merci.
import Java.io.File;
import Java.text.NumberFormat;
import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;
import org.Apache.log4j.Logger;
public class SpatialModel {
private VensimHelper vh;
public static final String DLL_LIBNAME_PARAM = "vensim_lib_nam";
public static final String MODEL_PATH_PARAM = "vensim_model_path";
private final static int VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT = 10;
public SpatialModel() throws SpatialException {
String libName = System.getProperty(DLL_LIBNAME_PARAM);
String modelPath = System.getProperty(MODEL_PATH_PARAM);
if(libName == null || libName.trim().equals("")) {
log.error("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);
throw new SpatialException("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);
}
if(modelPath == null || modelPath.trim().equals("")) {
log.error("Model path has to set with -D" + MODEL_PATH_PARAM);
throw new SpatialException("Model path ahs to be set with -D" + MODEL_PATH_PARAM);
}
for (int i = 0; i < VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT && vh == null; i++) {
try {
log.info("creating new vensim helper\n\tdll lib: " + libName + "\n\tmodel path: " + modelPath);
vh = new VensimHelper(libName, modelPath);
} catch (Throwable e) {
log.error("An exception was thrown when initializing Vensim, try: " + i, e);
}
}
if (vh == null) {
throw new SpatialException("Can't initialize Vensim");
}
}
public static void main(String[] args) throws VensimException {
long before = System.currentTimeMillis();
String libName = System.getProperty(DLL_LIBNAME_PARAM);
String modelPath = System.getProperty(MODEL_PATH_PARAM);
if (libName == null) {
libName = "libvensim";
}
if(modelPath == null) {
modelPath = "~/BassModel.vmf";
}
System.setProperty(DLL_LIBNAME_PARAM, libName);
System.setProperty(MODEL_PATH_PARAM, modelPath);
if (args.length > 0 && args[0].equals("info")) {
System.out.println(new VensimHelper(libName, modelPath).getVensimInfo());
} else if (args.length > 0 && args[0].equals("vars")) {
VensimHelper helper = new VensimHelper(libName, modelPath);
String[] vars = helper.getVariables();
for (String var : vars) {
System.out.println(helper.getVariableInfo(var));
}
} else {
File f = new File(".");
System.out.println(f.getAbsolutePath());
SpatialModel sm = new SpatialModel();
}
System.out.println("Execution time: " + (System.currentTimeMillis() - before));
}
}
Vous devez vous assurer que vous ajoutez l'emplacement de votre fichier .class
à votre chemin de classe. Donc, si c'est dans le dossier actuel, ajoutez .
à votre chemin de classe. Notez que le séparateur de chemin de classe Windows est un point-virgule, c’est-à-dire un ;
.
Si la classe est dans un package
package thepackagename;
public class TheClassName {
public static final void main(String[] cmd_lineParams) {
System.out.println("Hello World!");
}
}
Puis en appelant:
Java -classpath . TheClassName
résulte en Error: Could not find or load main class TheClassName
. En effet, il doit être appelé avec son nom complet:
Java -classpath . thepackagename.TheClassName
Et ce répertoire thepackagename
doit exister dans le chemin de classe. Dans cet exemple, .
, signifiant le répertoire en cours, représente l'intégralité du chemin de classe. Par conséquent, cet exemple particulier doit être appelé à partir du répertoire dans lequel thepackagename
existe.
Pour être clair, le nom de cette classe n'est pas TheClassName
, c'est thepackagename.TheClassName
. Tenter d'exécuter TheClassName
ne fonctionne pas, car aucune classe portant ce nom n'existe. Pas sur le classpath actuel de toute façon.
Enfin, notez que la version compilée (. Class) est exécutée et non la version du code source (. Java). D'où "CLASSPATH".
Vous pouvez essayer ces deux quand vous obtenez le message d'erreur: 'Impossible de trouver ou de charger la classe principale'
Si votre fichier de classe est enregistré dans le répertoire suivant avec HelloWorld
nom du programme d:\sample
Java -cp d:\sample HelloWorld
Java -cp . HelloWorld
Je crois que vous devez ajouter le répertoire en cours au chemin de classe Java
Java -cp .:./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
Vous devez inclure classpath à vos commandes javac et Java
javac -cp . PackageName/*.Java
java -cp . PackageName/ClassName_Having_main
supposons que vous ayez ce qui suit
Paquet nommé: com.test Nom de classe: Hello (le fichier principal) est situé dans "src/com/test/Hello.Java"
depuis l'annuaire extérieur:
$ cd src
$ javac -cp . com/test/*.Java
$ Java -cp . com/test/Hello
Si vous travaillez dans Eclipse, effectuez simplement un nettoyage (project\clean..
clean all projects
) du projet.
Vous devez définir le chemin de classe si vous obtenez l'erreur:
Impossible de trouver ou de charger la classe principale XYZ
Par exemple:
E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin"
E:\>set classpath=%classpath%;.;
E:\>javac XYZ.Java
E:\>Java XYZ
J'ai eu cette erreur parce que j'essayais de courir
javac HelloWorld.Java && Java HelloWorld.class
quand j'aurais dû enlever .class
:
javac HelloWorld.Java && Java HelloWorld
Vérifiez votre BuildPath
, il est possible que vous référeniez une bibliothèque qui n’existe plus.
Si vous essayez d'exécuter une application Java qui nécessite JDK 1.6 et que vous essayez de l'exécuter sur JDK 1.4, vous rencontrerez cette erreur. En général, essayer d'exécuter une application Java sur un ancien JRE peut échouer. Essayez d'installer le nouveau JRE/JDK.
Je sais que cette question a été étiquetée avec linux, mais sur windows , vous devrez peut-être séparer vos arguments cp avec un ;
au lieu d'un :
.
Java -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar;./vensim.jar SpatialModel vars
http://docs.Oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
Si vous obtenez cette erreur et que vous êtes en utilisant Maven pour construire vos fichiers JAR, il y a de fortes chances que vous n'ayez tout simplement pas vos classes Java dans src/main/Java/
.
Dans mon cas, j'ai créé mon projet dans Eclipse dont la valeur par défaut est src
(plutôt que src/main/Java/
.
Je me suis donc retrouvé avec quelque chose comme mypackage.morepackage.myclass
et une structure de répertoires ressemblant à src/mypackage/morepackage/myclass
, qui n'a fondamentalement rien à redire. Mais lorsque vous exécuterez mvn clean install
, il recherchera src/main/Java/mypackage/morepackage/myclass
. Il ne trouvera pas la classe mais ne commettra pas d'erreur non plus. Donc, il va réussir à construire et lorsque vous exécutez votre fichier jar généré, le résultat est le suivant:
Error: Could not find or load main class mypackage.morepackage.myclass
Parce que cela n'a tout simplement jamais inclus votre classe dans le pot emballé.
Java -verbose:class HelloWorld
pourrait vous aider à comprendre quelles classes sont chargées.
En outre, comme mentionné précédemment, rappelez-vous d'appeler le nom qualifié complet (c'est-à-dire, package inclus).
Projet> Nettoyer, puis assurez-vous que BuildPath> Libraries a la bonne bibliothèque.
Le problème ne concerne pas votre fonction principale. Départ pour
javac -d . -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.Java VensimHelper.Java VensimException.Java VensimContextRepository.Java
sortie et exécutez-le.
Si vous utilisez Eclipse ... j'ai renommé mon fichier de classe principal et j'ai cette erreur. Je suis allé à "Run As" configurator et sous le chemin de classe pour ce projet, il avait répertorié les deux fichiers dans le chemin de classe. J'ai supprimé l'ancienne classe que j'ai renommée et j'ai quitté la classe portant le nouveau nom. Elle a été compilée et fonctionne parfaitement.
Si simple que beaucoup de gens pensent, moi inclus :)
cd to Project Folder/src/package
vous devriez y voir yourClass.Java puis lancer javac yourClass.Java
ce qui créera yourClass.class puis cd du src
et dans le build
, vous pouvez y exécuter Java package.youClass
J'utilise le terminal sur Mac ou vous pouvez accomplir la même tâche à l'aide de l'invite de commande sous Windows
Ce problème s'est produit lorsque j'ai importé un projet existant dans Eclipse. Qu'est-ce qui se passe est-il copié tous les fichiers pas dans le package, mais en dehors du package. Par conséquent, lorsque j'ai essayé d'exécuter> les configurations d'exécution, il n'a pas pu trouver la méthode principale car elle ne figurait pas dans le package. Tout ce que je fis fut de copier les fichiers dans le paquet et Eclipse fut alors capable de détecter la méthode principale. Assurez-vous donc qu'Eclipse trouve votre méthode principale en vous assurant que vos fichiers Java se trouvent dans le bon package.
J'utilisais Java 1.8, et cette erreur s'est produite lorsque j'ai appuyé sur "Construire et nettoyer" dans NetBeans. J'ai brièvement basculé de nouveau à 1,7, cliqué sur OK, rouvert les propriétés et suis revenu à 1,8, et tout a fonctionné à la perfection.
J'espère pouvoir aider quelqu'un avec cela, car ces erreurs peuvent prendre beaucoup de temps.
J'ai un problème similaire dans Windows, il est lié au classpath. A partir de la ligne de commande, naviguez jusqu'au répertoire où se trouve votre fichier Java (* .Java et * .class), puis réessayez avec vos commandes.
J'utilise Anypoint Studio (un IDE basé sur Eclipse). Dans mon cas, tout a bien fonctionné, jusqu'à ce que je découvre qu'en exécutant le code Java, quelque chose de totalement différent est exécuté. Ensuite, j'ai supprimé les fichiers .class. Après ce point, j'ai reçu le message d'erreur du titre de cette question. Nettoyer le projet n'a pas résolu le problème.
Après avoir redémarré le IDE, tout a bien fonctionné.
Cela a résolu le problème pour moi aujourd'hui:
cd /path/to/project
cd build
rm -r classes
Puis nettoyez et construisez-le et exécutez les fichiers individuels dont vous avez besoin.