web-dev-qa-db-fra.com

Groovy: Impossible de résoudre la classe

Lorsque j'exécute mon script Groovy via la ligne de commande ou Jenkins, l'erreur "incapable de résoudre la classe" s'affiche.

J'ai les 2 fichiers groovy suivants dans le même dossier dans C:\Utilisateurs\myuser\git\nom_produit\mycompany-build\src\main\groovy\com\mycompany\build

Foo.groovy

package com.mycompany.build

class Foo {

  Foo() {
  }

  public void runBar() {
    Bar bar = new Bar();
    bar.name = "my name";
    System.out.println(bar.name);
  }

  static void main(String[] args) {
    Foo foo = new Foo();
    foo.runBar()
  }
}

Bargroovy

package com.mycompany.build

class Bar {
  String name;
}

Je lance Foo.groovy en utilisant la ligne de commande.

Je suis situé dans le répertoire suivant lorsque je lance Groovy:

C:\Users\myuser\git\productname\mycompany-build\src\main\groovy\com\mycompany\build

Voici ce que j'entre dans la ligne de commande (cmd):

C:/Java/tools/groovy-2.4.11/bin/groovy -cp C:/Users/myuser/git/myproject/mycompany-build/src/main/groovy/com/mycompany/build Foo.groovy

Je reçois le message suivant lorsqu'il est impossible de trouver la classe "Bar", mais que le fichier Bar.groovy se trouve dans le même répertoire que Foo.groovy, sans mentionner que je spécifie également le -cp.

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
C:\Users\myuser\git\myproject\mycompany-build\src\main\groovy\com\mycompany\build\Foo.groovy: 9: unable to resolve class Bar
 @ line 9, column 9.
       Bar bar = new Bar();
           ^

C:\Users\myuser\git\myproject\mycompany-build\src\main\groovy\com\mycompany\build\Foo.groovy: 9: unable to resolve class Bar
 @ line 9, column 15.
       Bar bar = new Bar();
                 ^

2 errors

Pouvez-vous s'il vous plaît indiquer comment je peux obtenir cette exécution à partir de la ligne de commande?

Une fois que je serai capable de faire fonctionner ça, je prévois de le faire dans un job de Jenkins. J'ai commencé à essayer d'exécuter ceci dans un travail Jenkins, mais le problème est le même qui m'a amené à regarder d'abord le lancer à partir de la ligne de commande.

J'ai essayé cela avec des barres obliques et des barres obliques inverses, mais sans différence de comportement.

3
Glen

Votre problème d'utilisation de classpath et de package.

Pour que ça marche 

1. si votre classe est déclarée dans un paquet com.mycompany.build, alors groovy/Java le cherchera dans le dossier com/mycompany/build par rapport à classpath. vous devez donc exclure les dossiers de paquets de votre chemin de classe:

groovy -cp C:\Users\myuser\git\productname\mycompany-build\src\main\groovy Foo.groovy

2. vous pouvez supprimer la déclaration de package dans les deux classes. dans ce cas, groovy/Java recherchera des classes sans préfixe de dossier de paquet dans votre chemin de classe: C:\Users\myuser\git\productname\mycompany-build\src\main\groovy\com\mycompany\build et votre commande devrait fonctionner . Si votre dossier actuel est un dossier avec des classes groovy, alors la commande pourrait être plus simple:

groovy -cp . Foo.groovy
2
daggett

Selon le docs , dans classpath, vous ne pouvez avoir que les fichiers .jar, .Zip et .class. La classe Bar ne peut pas être résolue car il s'agit d'un fichier .Java, et non d'une classe compilée Java (.class). 

Ce qui suit fonctionne pour moi:

C:/Java/tools/groovy-2.4.11/bin/groovyc Bar.groovy
C:/Java/tools/groovy-2.4.11/bin/groovy Foo.groovy
my name

Notez également que, puisque Bar.class est dans le même dossier que Foo.groovy, vous n'avez pas besoin de spécifier le chemin d'accès aux classes.

1
Andrew

Je pense que vous avez juste besoin de définir l'argument classpath dans le répertoire contenant les classes, c'est-à-dire celui avec productname par opposition à myproject

C:/Java/tools/groovy-2.4.11/bin/groovy -cp C:\Users\myuser\git\productname\mycompany-build\src\main\groovy\com\mycompany\build Foo.groovy
0
Mike W