J'ai un problème lorsque j'essaie d'importer dans Scala. L'objet Database
existe sous com.me.project.database
mais lorsque j'essaie de l'importer:
import com.me.project.database.Database
Je reçois l'erreur:
object Database is not a member of package com.me.project.controllers.com.me.project.database
Des idées, quel est le problème?
Modifier :
Il est à noter que l'importation se trouve dans le fichier Application.scala sous le package com.me.project.controllers
, je ne vois pas pourquoi il ajouterait l'importation au package actuel, bizarre ...
Modifier 2 :
Donc en utilisant:
import _root_.com.me.project.database.Database
Ne fonctionne comme mentionné ci-dessous. Mais cela devrait-il fonctionner sans le _root_
? Les commentaires à ce jour semblent indiquer que ce devrait être le cas.
Réponse :
Il s’est donc avéré que je devais simplement nettoyer le projet pour que l’importation fonctionne correctement, en utilisant à la fois:
import _root_.com.me.project.database.Database
import com.me.project.database.Database
sont des solutions valables. Eclipse venait juste de se perdre.
les importations peuvent être relatives. Est-ce la seule importation que vous ayez? soyez prudent avec d'autres importations comme
import com.me
en fin de compte, cela devrait résoudre le problème, alors vous pouvez essayer d'en savoir plus
import _root_.com.me.project.database.Database
Dans mon cas, je devais également vérifier que l'objet qui n'est pas trouvé en tant que membre du package est correctement compilé.
Dans mon cas, je devais exécuter sbt clean
.
Je me rends compte que cette question a déjà une réponse acceptée, mais depuis que j'ai connu le même problème mais avec une cause différente, j'ai pensé que j'ajouterais une réponse.
J'ai eu un tas de projets interdépendants qui ont soudainement besoin d'une importation racine pour pouvoir les compiler. Il est apparu que j'avais dupliqué la déclaration de package dans un seul fichier. Cela a provoqué une sorte de réaction en chaîne et a rendu très difficile la recherche de la source du problème.
En résumé j'avais
package foo.bar
package foo.bar
sur le haut du fichier au lieu de simplement
package foo.bar
J'espère que cela épargnera à quelqu'un une chasse aux erreurs vraiment fastidieuse.
Je partagerai mon histoire, au cas où cela pourrait aider quelqu'un.
Scénario: La compilation intellij réussit, mais la construction de gradle échoue avec import com.foo.Bar
, où Bar
est une classe scala.
Raison TLDR: Bar
était situé sous src/main/Java/...
par opposition à src/main/scala/...
Raison réelle: Bar
n'était pas compilé par compileScala
gradle tâche (à partir du plugin gradle scala) car elle recherche les sources scala uniquement sous src/<sourceSet>/scala
.
De docs.gradle.org :
Tous les répertoires sources Scala peuvent contenir du code Scala et Java. Le Les répertoires sources Java peuvent uniquement contenir du code source Java.
J'espère que cela t'aides
Si vous utilisez gradle
comme outil de génération, assurez-vous que la tâche jar
n'est pas désactivée.
J'ai eu plusieurs modules dans mon projet, où un module dépendait de quelques autres modules. Cependant, j'avais désactivé la tâche jar
dans build.gradle
:
jar {
enabled = false
}
Cela a entraîné l'échec de la résolution des classes dans les modules dépendants et l'échec de l'erreur ci-dessus.
Java -> Conversion Scala sans nettoyage
N'oubliez pas de nettoyer si vous convertissez un fichier dans un projet de Java à Scala. J'avais une construction d'intégration continue en cours d'exécution où je ne pouvais pas faire fonctionner les choses, même si la construction fonctionnait localement, après avoir converti une classe Java en objet Scala. Solution: ajoutez 'clean' à la procédure de construction sur le serveur CI. Le nom du fichier .class généré dans Scala est légèrement différent de celui d'une classe Java, je crois, c'est donc très probablement ce qui était à l'origine du problème.
J'ai eu une situation similaire, qui échouait à la fois dans IntelliJ et maven sur la ligne de commande. Je suis allé appliquer le correctif temporaire suggéré (en ajoutant _root_
) mais intellij était si embêtant que ce n'était même pas possible.
Finalement, j'ai remarqué que j'avais mal créé un paquet afin qu'il répète le chemin complet du paquet. Cela signifiait que le répertoire dans lequel ma classe se trouvait avait un sous-dossier appelé "com", et le début de mon fichier ressemblait à:
package com.mycompany.mydept.myproject.myfunctionality.sub1
import com.holdenkarau.spark.testing.DataFrameSuiteBase
où j'avais un autre paquet appelé com.mycompany.mydept.myproject.myfunctionality.sub1.com.mycompany.mydept.myproject.myfunctionality.sub2
Et le compilateur recherchait "holdenkarau" sous com.mycompany.mydept.myproject.myfunctionality.com et échouait.