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