2017-10-03 3 views
0

J'ai un projet écrit en Java, Scala et Kotlin.La construction de la gravure a échoué avec Kotlin, Scala et Java

Mais quand je construis ce projet Gradle, il erreur avec le message:

11:19:51: Executing task 'build'... 

:compileKotlin 
Using Kotlin incremental compilation 
e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (3, 19):    
Unresolved reference: Flag 
e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (10, 18):  
Unresolved reference: GroupMessageResponder 
e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (13, 2): 
'doPost' overrides nothing 
e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (35, 23): 
Unresolved reference: Flag 
e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (38, 2): 
'getHelpMessage' overrides nothing 
e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (40, 2): 
'getKeyWordRegex' overrides nothing 
e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (42, 2): 
'instance' overrides nothing 
:compileKotlin FAILED 

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':compileKotlin'. 
> Compilation error. See log for more details 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or -- 
debug option to get more log output. 

BUILD FAILED in 1s 
1 actionable task: 1 executed 
Compilation error. See log for more details 
11:19:53: Task execution finished 'build'. 

Ces erreurs sont tout au sujet de « référence non résolue » et les « référence » sont toutes écrites en Scala ou Java.

Mais exécutez ce projet dans IDEA fonctionne très bien.

Je pensais que cela était dû au fait que Gradle compilait Kotlin en premier, ce qui devrait être compilé en dernier, donc ces 'références' ne pouvaient pas être trouvées.

Et voici mon build.gradle: build.gradle

MISE À JOUR:

Une partie de la production de gradle clean testClasses --info:

...SKIP... 
> Task :compileKotlin 
Using Kotlin incremental compilation 

e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (3, 19): 
Unresolved reference: Flag 
e: F:\Code\Project\Avalon\src\main\kotlin\avalon\group\Execute.kt: (11, 18): 
Unresolved reference: GroupMessageResponder 
...SKIP.... 

> Task :compileKotlin 
[KOTLIN] deleting F:\Code\Project\Avalon\build\classes\kotlin\main on error 
[KOTLIN] deleting F:\Code\Project\Avalon\build\classes\kotlin\main on error 

:compileKotlin (Thread[Task worker Thread 3,5,main]) completed. Took 15.981 secs. 

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':compileKotlin'. 
> Compilation error. See log for more details 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --debug option 
to get more log output. 

BUILD FAILED in 24s 
2 actionable tasks: 2 executed 
Stopped 0 worker daemon(s). 

sortie complète postéhere.

+0

Vous devez faire attention lorsque vous utilisez plus d'un langage JVM non-Java. De quelle classe est 'Reference non resolue: Flag' de? Est-ce 'scala'? Pouvez-vous exécuter './gradlew clean testClasses --info' et afficher la sortie – guenhter

+0

@guenhter Cette erreur s'est produite lorsque' Kotlin' fait référence à 'Scala', lors de l'exécution' gradle build'. Et la sortie de 'gradle clean testClasses --info' maintenant affiché ... –

+0

Pouvez-vous s'il vous plaît poster plus de la sortie. Le meilleur serait du haut. J'ai une idée du problème, mais j'ai besoin de plus de journaux. – guenhter

Répondre

1

Le problème que vous avez sont les différentes langues.

Certains Kotlin et Java

Supposons que vous viennent Kotlin et java. Que vous pouvez accéder à partir (-> signifie A accès des classes de B)

kotlin -> java 
java -> kotlin 

La raison pour laquelle vous pouvez le faire, est parce que lors de la compilation (compileKotlin) Kotlin prendre soin de cette crossCompilation/jointCompilation/quel que soit-autre-nom entre ces deux langues.


Kotlin et Scala (une direction)

Mais si vous avez le cas:

kotlin -> scala 

que vous devez considérer le comme suit: quand compileKotlin fonctionne, il compile tous .java et .kt fichiers à class fichiers, mais non des fichiers .scala (parce qu'il ne sait rien sur scala). Lorsque vous accédez maintenant aux classes scala à partir de kotlin, vous devez d'abord compiler ces classes .scala pour vous assurer que le processus de compilation compileKotlin trouve ces fichiers .class pour une compilation réussie.

Vous pouvez définir que scala doit être exécuté avant kotlin, par exemple.

compileKotlin.dependsOn compileScala 

Kotlin et Scala (les deux directions)

donc bien jusqu'à présent, mais le problème est, quand vous avez

kotlin -> scala 
scala -> kotlin 

Parce que ce scénario ne fonctionne pas.

Vous devez d'abord compiler les classes scala pour compiler avec succès les classes kotlin (voir description ci-dessus). Mais d'un autre côté, vous devez compiler les classes kotlin pour compiler avec succès les classes scala. C'est un problème.

La solution serait que l'un des langages permette jointCompilation pour toutes les langues (mais cela n'arrivera jamais).

Donc pour deux langages JVM, où les deux ne sont pas Java, vous devez décider dans quel sens d'accès est autorisé. Mais vous ne pouvez pas autoriser les deux directions d'accès.

Dans de tels cas, il est souvent utile de placer la logique dans une classe java et d'accéder à cette classe java au lieu de la classe java. scala classe.

Le problème est également le même pour, par exemple, groovy, java et un autre langage jvm, comme dans la publication https://discuss.gradle.org/t/kotlin-groovy-and-java-compilation/14903/10

+0

Un grand merci d'abord. Mais existe-t-il d'autres solutions? Juste pour m'assurer que je dois réécrire tout le code Scala, et que ce projet pourrait compiler et fonctionner dans IDEA ** normalement **. –

+0

J'ai eu le même problème dans mon ancienne compagnie avec 'groovy' et' scala'. Cela fonctionne dans l'IDE (pas sûr pourquoi, IntellJ est un logiciel magique de toute façon) mais avec gradle il est absolument déterministe et raisonnable pourquoi cela ne peut pas fonctionner (sauf si nous avons un super compilateur qui permet de compiler tous les langages JVM) – guenhter

+0

J'avais fini de réécrire et cela aide certainement, merci beaucoup. –