45

Can command java run a compiled scala code? If so, why do we have an exclusive command scala?

5 Answers 5

50

You can run byte code generated by Scala if you include all necessary runtime libs for Scala (scala-library.jar, scala-swing.jar ...) in the classpath. The scala command does this automatically, and supports Scala specific command line arguments.

Sign up to request clarification or add additional context in comments.

4 Comments

java -cp ./scala-reflect-2.11.8.jar:./scala-library-2.11.8.jar HelloWorld This did not work for me.
my hello world program is just this object HelloWorld { def main(args: Array[String]): Unit = { println("Hello, world!") } }
Thanks. What is "The scala command"? Is scala command the compiler?
@Tim scala is for running compiled code, the Scala compiler would be scalac
14

Yes, it can. Scala is compiled down to Java bytecode. But remember that it depends on the Scala runtime classes, so you need to still have Scala's jar files on the classpath.

If so, why do we have an exclusive command scala?

Convenience wrapper.

2 Comments

scala is an interpreter, while scalac is a compiler.. its not only for convenience but also a different technique.
You could start the compiler, too--it's just another class that needs to be run (scala.tools.nsc.Main, with appropriate arguments). But convenience is convenient, so why do it the hard way?
6

Scala is designed to integrate easily with applications that run on modern virtual machines, primarily the Java virtual machine (JVM). The main Scala compiler, scalac, generates Java class files that can be run on the JVM. -> http://www.artima.com/scalazine/articles/steps.html

As long as you have installed the scala runtime you should be fine: compile classes with scalac and run them with java.

Comments

4

Just want to add my own answer as additional value for the future readers:

scala, if run without parameter, will run an interactive shell

scala, if run with a text file name as parameter, will regard the file as a scala script

those two can't be done using java

1 Comment

Both of those can be done, but it is particularly annoying to do it--you have to call scala.tools.nsc.MainGenericRunner and make sure the appropriate tools are in the classpath. Why not just let the scala script do it for you?
3

If you look closely, the scala command is simply a bash helper-script which summarize to the below command:

$cat /usr/local/Cellar/[email protected]/2.11.12_1/libexec/bin/scala

execCommand \
  "${JAVACMD:=java}" \
  $JAVA_OPTS \
  "${java_args[@]}" \
  "${classpath_args[@]}" \
  -Dscala.home="$SCALA_HOME" \
  $OVERRIDE_USEJAVACP \
  "$EMACS_OPT" \
  $WINDOWS_OPT \
   scala.tools.nsc.MainGenericRunner  "$@"

There are 2 things required to run a .class file compiled using scalac ( the scala compiler) using the java command.

  1. We need to include the scala-library.jar and the location of the .class file in the classpath. To find the location of scala-library.jar, please execute the below:

    which scala /usr/local/opt/[email protected]/bin/scala

    In my case the scala-*.jar files are in : /usr/local/Cellar/[email protected]/2.11.12_1/idea/lib on Mac

  2. The location of the Main2.class file which is in /training/example1/scala.

So, to execute the program we could use the below command:

java -cp /usr/local/Cellar/[email protected]/2.11.12_1/idea/lib/scala-library.jar:/training/example1/scala/ Main2

EDIT-1: If you are using windows, please use semicolon(;) as the separator in java classpath command.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.