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

从Java实例化Scala类(当两者位于同一项目中时),java,scala,maven,Java,Scala,Maven,我有一个项目: 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 {

我有一个项目:

  • 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插件
,但我有两个问题:

  • 我没有为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>
< orderEntry type="library" name="scala-sdk-2.11.7" level="application" />
< dependency>
    < artifactId>scala-library</artifactId>
    < groupId>org.scala-lang</groupId>
    < version>${scala.version}</version>
</dependency>

src/main/scala
org.scala-tools
maven scala插件
2.15.2
scala先编译
过程资源
编译
scala测试编译
过程测试资源
测试编译

有几件事你应该检查一下

首先,必须确保项目中存在scala sdk。如果您正在使用IntelliJ IDEA,只要转到scala文件,它就会警告您

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

 <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>
< orderEntry type="library" name="scala-sdk-2.11.7" level="application" />
< dependency>
    < artifactId>scala-library</artifactId>
    < groupId>org.scala-lang</groupId>
    < version>${scala.version}</version>
</dependency>
另外,不要忘记main方法应该使用
newjhelloworld()实例化类

pkg2

上述方法应该可以很好地发挥作用

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

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

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


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

看看这个。我想这也是同样的问题。你能发布你的maven POM吗?安装发生在哪里,在当前代码中没有
new
。只要我没有在java代码中引用scala代码,我的项目构建就可以了。当我检查jar文件时,我看到scala类和java类。但由于某些原因,我无法将该类导入java类