web-dev-qa-db-fra.com

Gradle compileJava ne peut pas trouver de symbole à partir du fichier source

Je suis nouveau avec Gradle, donc il y a une chance que je manque quelque chose d'évident ici. Je travaille sur l'utilisation de Gradle pour la construction automatisée de nos projets. J'ai abordé la plupart d'entre eux, mais l'un me cause des problèmes sans fin. Puisque c'est pour mon entreprise, je ne peux pas partager de vrai code, mais je ferai de mon mieux pour fournir un pseudo-code réaliste.

J'essaie de compiler une application Web avec un frontal flexible et Java back-end. Pour l'instant, je me concentre uniquement sur la création d'un fichier .war avec le Java dedans, alors je vais passer à la compilation flex. Lorsque j'exécute le script build.gradle suivant, cela me donne d'innombrables erreurs "ne peut pas trouver de symbole".

apply plugin: 'Eclipse'
apply plugin: 'war'

sourceCompatibility = 1.6

repositories {
   mavenCentral()
}

sourceSets.main.Java.srcDir 'src'
sourceSets.main.resources.srcDir 'src'

webAppDirName = "WebContent"

war.archiveName "Gradle_test.war"

dependencies {
    compile fileTree(dir: 'WebContent/WEB-INF/lib', include: '*.jar')
    providedCompile 'org.Apache.Tomcat:catalina:6.0.13'
    providedCompile 'org.Apache.Tomcat:dbcp:6.0.13'
}

Un exemple des erreurs qui se produisaient (avec de faux noms de package et de classe):

/Users/user/Documents/Eclipse/ProjectName/src/com/companyName/teamName/projectName/core/release/subProjectName/projectVersion/RenamedObject.Java:385: cannot find symbol
symbol  : class OtherObject
location: class com.companyName.teamName.projectName.core.release.subProjectName.projectVersion.RenamedObject
    public class InnerClass extends OtherObject implements Indexable<String>, Serializable {

La classe InnerClass est déclarée dans le fichier RenamedObject.Java avec la classe RenamedObject. Le symbole qu'il ne trouve pas, OtherObject, ne provient pas d'un .jar. Il s'agit d'un fichier source stocké dans /Users/user/Documents/Eclipse/ProjectName/src/com/companyName/teamName/projectName/core/release/subProjectName/projectVersion/superTypes/OtherObject.Java. L'objet est importé en haut de RenamedObject.Java et peut être construit et exécuté correctement via Eclipse sans aucun paramètre spécial. Ces erreurs se produisent lors de la tâche: compileJava après l'exécution de gradle war du terminal.

Y a-t-il une raison pour laquelle Gradle aurait un problème avec la gestion des importations source à partir d'un sous-package comme celui-ci? Suis-je en train de faire quelque chose de mal? Faites-moi savoir s'il y a plus d'informations qui peuvent vous aider et je vous les fournirai si je le peux.

EDIT: Je l'ai fait fonctionner. Les 130 erreurs ont été résolues avec un seul changement. Si j'ajoute le nom de package complet à OtherObject dans l'extension, cela ressemble à ceci:

public class InnerClass extends com.companyName.teamName.projectName.core.release.subProjectName.projectVersion.superTypes.OtherObject implements Indexable<String>, Serializable {

Ce changement a fait que tout fonctionnait, mais je ne comprends toujours pas la raison. Ce n'est pas la seule référence à OtherObject dans le projet et ce n'est pas le seul endroit où une classe interne étend une classe définie dans un autre package source.

14
JorganPubshire

Symptômes

Impossible d'exécuter la génération à l'aide de la distribution Gradle ' https://services.gradle.org/distributions/gradle-2.8-bin.Zip '

... .... .....

Causé par: org.gradle.api.internal.tasks.compile.CompilationFailedException: échec de la compilation; voir la sortie d'erreur du compilateur pour plus de détails.

Le Gradle Build rapporte que vous devriez vérifier le compilateur Java Output.

Vérifiez la sortie et voyez quel nom de classe il cite dans la sortie qu'il ne peut pas résoudre.

symbol:  class <referenced_classname_here
location: class <parent_classname_here

Solution

Indiquez le nom de domaine complet partout où vous faites référence à la classe mentionnée comme le symbole non résolu.

Dans mon cas, je l'ai vu quand j'ai défini une classe interne qui étend une classe dans une bibliothèque que j'avais déclarée comme dépendance dans mon build.gradle.

P.S:

J'ai vu que la solution à ce problème a déjà été mentionnée comme commentaire à la question par le PO.

Je n'ai pas pu trouver cette question car il n'avait pas les bons mots clés pour google et il n'y avait pas non plus de solution acceptée qui a encore réduit sa visibilité.

Le résultat est UNE JOURNÉE COMPLÈTE GASPILLÉE, plusieurs mèches de cheveux arrachées avant que je ne réalise cette stupide solution hackish :(: (

J'ai tout essayé sous le soleil qui est lié à distance à la résolution des dépendances pour résoudre ce "problème de dépendance" qui n'a jamais été un problème avec ma base de code.

J'espère que l'équipe Gradle corrige ce problème dès que possible avant que plus de gens ne se pincent les cheveux.

Btw ... J'adore Gradle. :)

11
acthota

J'ajoute simplement à la base de connaissances, mais j'ai eu le même type de problème avec:

public static class GetNetworkInterfacesCallable implements Java.util.concurrent.Callable<Java.util.Set<Java.net.InetAddress>> {
    public GetNetworkInterfacesCallable(String networkPrefix) {
        this.networkPrefix=networkPrefix;
    }
    @Override public Set<InetAddress> call() throws Exception {
        Thread.currentThread().setName(getClass().getName());
        return null; //myInetAddresses(networkPrefix);
    }
    final String networkPrefix;
}

Utilisation des notes 2.9 et 2.10.

1
Ray Tayek

J'ai eu le même problème ici aujourd'hui. Si vous travaillez avec gradle, assurez-vous que votre classe est dans src/main/Java et non src/test/Java sinon votre IDE (par exemple Eclipse) dira que toutes les compilations trouveront, mais quand vous essayez de construire avec gradle, les classes de test ne sont pas incluses par défaut (et ça va!), donc elles ne seront pas compilées.

1
Vokail