2008-11-21 6 views
2

J'ai compilé un projet java dans un fichier Jar et j'ai des problèmes pour l'exécuter.Problème lors de l'exécution d'un fichier Jar

Quand je lance:

java -jar myJar.jar 

que je reçois l'erreur suivante

Could not find the main class: myClass 

Le fichier de classe ne sont pas dans le répertoire racine du pot, donc j'ai essayé de changer le chemin du principal classe pour correspondre au chemin d'accès au fichier de classe et je reçois le même problème.

Est-ce que je devrais aplatir la structure de fichier? Si oui, comment puis-je faire cela? J'utilise Ant pour construire le fichier Jar si c'est utile.

MISE À JOUR

Voici le contenu du pot et les sections pertinentes Ant, j'ai changé le nom de l'entreprise où je travaille à « org »:

META-INF/ 
META-INF/MANIFEST.MF 
dataAccessLayer/ 
dataAccessLayer/databaseTest.class 
org/ 
org/eventService/ 
org/eventService/DatabaseObject.class 
org/eventService/DatabaseObjectFactory.class 
org/eventService/DbEventClientImpl$HearBeatMonitor.class 
org/eventService/DbEventClientImpl.class 
org/eventService/EmptyQueryListException.class 
org/eventService/EventHandlerWorkItem.class 
org/eventService/EventProcessor.class 
org/eventService/EventTypeEnum.class 
org/eventService/EventWorkQueue$MonitorThread.class 
org/eventService/EventWorkQueue$PoolWorker.class 
org/eventService/EventWorkQueue.class 
org/eventService/FailedToLoadDriverException.class 
org/eventService/IConnectionFailureListener.class 
org/eventService/InvalidEventTypeException.class 
org/eventService/JdbcInterfaceConnection.class 
org/eventService/NullArgumentException.class 
org/eventService/OracleDatabaseObject.class 
org/eventService/ProactiveClientEventLogger.class 
org/eventService/ProactiveClientEventLoggerException.class 
org/eventService/PropertyMap.class 
org/eventService/SQLServerDatabaseObject.class 
org/eventService/TestHarness.class 
org/eventService/Utilities.class 

Et la cible ant:

<target name="compile" depends="init" description="compile the source "> 
    <javac srcdir="src" destdir="bin" classpathref="project.class.path"/> 
</target> 
<target name="buildjar" description="build jar file" depends="compile"> 
    <mkdir dir="dist"/> 
    <jar destfile="dist/myJar.jar" basedir="bin" includes="**/*.class" > 
     <manifest> 
      <attribute name="Main-Class" value="org.eventService.ProactiveClientEventLogger"/> 
     </manifest> 
    </jar> 
</target> 
+0

nous Afficher le contenu du manifeste. Si ce n'est pas trop grand, montrez-nous la liste du fichier jar. –

+0

Montrez-nous le contenu du manifeste, pas seulement la tâche de fourmis qui le crée. –

+0

Que contient votre fichier MANIFEST.MF? Est-ce que org.eventService.ProactiveClientEventLogger a une méthode main()? – mipadi

Répondre

6

Dans votre fichier manifeste, assurez-vous que l'attribut Main-Class correspond au nom de la classe con soutenant votre méthode main(). Par exemple, si le nom qualifié du package de la classe est my.cool.Class, alors, dans votre manifeste JAR, Main-Class doit être défini sur my.cool.Class.

Vérifiez également que vous avez une déclaration de package dans vos fichiers .java (par exemple, dans Class.java, assurez-vous d'avoir la déclaration package my.cool; appropriée). Assurez-vous également que votre hiérarchie de répertoires est configurée correctement (my.cool.Class doit être dans $SRC/my/cool/Class.java).

+0

J'ai fait tout ça ... et ça ne marche toujours pas ... Bien que j'aie utilisé des slashed et non des points pour les supprimer. il ne fonctionne pas avec des points non plus ... –

+0

Les fichiers manifestes sont très pointilleux sur la capitalisation, les espaces blancs et ainsi de suite. Assurez-vous que vos lignes sont correctement terminées si la ligne de la classe principale est la dernière. – jcoder

4

Vous devez indiquer votre classe principale lors de la création de pot avec le chemin complet, quelque chose comme:

<target name="jar" depends="compile"> 
    <delete file="myJar.jar"/> 
    <delete file="MANIFEST.MF"/> 
    <manifest file="MANIFEST.MF"> 
     <attribute name="Main-Class" value="my.package.myClass"/> 
    </manifest> 

    <jar destfile="myJar.jar" 
      basedir="." 
      includes="**/*.class" 
      manifest="MANIFEST.MF" /> 
</target> 
Questions connexes