当两者位于同一项目中时,从 Java 实例化 Scala 类



我有一个项目:

  • src/main/java/pkg2/JHelloWorld.java
  • src/main/scala/pkg1/HelloWorld.scala

假设HelloWorld.scala是这样的:

package pkg2
object HelloWorld extends App {
  println("Hello, world!")
}

如何从 JHelloWorld 调用 HelloWorld:

package pkg1;
public class JHelloWorld {
    public static void main(String[] args) {
         //pkg2.HelloWorld.main(args);
    }
}

编译器抱怨 pkg2 不存在...

我是否需要将 scala 代码放在不同的模块(jar 文件(中并从那里开始?


感谢您的输入,但最后本教程确实有帮助。

虽然我正在使用maven-scala-plugin但我有两个问题:

  • 我没有为 scala 设置源目录
  • 我没有先构建 scala 代码

现在我的pom看起来像这样:

 <build>
    <sourceDirectory>src/main/scala</sourceDirectory>
    <plugins>
        <plugin>
            <groupId>org.scala-tools</groupId>
            <artifactId>maven-scala-plugin</artifactId>
            <version>2.15.2</version>
            <executions>
                <!-- Run scala compiler in the process-resources phase, so that dependencies 
                    on scala classes can be resolved later in the (Java) compile phase -->
                <execution>
                    <id>scala-compile-first</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                <!-- Run scala compiler in the process-test-resources phase, so that 
                    dependencies on scala classes can be resolved later in the (Java) test-compile 
                    phase -->
                <execution>
                    <id>scala-test-compile</id>
                    <phase>process-test-resources</phase>
                    <goals>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

重要的是,当你运行Java编译器时,Scala编译器生成的类文件在类路径中可用。

如果您使用的是 SBT,则包含scala目录的目录结构已经是构建工具预期结构的一部分。如果您使用的是其他构建工具,例如 Maven 或 Gradle,您可能需要安装相关的插件(此处为 Maven,此处为 Gradle(。

如果不使用构建工具,则必须手动调整类路径。

您应该检查一些事项。

首先,您必须确保项目中存在 scala sdk。如果你使用的是IntelliJ IDEA,只要你进入scala文件,它就会警告你。

.iml 应该有这样的条目:

< orderEntry type="library" name="scala-sdk-2.11.7" level="application" />

如果使用 maven,则应添加如下条目:

< dependency>
    < artifactId>scala-library</artifactId>
    < groupId>org.scala-lang</groupId>
    < version>${scala.version}</version>
</dependency>

一旦你确定你拥有 scala sdk,你应该在使用之前导入 scala 对象:

pkg1

package pkg1
object HelloWorld extends App {
    println("Hello, world!")
}

另外,不要忘记 main 方法应该使用 new JHelloWorld() 来实例化类

pkg2

package pkg2;
import pkg1.HelloWorld$;
public class JHelloWorld {
    HelloWorld$ scalaObject = HelloWorld$.MODULE$;
    public static void main(String argv[]) {
        new JHelloWorld().scalaObject.main(argv);
    }
}

以上应该可以正常工作

Connected to the target VM, address: '127.0.0.1:46179', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:46179', transport: 'socket'
Hello, world!
Process finished with exit code 0

最新更新