gpt4 book ai didi

java - Scala 类文件与 Java 类文件

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:30 25 4
gpt4 key购买 nike

假设我有这个 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 插件

我可以获得一个 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.proProGuard, version 4.5.1Reading 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 .

最佳答案

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

-classpath scala-library.jar:.

或通过添加

-Xbootclasspath/a:scala-library.jar

到 VM 参数。

添加:

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

第二次编辑:

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

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

关于java - Scala 类文件与 Java 类文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3366545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com