Scala 类文件与 Java 类文件

2022-09-04 21:47:05

假设我有这个Hello.scala。

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

我可以运行“scalac”来获得HelloWorld.class和HelloWorld$.class。我可以使用 'scala -classpath 运行。您好'。但是我不能运行'java -cp。您好'。

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

IntelliJ + scala plugin

我可以得到一个包含所有内容的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[]); }

清单。MF 具有以下设置。不要忘记包含 [CR] 或空行。

Main-Class: HelloWorld

我下载 proguard 4.5.1 以将其放入 ~/bin/proguard4.5.1 中。运行proguard,我可以制作罐子(主.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文件。而且,这里还有标量源代码。


答案 1

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

-classpath scala-library.jar:.

或通过添加

-Xbootclasspath/a:scala-library.jar

到 VM 参数。

加法:

对不起,没有看到最后一个问题。如果你想分发单个JAR文件,许多人使用ProGuard从scala库中提供所需的类.jar以及你的类放在一个jar中。

第二次编辑:

假设您有.class文件,并且您的文件夹包含一个名为类的文件夹中,您可以使用以下Proguard配置(在调整路径后,例如,您需要在Linux / Windows上而不是在Mac OS上)保存,例如:META-INFMANIFEST.MFrt.jarclasses.jaryour.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[]); }

现在,您可以使用main.jar

java -Xmx512m -jar proguard.jar @your.pro

最终,您必须将设置得更高一些。更多信息可以在SBT维基上找到。-Xmx


答案 2

推荐