je peux compiler ce code exemple JNA (de l'étape 2 de https://github.com/twall/jna/#getting_started):exemple de programme JNA java.lang.NoClassDefFoundError
package com.sun.jna.examples;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
/** Simple example of JNA interface mapping and usage. */
public class HelloWorld {
// This is the standard, stable way of mapping, which supports extensive
// customization and mapping of Java to native types.
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)
Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
CLibrary.class);
void printf(String format, Object... args);
}
public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
for (int i=0;i < args.length;i++) {
CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
}
}
}
... en utilisant javac -classpath .:jna.jar -g HelloWorld.java
sans erreur. (Je l'ai téléchargé jna.jar et le mettre dans le même répertoire que HelloWorld.java pour l'instant.)
Mais quand je le lance à l'aide java -classpath .:jna.jar HelloWorld
, je reçois:
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/sun/jna/examples/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
Je reçois la même exception exacte sur Mac OS X et Linux.
Comment lancer cette opération?
Lors de la compilation, vous souhaitez également inclure le -d. drapeau aussi pour s'assurer qu'il souffle la base de la structure du répertoire sur le paquet. Sinon, le fichier de classe sera simplement dans le répertoire courant. –
Rob, n'ajouterait pas "-d." lors de la compilation, placez le fichier de classe dans le répertoire courant. Il semble que ce soit par défaut pour le mettre avec le fichier source .java. Pourquoi je ne voudrais pas faire ça? –
@Rob - L'indicateur "-d" spécifie le dossier cible mais n'a rien à voir avec "souffler la structure du répertoire en fonction du paquet". Ce dernier est ** toujours ** le cas. – ChssPly76