2010-01-22 7 views
3

J'ai regardé here, here, here et .Exécution du programme Java à partir de Python

Bien qu'informatifs, ils n'en avaient tout simplement pas assez pour que je puisse découvrir la racine de mon problème. Mon code n'est pas contenu dans un fichier JAR et le client a demandé que nous ne l'expédions pas en tant que tel.

J'ai construit l'application dans Eclipse et à partir de là, elle fonctionne bien. J'ai mis en place un script qui va modifier la méthode main de l'un des fichiers java à des fins de test. Je veux exécuter l'application en utilisant un appel de Python après que je l'ai modifié. Cependant, à partir de la ligne de commande lorsque je tente d'appeler le programme à l'aide java ou java -cp . je reçois l'erreur suivante:

Exception in thread "main" java.lang.NoClassDefFoundError: DemoAPIFunctionality 
Caused by: java.lang.ClassNotFoundException: DemoAPIFunctionality 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
Could not find the main class: DemoAPIFunctionality. Program will exit. 

Mon projet dépend de plusieurs JARs, qui ne sont pas dans le répertoire racine et un fichier DLL, encore pas dans le répertoire racine. J'espère que c'est lié à l'emplacement de l'un d'entre eux mais je ne suis pas sûr et je fais peu de progrès. Voici DemoAPIFunctionality.java:

public class DemoAPIFunctionality 
{ 
    public final static void main(String[] args) 
    { 
    DemoAPIFunctionality demo = new DemoAPIFunctionality(); 

Je aurait Liste heureusement plus d'informations si elle vous aidera à me aider. (Non, je ne suis pas un agent sportif.) Que dois-je faire pour le faire fonctionner au moins depuis la ligne de commande?

Merci d'avance.

+1

Est-ce que 'DemoAPIFunctionality' est dans un paquet? (Si vous pouvez afficher la source complète, cela vous aidera.) Quelle est votre structure de répertoires et de fichiers? Où résident les fichiers '.class'? –

Répondre

3

Vous n'avez pas mentionné que votre script python compile réellement le fichier source Java après avoir appliqué les modifications. Eclipse le compilera automatiquement (constructeur intégré) mais bien sûr, en dehors de l'EDI, vous devez appeler javac avant de pouvoir exécuter la classe. java ne fonctionnera pas sur les fichiers source.

EDIT

Je ne vous connais pas l'expérience réelle en java - mais c'est comment cela fonctionne habituellement sur la ligne de commande.

En supposant, vous avez une classe java com.example.Hello avec une méthode principale et une structure de fichier comme

/dev/bin/com/example/Hello.class 

vous cd à /dev/bin et faire une java com.example.Hello. Notez que le nom de package (com.example) est toujours mappé à une structure de dossiers (com/example).Si vous faites la commande ci-dessus et java ne peut pas trouver Hello.class dans le dossier ./com/example, alors il lancera le NoClassDefFoundError.

+0

Vous avez tellement raison. Cependant, l'erreur reste. J'utilise le code compilé par Eclipse pour le moment depuis la ligne de commande et je suis en train de faire la même chose. – wheaties

+1

Étrange. Veuillez vérifier que vous êtes bien dans le dossier 'bin' de votre projet lorsque vous exécutez la commande' java DemoAPIFunctionality' et non dans le dossier projet ou 'src' (en supposant que vous ayez une structure de dossier de projet eclipse typique avec' projet/src' pour les sources et 'project/bin' pour les fichiers de classe) –

+0

Ouais, j'étais dans le répertoire bin et pas le src. C'est pourquoi j'ai inclus le tidbit à propos d'autres dépendances JAR et d'une dépendance DLL qui ne sont pas trouvées dans l'arborescence du répertoire bin. – wheaties

4
  1. ayant cours dans le package par défaut (pas de paquet) est découragée
  2. vous devez appeler java -cp . à partir du répertoire racine de votre projet - à savoir le répertoire où se trouve votre fichier .class, ou lorsque vous créez des packages, les répertoire, où réside le sous-répertoire com (org, etc.).
  3. vous devez vous référer à la classe par son nom qualifié complet - c'est-à-dire com.package.ClassName
  4. vous feriez mieux d'utiliser un IDE - à des fins éducatives, il y a BlueJ et JCreator. Eclipse et NetBeans sont plus puissants et complexes.
+0

1. Oui, oui, mauvais moi. Cela va-t-il le réparer? 2. J'ai fait. 3. voir 1 4. alors que construit dans un IDE, ils ne veulent pas la démo en utilisant un IDE. Il est supposé montrer qu'il peut être testé tel quel, en utilisant un script. – wheaties

3

Solution de contournement, indice et raccourci simples. N'utilisez aucun chemin lorsque vous appelez java classname depuis python. par ex. commands.getstatusoutput("java -cp $CLASSPATH clusterize")

Questions connexes