2016-07-22 2 views
0

J'essaye de faire une construction sans tête qui nécessite des tâches spécifiques à l'éclipse.ANT eclipse headless build - java.lang.NoClassDefFoundError

Pour lancer le fichier de construction ant, j'utilise la commande suivante. Je le fais de cette façon parce que je crois qu'il me permet d'exécuter des tâches éclipse qui se plaignaient auparavant d'avoir besoin d'un espace de travail pour fonctionner. Si cela est incorrect/s'il y a un meilleur moyen, s'il vous plaît informez-moi.

Mon script batch:

java -jar %EQUINOX_LAUNCHER_JAR% -application org.eclipse.ant.core.antRunner -buildfile %ANT_SCRIPT_JAR% -data %WORKSPACE_PATH% 

intérieur de ma fourmi buildfile, je dois définir une tâche:

<taskdef name="myTask" classname="path.to.class.with.execute"><classpath><pathelement location="path\to\dependency.jar"/></classpath></taskdef> 

Lors de l'exécution

<myTask/> 

Je reçois

java.lang.NoClassDefFoundError: path/to/class/that/I/tried/to/import 
+0

Les seules possibilités sont que soit le chemin au .jar est faux, ou le nom de la classe est faux. Le chemin vers le .jar est-il un chemin relatif? Si oui, est-ce relatif au fichier de construction? Etes-vous en train de spécifier une base de remplacement pour le projet? Avez-vous revérifié que le .jar contient la classe? – VGR

+0

Tous les chemins sont absolus. Corrigez-moi si je me trompe, mais comme la tâche s'exécute mais reçoit une erreur, je crois que cela signifie que mon nom de classe est correctement configuré. Je ne crois pas que j'ai mis en place une base de rechange – David

+0

Donc le NoClassDefFoundError ne fait pas référence à la classe de la tâche elle-même? – VGR

Répondre

1

Les classes utilisées par le code de votre tâche doivent figurer dans le chemin de classe. Une option consiste à les ajouter explicitement au classpath lors de la définition de la tâche:

<taskdef name="myTask" classname="path.to.class.with.execute"> 
    <classpath> 
     <pathelement location="path/to/dependency.jar"/> 
     <pathelement location="path/to/transitive-dependency.jar"/> 
     <pathelement location="path/to/other-transitive-dependency.jar"/> 
    </classpath> 
</taskdef> 

Si tous les fichiers .jar sont dans le même arborescence, vous pouvez réduire à:

<taskdef name="myTask" classname="path.to.class.with.execute"> 
    <classpath> 
     <fileset dir="path/to/dir" includes="**/*.jar"/> 
    </classpath> 
</taskdef> 

un autre Il est possible d'ajouter un attribut Class-Path au manifeste du fichier .jar qui contient la classe de tâche. La valeur de l'attribut est une liste d'URL relatives séparées par des espaces, leur base implicite étant le fichier .jar où réside le manifeste. Par exemple:

Class-Path: transitive-dependency.jar utils/other-transitive-dependency.jar 

Si vous construisez la tâche .jar lui-même dans Ant, vous pouvez spécifier l'attribut de classe Chemin dans jar tâche Ant:

<jar destfile="task.jar"> 
    <fileset dir="classes"/> 
    <manifest> 
     <attribute name="Class-Path" 
      value="transitive-dependency.jar utils/other-transitive-dependency.jar"/> 
    </manifest> 
</jar>