首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当Scala类位于同一个项目中时,从Java实例化Scala类

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

Stack Overflow用户
提问于 2017-02-04 00:09:41
回答 2查看 307关注 0票数 0

我有一个项目:

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

假设HelloWorld.scala是这样的:

代码语言:javascript
复制
package pkg2
object HelloWorld extends App {
  println("Hello, world!")
}

如何从HelloWorld调用JHelloWorld:

代码语言:javascript
复制
package pkg1;
public class JHelloWorld {
    public static void main(String[] args) {
         //pkg2.HelloWorld.main(args);

    }
}

编译器抱怨pkg2不存在.

我是否需要将scala代码放在另一个模块(jar文件)中,然后从那里开始呢?

感谢您的输入,但在最后,这个教程确实有所帮助。

虽然我使用的是maven-scala-plugin,但我遇到了两个问题:

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

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

代码语言:javascript
复制
 <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>
EN

回答 2

Stack Overflow用户

发布于 2017-02-04 00:35:59

有几件事你应该检查一下。

首先,必须确保项目中有scala。如果您正在使用IntelliJ IDEA,那么一旦您进入scala文件,它就会警告您。

.iml应该有这样一个条目:

代码语言:javascript
复制
< orderEntry type="library" name="scala-sdk-2.11.7" level="application" />

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

代码语言:javascript
复制
< dependency>
    < artifactId>scala-library</artifactId>
    < groupId>org.scala-lang</groupId>
    < version>${scala.version}</version>
</dependency>

一旦确保您拥有scala,就应该在使用scala对象之前导入它:

pkg1

代码语言:javascript
复制
package pkg1

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

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

pkg2

代码语言:javascript
复制
package pkg2;

import pkg1.HelloWorld$;

public class JHelloWorld {
    HelloWorld$ scalaObject = HelloWorld$.MODULE$;

    public static void main(String argv[]) {
        new JHelloWorld().scalaObject.main(argv);
    }
}

以上各项应能正常工作。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-02-04 00:37:01

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

如果您正在使用SBT,则包含scala目录的目录结构已经是构建工具所期望的结构的一部分。如果您正在使用另一个构建工具,如Maven或Gradle,您可能希望安装相关插件(这里用于Maven,这里用于Gradle)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42034987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档