从jar包中提取scala源代码

8

我有一个包含Scala源代码的JAR文件,但我已经丢失了原始代码。有没有办法将JAR中的类文件转换为Scala函数和类,而不是编译器生成的Java类?

我已经尝试对其进行反编译,但它只给我提供了毫无意义的Java代码。

提前感谢您!


我有相同的问题。 - Gabber
2个回答

3

你需要一款特定于Scala语言的反编译器。虽然并没有无法编写的理由,但这需要大量的工作量,并且据我所知目前还没有人真正做到了。当然,它不会完全生成原始代码,就像其他语言的反编译器一样。


这在2018年仍然有效吗? - kaqqao
@kaqqao 是的,就我所知。 (除非现在编写反编译器会更加复杂,至少如果你想支持Scala 2.12和之前的版本。) - Alexey Romanov

2
Scala编译成JVM字节码,这与Java的编译目标相同。除非反编译器明确针对Scala,否则将其反编译为Java是有意义的。
为了补充Alexey Romanov回答中的信息,该回答仍然适用于Scala 2,我想补充一下,自从Scala 3(即Dotty,它的开发名称)以来,Scala首先编译成一个中间表示TASTy(它将编译后的类文件添加了类型化的抽象语法树信息--因此得名)。
您可以在 Scala Days 2019的这个有趣的演讲中看到关于TASTy及其在编译器管道中的作用的介绍。
正如演讲中提到的那样,Dotty本地提供了反编译编译输出(TASTy + classfiles)的可能性。
作为一个简单的实验,让我们考虑一个非常简单的程序,放在一个名为Main.scala的文件中:
object Main {

  def main(args: Array[String]): Unit = {
    println("hello, world")
  }

}

在其中运行dotc Main.scala将产生预期的输出(一个Main类的.class文件,一个Main对象的.class文件和一个.tasty文件),可以使用-decompile选项将其输入(反)编译器中,如下所示:
dotc -decompile Main

这个命令的输出如下:
/** Decompiled from ./Main.tasty */
@scala.annotation.internal.SourceFile("Main.scala") object Main {
  def main(args: scala.Array[scala.Predef.String]): scala.Unit = scala.Predef.println("hello, world")
}

您可以按照这里的说明开始使用Dotty,并执行与我相同的实验,该实验是在Dotty 0.27.0-RC1上运行的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接