如何判断编译的.class文件的Scala版本是什么?

时间:2010-07-22 16:59:49

标签: scala version

如何判断编译的.class文件的Scala版本是什么?

4 个答案:

答案 0 :(得分:21)

我想根据来自Yohann Coppel的2008 "Reflecting Scala" rapport,在Martin Odersky教授的监督下,信息存储在.class文件的“pickled”部分。

  

在编译过程中(如图2所示),Scala编译器生成两种类型的数据。

     
      
  • 第一个是一些经典的Java字节码,可以由标准的Java虚拟机读取和执行。
  •   
  • 第二个是所谓的“Pickled data”,它代表了原始源文件的基本结构   此信息包含在.class文件中   Java字节码规范允许编译器“定义和发出包含类文件结构的属性表中的新属性的类文件”。如果JVM无法识别它们,则会默默忽略这些属性。
  •   

Pickelr

  

Scala编译器为Scala程序中的任何数据结构生成pickle数据,在pickler上下文中称为符号。
  符号以图3所示的格式线性存储。

http://img27.i_mageshack.us/img27/4042/scalapickledformat.png

  
      
  • 标签代表存储的数据类型
  •   
  • 然后长度给出以下数据块的长度。
  •   
  • 数据块可以包含多个信息,   例如符号的名称。
  •   
ScalaSig = "ScalaSig" Version Symtab
Version = Major_Nat Minor_Nat         <====
Symtab = numberOfEntries_Nat {Entry}
  

ScalaSig属性定义。
  可以在 scala.tools.nsc.symtab.PickleFormat 源文件(现在 scala.reflect.internal.pickling.PickleFormat )中找到更完整的定义。

您还可以在 scala.tools.nsc.util.ShowPickled 中查看如何阅读腌制数据。


This page显示一个脚本(未测试),它将显示pickle数据:

#!/bin/sh
#
# Shows the pickled scala data in a classfile.

if [ $# == 0 ] ; then
  echo "Usage: $0 [--bare] [-cp classpath] <class*>"
  exit 1
fi

TOOLSDIR=`dirname $0`
CPOF="$TOOLSDIR/cpof"

PACK="$TOOLSDIR/../build/pack/lib"
QUICK="$TOOLSDIR/../build/quick/classes"
STARR="$TOOLSDIR/../lib"
CP=""

if [ -f "${PACK}/scala-library.jar" ] ; then
  CP=`${TOOLSDIR}/packcp`
elif [ -d "${QUICK}/library" ] ; then
  CP=`${TOOLSDIR}/quickcp`
else
  CP=`${TOOLSDIR}/starrcp`
fi

if [ "$1" == "-cp" ] ; then
  shift
  CP="${1}:${CP}"
  shift
fi

java -cp "$CP" scala.tools.nsc.util.ShowPickled $*

答案 1 :(得分:7)

答案 2 :(得分:3)

最有可能你可以解析.class文件,并从scala编译器附加的属性中读取版本到类文件。

要了解有关此类属性存在的更多信息,您可以从scala编译器(http://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala)的源代码开始。

要了解如何解析您可能在规范(http://jcp.org/aboutJava/communityprocess/final/jsr202/index.html)中阅读的.class文件。

我在此处发布的示例代码(Java Illegal class modifiers Exception code 0x209)也可能有助于实现。

答案 3 :(得分:1)

FWIW,这是VonC脚本的一个版本,它将类路径设置为scala-library.jar和scala-compiler.jar

使用scala 2.11.8和2.12.1在cygwin和linux下测试, 应该在OSX下工作。 然而,似乎并不喜欢--bare争论。

(要求scala在你的PATH中。)

color red
make Chevrolet
model Camaro
year 1967
options [ 'hard top', 'power windows', 'racing stripe', 'fog lights' ]