Scala类文件与Java类文件

pro*_*eek 12 java scala distribution

假设我有这个Hello.scala.

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello, world!")
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以运行'scalac'来获取HelloWorld.class和HelloWorld $ .class.我可以使用'scala -classpath运行.你好'.但是我不能运行'java -cp.你好'.

  • 为什么是这样?scala不与Java互操作吗?
  • 有没有办法用Java运行scala的类?
  • 为什么scalac会生成两个类文件?
  • scala有类似'lein uber'的东西吗?我的意思是,scala是否有一些工具可以生成一个jar文件用于分发目的?

IntelliJ + scala插件

我可以得到一个包含所有内容的jar用IntelliJ + scala插件运行scala文件文件,我认为这是比proguard更好的选择.

程序设置

感谢Moritz,我可以制作一个用java运行的jar文件.这是整体结构.

|-- classes
|   |-- HelloWorld$.class
|   |-- HelloWorld.class
|   `-- META-INF
|       `-- MANIFEST.MF
`-- your.pro

your.pro具有以下内容.

-injar classes
-injar /Users/smcho/bin/scala/lib/scala-library.jar(!META-INF/MANIFEST.MF)
-outjar main.jar
-libraryjar /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Classes/classes.jar

-dontwarn
-dontnote
-ignorewarnings

-optimizationpasses 2
-optimizations !code/allocation/variable

-keep,allowoptimization,allowshrinking class * { *; }
-keepattributes SourceFile,LineNumberTable

-keepclasseswithmembers public class HelloWorld { public static void main(java.lang.String[]); }

MANIFEST.MF有以下设置.不要忘记包括[CR]或空白行.

Main-Class: HelloWorld

我下载了proguard 4.5.1,将它放在〜/ bin/proguard4.5.1中.运行proguard,我可以制作jar(main.jar),它工作正常.

prosseek:classes smcho$ java -Xmx512m -jar /Users/smcho/bin/proguard4.5.1/lib/proguard.jar @your.pro

ProGuard, version 4.5.1
Reading program directory [/Users/smcho/Desktop/scala/proguard/classes/classes]
Reading program jar [/Users/smcho/bin/scala/lib/scala-library.jar] (filtered)
Reading library jar [/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar]
Preparing output jar [/Users/smcho/Desktop/scala/proguard/classes/main.jar]
  Copying resources from program directory [/Users/smcho/Desktop/scala/proguard/classes/classes]
  Copying resources from program jar [/Users/smcho/bin/scala/lib/scala-library.jar] (filtered)
prosseek:classes smcho$ java -jar main.jar hello

要么

java -cp main.jar HelloWorld

我在这里上传了示例zip文件.而且,标量源代码在这里.

Mor*_*itz 12

您需要将Scala添加到类路径中,例如

-classpath scala-library.jar:.
Run Code Online (Sandbox Code Playgroud)

或者通过添加

-Xbootclasspath/a:scala-library.jar
Run Code Online (Sandbox Code Playgroud)

到VM参数.

加成:

对不起,没看到最后一个问题.如果你想分发单个JAR文件,许多人使用ProGuard将scala-library.jar所需的类与你的类一起发送到一个jar中.

第二编辑:

假设您的.class文件和META-INF包含MANIFEST.MF在名为classes的文件夹中的文件夹,您可以使用以下Proguard配置(在调整路径后,例如您需要rt.jar在Linux/Windows而不是classes.jarMac OS上)保存,例如your.pro:

-injar classes
-injar /opt/local/share/scala-2.8/lib/scala-library.jar(!META-INF/MANIFEST.MF)
-outjar main.jar
-libraryjar /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Classes/classes.jar

-dontwarn
-dontnote
-ignorewarnings

-optimizationpasses 2
-optimizations !code/allocation/variable

-keep,allowoptimization,allowshrinking class * { *; }
-keepattributes SourceFile,LineNumberTable

-keepclasseswithmembers public class your.Main { public static void main(java.lang.String[]); }
Run Code Online (Sandbox Code Playgroud)

现在你可以创建main.jar

java -Xmx512m -jar proguard.jar @your.pro
Run Code Online (Sandbox Code Playgroud)

最终你必须设置得-Xmx更高.可以在SBT Wiki上找到更多信息.