Scala import not working - object <name> is not a member of package, sbt preppends current package namespace in imports
ScalaScala Problem Overview
I have an issue when trying to import in scala. The object Database
exists under com.me.project.database
but when I try to import it:
import com.me.project.database.Database
I get the error:
object Database is not a member of package com.me.project.controllers.com.me.project.database
Any ideas what the problem is?
Edit:
It is worth mentioning that the import is in the file Application.scala under the package com.me.project.controllers
, I can't figure out why it would append the import to the current package though, weird...
Edit 2:
So using:
import _root_.com.me.project.database.Database
Does work as mentioned below. But should it work without the _root_
? The comments so far seem to indicate that it should.
Answer:
So it turns out that I just needed to clean the project for the import to work properly, using both:
import _root_.com.me.project.database.Database
import com.me.project.database.Database
are valid solutions. Eclipse had just gotten confused.
Scala Solutions
Solution 1 - Scala
imports can be relative. Is that the only import you have? be careful with other imports like
import com.me
ultimately, this should fix it, then you can try to find more about it:
import _root_.com.me.project.database.Database
Solution 2 - Scala
In my case I also needed to check that object which is not found as a member of package is compiled successfully.
Solution 3 - Scala
In my case I had to run sbt clean
.
Solution 4 - Scala
I realize this question already has an accepted answer, but since I experienced the same problem but with a different cause I figured I'd add an answer.
I had a bunch of interdependent projects which suddenly needed a root import in order to compile. It turned out that I had duplicated the package declaration in a single file. This caused some kind of chain reaction and made it very hard to find the source of the problem.
In summary I had
package foo.bar
package foo.bar
on the top of the file instead of just
package foo.bar
Hope this saves someone some really tedious error hunting.
Solution 5 - Scala
I had faced similar issue where IntelliJ showed error on importing one file from the same project.
What did not resolve the issue in my case:
- adding
_root_
in import statement - sbt clean
- restarting machine
What actually resolved the issue:
- main menu => select File => click on Invalidate Caches / Restart => pop-up dailog => click on invalidate the caches and restart.
I was using IDEA (2019.2.2 Ultimate Edition) on macOs mojave 10.14.6
Solution 6 - Scala
Java -> Scala conversion without cleaning
Don't forget to clean if you convert some file in a project from Java to Scala. I had a continuous integration build running where I couldn't get things to work, even though the build was working locally, after I had converted a Java class into a Scala object. Solution: add 'clean' to the build procedure on the CI server. The name of the generated .class file in Scala is slightly different than for a Java class, I believe, so this is very likely what was causing the issue.
Solution 7 - Scala
If you are using gradle
as your build tool, then ensure that jar
task is not disabled.
I had multiple modules in my project, where one module was dependent on a few other modules. However, I had disabled jar
task in build.gradle
:
enabled = false
}
That caused it to fail to resolve classes in the dependent modules and fail with the above error.
Solution 8 - Scala
I will share my story, just in case it may help someone.
Scenario: intellij compilation succeeds, but gradle build fails on import com.foo.Bar
, where Bar
is a scala class.
TLDR reason: Bar
was located under src/main/java/...
as opposed to src/main/scala/...
Actual reason: Bar
was not being compiled by compileScala
gradle task (from gradle scala plugin) because it looks for scala sources only under src/<sourceSet>/scala
.
From docs.gradle.org: > All the Scala source directories can contain Scala and Java code. The > Java source directories may only contain Java source code.
Hope this helps
Solution 9 - Scala
I had a similar problem but none of the solutions here worked for me. What did work however was a simple restart of my machine.
Perhaps it was something with my Intellij but after a quick restart, everything seems to be working fine.
Solution 10 - Scala
I had a similar situation, which was failing in both IntelliJ and maven on the command line. I went to apply the suggested temp fix (adding _root_
) but intellij was glitching so bad that wasn't even possible.
Eventually I noticed that I had mis-created a package so that it repeated the whole path of the package. That meant that the directory my class was in had a subfolder called "com", and the start of my file looked like:
package com.mycompany.mydept.myproject.myfunctionality.sub1
import com.holdenkarau.spark.testing.DataFrameSuiteBase
where I had another package called com.mycompany.mydept.myproject.myfunctionality.sub1.com.mycompany.mydept.myproject.myfunctionality.sub2
And the compiler was looking for "holdenkarau" under com.mycompany.mydept.myproject.myfunctionality.com and failing.
Solution 11 - Scala
I had this issue while using Intellij and the built-in sbt shell (precisely, I was trying to run the command console, which invokes a compiler check of the code).
In my case, after trying the other suggested solutions on this thread, I found that I could restart the sbt shell and it would go away. There's a button on the left-hand side of a looped green arrow and a small grey square which does this in one click (obviously, this is subject to Jet Brains not changing the design of the IDE!!!).
I hope this helps some people get past this issue quickly.
Solution 12 - Scala
In my case, In Intellij, Just renaming the package file to something else >> see if it updates the import statements >> run the code >> then renaming back to the original name worked.