假设我有这个Hello.scala。
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
我可以运行'scalac'来获取HelloWorld.class和HelloWorld $ .class。 我可以使用'scala -classpath运行。你好'。但是我不能运行'java -cp。你好”。
我可以使用IntelliJ + scala插件运行包含运行scala文件的所有内容的jar,我认为这是比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
答案 0 :(得分:12)
您需要将Scala添加到类路径中,例如
-classpath scala-library.jar:.
或添加
-Xbootclasspath/a:scala-library.jar
到VM参数。
添加:
抱歉,没看到最后一个问题。如果你想分发单个JAR文件,许多人使用ProGuard将scala-library.jar所需的类与你的类一起发送到一个jar中。
第二次修改:
假设您的.class文件和META-INF
文件夹包含MANIFEST.MF
在名为classes的文件夹中,您可以使用以下Proguard配置(在调整路径后,例如您需要{{1}在Linux / Windows而不是Mac OS上的rt.jar
上保存了例如作为classes.jar
:
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
设置得更高一些。可以在SBT Wiki上找到更多信息。