代码之家  ›  专栏  ›  技术社区  ›  prosseek

Scala类文件与Java类文件

  •  12
  • prosseek  · 技术社区  · 14 年前

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

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

    • 有没有办法用Java运行scala的类?
    • 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
    

    您的.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[]); }
    

    Main-Class: HelloWorld
    
    

    运行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文件 here . 标量源代码 here .

    1 回复  |  直到 10 年前
        1
  •  12
  •   Moritz    14 年前

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

    -classpath scala-library.jar:.
    

    或者通过添加

    -Xbootclasspath/a:scala-library.jar
    

    到VM参数。

    抱歉,没有看到最后一个问题。如果您想分发许多人使用的单个JAR文件 ProGuard 从scala-library.jar将所需的类与您的类一起放在一个jar中。

    假设你有你的.class文件和 META-INF MANIFEST.MF 在名为classes的文件夹中,您可以使用以下Proguard配置(在调整路径之后,例如,您需要 rt.jar 在Linux/Windows上而不是 classes.jar 在Mac 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[]); }
    

    现在您可以创建 main.jar 具有

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

    -Xmx SBT Wiki .