2017-02-04 32 views
0

我有一个项目:实例化斯卡拉类从Java的时候都是在同一个项目

  • 的src/main/JAVA/pkg2的/ JHelloWorld.java
  • 的src/main /斯卡拉/的pkg1/HelloWorld的。斯卡拉

比方说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文件),并从那里走?


感谢您的输入,但最终这tutorial真的帮助。

虽然我用的是maven-scala-plugin我有两个问题:

  • 我没有设置源目录斯卡拉
  • 我并没有建立Scala代码第一

现在我的聚甲醛看起来像这样:

<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> 
+0

选中此问题[答案](http://stackoverflow.com/a/12284158/1361560)。我想这是同样的问题 – brunofitas

+0

你可以发布你的maven POM吗? –

+1

instatiation在哪里发生,在当前代码中没有'new'。 – pedrofurla

回答

0

有几件事你应该检查。

首先,您必须确保您的项目中包含scala sdk。如果您使用的是IntelliJ IDEA,只要您转到Scala文件,它就会警告您。

的.iml应该有一个这样的条目:一旦你确保你有斯卡拉

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

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

如果你使用Maven的时候,你应该添加一个条目是这样SDK,你应该使用它之前导入Scala的对象:

的pkg1

package pkg1 

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

另外,不要忘记,主要方法应该实例化类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 
+0

只要我没有在java代码中引用scala代码,我的项目就没有问题。当我检查jar文件时,我看到了scala类和java类。但由于某种原因,我无法将该类导入到我的java类中 – hba

0

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

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

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